我试图做一个VHDL代码,目标是制作一个8位LFSR并显示所有随机状态,并且在一个周期后(当最后一个状态是相同的种子值时)它停止。但是我有一个问题,一直说:"循环必须在10,000次迭代中终止"。我使用的是Quartus II-Altera。
代码:
entity lfsr_8bit is
--generic ( n : integer := 2**8 );
port (
clk : in bit;
rst : in bit;
lfsr : out bit_vector(7 downto 0)
);
end lfsr_8bit;
architecture behaviour of lfsr_8bit is
--signal i : integer := 0;
--signal seed : bit_vector(7 downto 0) := "10000000";
signal rand : bit_vector(7 downto 0);
begin
ciclo : process (clk,rst)
begin
loop
if (rst='0') then
rand <= "10000000";
elsif (clk'event and clk='1') then
rand(0) <= rand(6) xor rand(7);
rand(7 downto 1) <= rand(6 downto 0);
end if;
-- wait until rand = "10000000" for 100 ns;
exit when rand = "10000000";
-- case rand is
-- when "10000000" => EXIT;
-- when others => NULL;
-- end case;
-- i <= i +1;
end loop;
lfsr <= rand(7 downto 0);
end process ciclo;
end behaviour;
感谢您的帮助。
答案 0 :(得分:1)
摆脱那个循环,那个循环不像你想象的那样工作!不要像软件设计师一样思考,像硬件设计师那样思考。硬件中的循环用于复制逻辑。所以你的循环实际上是在尝试生成10,000个LFSR!
我不相信你需要在那里使用那个循环。如果你删除它,你的LFSR应该按预期工作。您可能需要添加一个控制信号来启用/禁用LFSR,但绝对不要使用循环。
这里有一些示例代码证明了这一点。将rand的默认值更改为其他值,否则LFSR将永远不会运行!它会立即设置lfsr_done信号。
ciclo : process (clk,rst)
begin
if (rst='0') then
rand <= "10000000"; -- SET THIS TO SOMETHING DIFFERENT
lfsr_done <= '0';
elsif (clk'event and clk='1') then
if rand = "10000000" then
lfsr_done <= '1';
end if;
if lfsr_done = '0' then
rand(0) <= rand(6) xor rand(7);
rand(7 downto 1) <= rand(6 downto 0);
end if;
end if;