VHDL中的LFSR始终为零

时间:2014-05-21 04:36:31

标签: vhdl modelsim

我用VHDL写了一个LFSR。我已经在模拟中对它进行了测试,它按预期工作(生成1到512之间的随机整数)。但是,当我把它放到硬件上时,它总是生成" 000000000"

代码如下:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity LFSR is
    port(clk, reset : in bit;
         random     : out std_logic_vector (8 downto 0));
end entity LFSR;

architecture behaviour of LFSR is
    signal temp : std_logic_vector (8 downto 0) := (8 => '1', others => '0');
begin

    process(clk)
    begin
        if(clk'event and clk='1') then
            if(reset='0') then --reset on signal high, carry out normal function
                temp(0) <= temp(8);
                temp(1) <= temp(0);
                temp(2) <= temp(1) XOR temp(8);
                temp(3) <= temp(2) XOR temp(8);
                temp(4) <= temp(3) XOR temp(8);
                temp(8 downto 5) <= temp(7 downto 4);
            else
                --RESET
                temp <= "100000000";
            end if;
        end if;
        random <= temp;
    end process;

end architecture behaviour;

在Modelsim中进行了测试,并在Quartus II中针对Cyclone III DE0板进行了编译。 任何人都可以看到为什么它不起作用(在实践中,模拟是正常的)并解释我需要改变什么才能使它工作?

2 个答案:

答案 0 :(得分:0)

如果reset直接来自FPGA引脚,则可能未同步 使用clk,因此无法确保正确的同步复位操作。

添加两个触发器,以便在resetclk同步之前使用它 这个过程。这可以通过以下方式完成:

...
    signal reset_meta : bit;  -- Meta-stable flip-flop
    signal reset_sync : bit;  -- Synchronized reset

begin

    process(clk)
    begin
        if(clk'event and clk='1') then
            reset_meta <= reset;
            reset_sync <= reset_meta;
            if (reset_sync = '0') then  -- Normal operation
...

Altera在External Reset Should be Correctly Synchronized中对此有一些评论。 该描述涵盖了具有异步复位的触发器,但使用了两个 用于同步外部复位的触发器同样适用于您的情况。

仍然记得像大卫指出的那样在random <= temp内移动if 进行。

答案 1 :(得分:-1)

如果运气不好,可以查看合成原理图或进行合成后仿真。如果在行为模拟中有一些不明显的东西,我偶尔会将RTL模型换成后合成模型进行验证。 -Jerry