我用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板进行了编译。 任何人都可以看到为什么它不起作用(在实践中,模拟是正常的)并解释我需要改变什么才能使它工作?
答案 0 :(得分:0)
如果reset
直接来自FPGA引脚,则可能未同步
使用clk
,因此无法确保正确的同步复位操作。
添加两个触发器,以便在reset
与clk
同步之前使用它
这个过程。这可以通过以下方式完成:
...
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