我使用modelsim来使用下面的代码模拟伪随机模式生成器。问题是当我强制data_reg信号为种子值(例如:0001010101101111)时,data_out显示相同的值而不是随机值。我真的很感激我对这个问题的任何帮助。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity dff is
Port ( CLK : in std_logic;
RSTn : in std_logic;
D : in std_logic;
Q : out std_logic);
end dff;
architecture Behavioral of dff is
begin
process(CLK)
begin
if CLK'event and CLK='1' then
if RSTn='1' then
Q <= '1';
else
Q <= D;
end if;
end if;
end process;
end Behavioral;
使用LFSR的PRBS生成器的VHDL代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity lfsr is
Port ( CLK : in STD_LOGIC;
RSTn : in STD_LOGIC;
data_out : out STD_LOGIC_VECTOR (15 downto 0));
end lfsr;
architecture Behavioral of lfsr is
component dff
Port ( CLK : in std_logic;
RSTn : in std_logic;
D : in std_logic;
Q : out std_logic);
end component;
signal data_reg : std_logic_vector(15 downto 0);
signal tap_data : std_logic;
begin
process(CLK)
begin
tap_data <= (data_reg(1) xor data_reg(2)) xor (data_reg(4) xor
data_reg(15));
end process;
stage0: dff
port map(CLK, RSTn, tap_data, data_reg(0));
g0:for i in 0 to 14 generate
stageN: dff
port map(CLK, RSTn, data_reg(i), data_reg(i+1));
end generate;
data_out <= data_reg after 3 ns;
end Behavioral;
答案 0 :(得分:1)
首先关闭。在你的LFSR中,你有一个对CLK敏感的过程,它应该只是组合:
process(CLK) -- Not correct
-- Change to the following (or "all" in VHDL-2008)
process(data_reg)
您也可以将其作为正式流程之外的连续分配来实现,在这种情况下功能相同。
当您强制data_reg
某个值时,您将覆盖设计中实例化的正常信号驱动程序。在GUI中,force命令默认为&#34; Freeze&#34;。一旦到位,驱动程序无法更新data_reg
,因为冻结力占据主导地位,直到您取消它为止。在强制对话框中选择&#34;存款&#34;善待改变状态而不会在后续时钟上覆盖驱动程序。
Modelsim文档对此有不同的力量类型:
冻结 - 将项目冻结在指定的值,直到再次强制或直到用noforce命令取消强制为止。
drive - 将驱动程序附加到项目并驱动指定的值,直到再次强制该项目或使用noforce命令取消强制该项目为止。对于未解决的信号,此选项是非法的。
deposit - 将项目设置为指定值。该值保持不变,直到有后续的驱动程序事务,或者直到该项被再次强制,或者直到使用noforce命令非强制执行
注意:虽然许多教学材料(不幸的是)证明了std_logic_arith
和std_logic_unsigned
库的使用,但这些不是实际的IEEE标准,不应该用于符合标准的VHDL 。请改用numeric_std
,或者在您的情况下,只删除它们,因为您没有使用这些库中的任何算法。