尝试用VHDL显示8位LFSR的一个周期

时间:2014-07-29 13:45:50

标签: vhdl fpga

我试图做一个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;

感谢您的帮助。

1 个答案:

答案 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;