Random VHDL中使用LFSR的伪随机数发生器

Random VHDL中使用LFSR的伪随机数发生器,random,numbers,vhdl,generator,lfsr,Random,Numbers,Vhdl,Generator,Lfsr,我在使用lfsr方法创建prng时遇到了一些问题。这是我的密码: library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity pseudorng is Port ( clock : in STD_LOGIC; reset : in STD_LOGIC; Q : out STD_LOGIC_VECTOR (7 downto 0); check: out STD_LOGIC); constant se

我在使用lfsr方法创建prng时遇到了一些问题。这是我的密码:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity pseudorng is
Port ( clock : in STD_LOGIC;
       reset : in STD_LOGIC;
       Q : out STD_LOGIC_VECTOR (7 downto 0);
       check: out STD_LOGIC);

       constant seed: STD_LOGIC_VECTOR(7 downto 0) := "00000001";
end pseudorng;

architecture Behavioral of pseudorng is

signal temp: STD_LOGIC;
signal Qt: STD_LOGIC_VECTOR(7 downto 0);

begin

PROCESS(clock)
BEGIN

IF rising_edge(clock) THEN
IF (reset='1') THEN Qt <= "00000000";
ELSE Qt <= seed; 
END IF;
temp <= Qt(4) XOR Qt(3) XOR Qt(2) XOR Qt(0);
--Qt <= temp & Qt(7 downto 1);

END IF;
END PROCESS;

check <= temp;
Q <= Qt;

