entity yiweileijia is
port(data_in:in std_logic_vector(16 downto 1);
en_shiftadder,rst_n,sys_clk:in std_logic;
adder_test:out std_logic_vector(26 downto 1);
fir_out:out std_logic_vector(10 downto 0));
end yiweileijia;
architecture Behavioral of yiweileijia is
signal shiftadder_tmp_test:std_logic_vector(26 downto 1);
signal cnt:integer range 0 to 11;
begin
tb1:process(rst_n,en_shiftadder,sys_clk)
begin
if sys_clk'event and sys_clk='1' then
if rst_n='0' or en_shiftadder='0' then
cnt<=0;
else
cnt<=cnt+1;
if cnt=10 then
cnt<=0;
end if;
end if;
end if;
end process;
tb2:process(rst_n,en_shiftadder,sys_clk,shiftadder_tmp_test)
variable a:std_logic_vector(16 downto 1);
variable c:std_logic_vector(9 downto 1);
variable shiftadder_tmp:std_logic_vector(26 downto 1);
begin
if sys_clk'event and sys_clk='1' then
if rst_n='0' then
fir_out<=(others=>'0');
shiftadder_tmp:=(others=>'0');
else
if en_shiftadder='0' then
shiftadder_tmp:=(others=>'0');
adder_test<=shiftadder_tmp;
else
if cnt=10 then
shiftadder_tmp(26 downto 11):=shiftadder_tmp(26 downto 11)-data_in;
fir_out<=shiftadder_tmp(26 downto 17)+"1000000000";
shiftadder_tmp:=(others=>'0');
adder_test<=shiftadder_tmp;
elsif(data_in(16) xor shiftadder_tmp(26))='1' then
c:=shiftadder_tmp(10 downto 2);
shiftadder_tmp(25 downto 10):=shiftadder_tmp(26 downto 11)+data_in;
shiftadder_tmp(9 downto 1):=c;
shiftadder_tmp(26):=shiftadder_tmp(25);
adder_test<=shiftadder_tmp;
elsif data_in(16)='1' and shiftadder_tmp(26)='1' then
a:=shiftadder_tmp(26 downto 11)+data_in;
c:=shiftadder_tmp(10 downto 2);
shiftadder_tmp(26):='1';
shiftadder_tmp(25 downto 10):=a;
shiftadder_tmp(9 downto 1):=c;
adder_test<=shiftadder_tmp;
elsif data_in(16)='0' and shiftadder_tmp(26)='0' then
a:=shiftadder_tmp(26 downto 11)+data_in;
c:=shiftadder_tmp(10 downto 2);
shiftadder_tmp(26):='1';
shiftadder_tmp(25 downto 10):=a;
shiftadder_tmp(9 downto 1):=c;
adder_test<=shiftadder_tmp;
end if;
end if;
end if;
end if;
end process;
end Behavioral;
这段代码是如何实现移位累加的啊?第二个进程里面的特别是if cnt=10 之后的代码有点看不太明白,求高手解释,谢谢