伪随机模式生成器,输出不变

时间:2014-04-10 22:34:30

标签: vhdl

我使用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;

1 个答案:

答案 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_arithstd_logic_unsigned库的使用,但这些不是实际的IEEE标准,不应该用于符合标准的VHDL 。请改用numeric_std,或者在您的情况下,只删除它们,因为您没有使用这些库中的任何算法。

相关问题