end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体伪RNG是
端口(时钟:标准_逻辑中;
复位:在标准逻辑中;
Q:输出标准逻辑向量(7到0);
检查:退出标准(U逻辑);
常数种子:标准逻辑向量(7到0):=“00000001”;
末端假RNG;
伪RNG的体系结构是
信号温度:标准逻辑;
信号Qt:STD_逻辑_向量(7到0);
开始
进程(时钟)
开始
如果上升沿(时钟),则

如果是(reset='1'),那么Qt我对你所拥有的做了一些轻微的修改(尽管你基本上在那里);否则,我认为LFSR将无法正常运行。我向LFSR添加了一个启用信号,这样您就可以有效地控制何时需要它步进。生成的sim卡是

正如旁注一样,如果您想使用不同的值(而不是使其为常量)对LFSR进行种子设定,还可以包括
load
seed
输入

IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体伪RNG是
端口(时钟:标准_逻辑中;
复位:在标准逻辑中;
en:标准逻辑;
Q:输出标准逻辑向量(7到0);
检查:退出标准(U逻辑);
--常数种子:标准逻辑向量(7到0):=“00000001”;
末端假RNG;
伪RNG的体系结构是
--信号温度:标准逻辑;
信号Qt:STD_逻辑_向量(7到0):=x“01”;
开始
进程(时钟)
变量tmp:STD_逻辑:='0';
开始
如果上升沿(时钟),则
如果(reset='1'),则
--QuantumRipple指出这不应该
--将重置为所有0,因为您将进入无效状态

Qt我对你所拥有的做了一些轻微的修改(尽管你已经差不多做到了);否则,我认为LFSR将无法正常运行。我向LFSR添加了一个启用信号,这样您就可以有效地控制何时需要它步进。生成的sim卡是

正如旁注一样,如果您想使用不同的值(而不是使其为常量)对LFSR进行种子设定,还可以包括
load
seed
输入

IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体伪RNG是
端口(时钟:标准_逻辑中;
复位:在标准逻辑中;
en:标准逻辑;
Q:输出标准逻辑向量(7到0);
检查:退出标准(U逻辑);
--常数种子:标准逻辑向量(7到0):=“00000001”;
末端假RNG;
伪RNG的体系结构是
--信号温度:标准逻辑;
信号Qt:STD_逻辑_向量(7到0):=x“01”;
开始
进程(时钟)
变量tmp:STD_逻辑:='0';
开始
如果上升沿(时钟),则
如果(reset='1'),则
--QuantumRipple指出这不应该
--将重置为所有0,因为您将进入无效状态

Qt最初的问题“它在第一个时钟脉冲上仍然未定义。为什么?”是因为在时钟进程内分配
tmp
增加了一个触发器(即延迟周期),然后使用该触发器的输出切换到
Qt
。这是极少数可以适当使用变量的情况之一。通过同时分配
tmp
也可以避免失败,但在这种特殊情况下,使用变量可以更好地扫描。AsKER可能想考虑重置为0以外的任何值(例如种子常量),因为0是这个LFSR的死区。我完全错过了零复位。最初的问题“它在第一个时钟脉冲上仍然没有定义。这是为什么?”是因为在时钟进程中分配
tmp
增加了一个触发器(即延迟周期),然后使用该触发器的输出切换到
Qt
。这是极少数可以适当使用变量的情况之一。通过同时分配
tmp
也可以避免失败,但在这种特殊情况下,使用变量可以更好地扫描。AsKER可能想考虑重置为0以外的任何值(例如种子常量),因为0是这个LFSR的死区。我完全错过了零位重置
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity tb_pseudorng is
end tb_pseudorng;

architecture bench of tb_pseudorng is

COMPONENT pseudorng
      Port ( clock : in STD_LOGIC;
      reset : in STD_LOGIC;
      Q : out STD_LOGIC_VECTOR (7 downto 0);
      check: out STD_LOGIC);
END COMPONENT;

signal clock1: STD_LOGIC;
signal reset1: STD_LOGIC;
signal Q1: STD_LOGIC_VECTOR(7 downto 0);
signal check1: STD_LOGIC;

begin

mapping: pseudorng PORT MAP(
clock => clock1,
reset => reset1,
Q => Q1,
check => check1);

clock: PROCESS
BEGIN
clock1<='0'; wait for 50ns;
clock1<='1'; wait for 50ns;
END PROCESS;

reset: PROCESS
BEGIN
reset1<='0'; wait for 900ns;
END PROCESS; 

end bench;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity pseudorng is
Port ( clock : in STD_LOGIC;
       reset : in STD_LOGIC;
       en : in STD_LOGIC;
       Q : out STD_LOGIC_VECTOR (7 downto 0);
       check: out STD_LOGIC);

--       constant seed: STD_LOGIC_VECTOR(7 downto 0) := "00000001";
end pseudorng;

architecture Behavioral of pseudorng is

--signal temp: STD_LOGIC;
signal Qt: STD_LOGIC_VECTOR(7 downto 0) := x"01";

begin

PROCESS(clock)
variable tmp : STD_LOGIC := '0';
BEGIN

IF rising_edge(clock) THEN
   IF (reset='1') THEN
   -- credit to QuantumRipple for pointing out that this should not
   -- be reset to all 0's, as you will enter an invalid state
      Qt <= x"01"; 
   --ELSE Qt <= seed;
   ELSIF en = '1' THEN
      tmp := Qt(4) XOR Qt(3) XOR Qt(2) XOR Qt(0);
      Qt <= tmp & Qt(7 downto 1);
   END IF;

END IF;
END PROCESS;
-- check <= temp;
check <= Qt(7);
Q <= Qt;

end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity tb_pseudorng is
end tb_pseudorng;

architecture bench of tb_pseudorng is

COMPONENT pseudorng
      Port ( clock : in STD_LOGIC;
      reset : in STD_LOGIC;
      en : in STD_LOGIC;
      Q : out STD_LOGIC_VECTOR (7 downto 0);
      check: out STD_LOGIC);
END COMPONENT;

signal clock1: STD_LOGIC;
signal reset1: STD_LOGIC;
signal Q1: STD_LOGIC_VECTOR(7 downto 0);
signal check1: STD_LOGIC;
signal en : STD_LOGIC;

begin

mapping: pseudorng PORT MAP(
clock => clock1,
reset => reset1,
en => en,
Q => Q1,
check => check1);

clock: PROCESS
BEGIN
   clock1 <= '0'; wait for 50 ns;
   clock1 <= '1'; wait for 50 ns;
END PROCESS;

reset: PROCESS
BEGIN
   reset1 <= '0';
   en <= '1';
   wait for 900 ns;
END PROCESS;

end bench;