我是第一次使用,所以请耐心等待。
我们必须为分配做一个简单游戏的一部分包括以8位LFSR的形式编写伪随机数生成器。我正在使用Xilinx ISE编写代码,我的注释和示例代码在这里提供:
http://www.oocities.org/siliconvalley/screen/2257/vhdl/lfsr/lfsr.html
现在代码确实合成了,但是给了我关于灵敏度列表的警告。但是,当我运行测试平台时,我获得了pseudo_rand的所有U值。我意识到这个随机数生成器将是内部的,因此不应该有输出,但是当我用伪信号作为信号编写代码时(该变量当前被注释掉),它不会出现在模拟中。
下面是LFSR的代码,后面是相应测试平台的代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity LFSR_3_16_2013 is
port( clk: in std_logic;
rst: in std_logic;
pseu_rand: out std_logic_vector(7 downto 0));
end LFSR_3_16_2013;
architecture Behavioral of LFSR_3_16_2013 is
--signal clk: std_logic;
--signal rst: std_logic;
signal seed: std_logic_vector(7 downto 0):= "10000000";
signal biffer: std_logic_vector(7 downto 0);
--signal pseu_rand: std_logic_vector(7 downto 0);
begin
lfsr : PROCESS(clk,rst)
begin
if(rst='0') then
--pseu_rand <= seed;
biffer <= seed;
pseu_rand <= biffer;
elsif (clk'event and clk='1') then
--pseu_rand(0) <= pseu_rand(7) xor pseu_rand(6);
--pseu_rand(7 downto 1) <= pseu_rand(6 downto 0);
biffer(0) <= biffer(7) xor biffer(6);
biffer(7 downto 1) <= biffer(6 downto 0);
pseu_rand <= biffer;
end if;
end process lfsr;
end Behavioral;
现在是测试台:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY LFSR_tb_3_16_2013 IS
END LFSR_tb_3_16_2013;
ARCHITECTURE behavior OF LFSR_tb_3_16_2013 IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT LFSR_3_16_2013
PORT(
clk : IN std_logic;
rst : IN std_logic;
pseu_rand : OUT std_logic_vector(7 downto 0)
);
END COMPONENT;
--Inputs
signal clk : std_logic := '0';
signal rst : std_logic := '0';
--Outputs
signal pseu_rand : std_logic_vector(7 downto 0);
-- Clock period definitions
constant clk_period : time := 10 ns;
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: LFSR_3_16_2013 PORT MAP (
clk => clk,
rst => rst,
pseu_rand => pseu_rand
);
-- Clock process definitions
clk_process :process
begin
clk <= '0';
wait for clk_period/2;
clk <= '1';
wait for clk_period/2;
end process;
-- Stimulus process
stim_proc: process
begin
-- hold reset state for 100 ns.
wait for 100 ns;
wait for clk_period*10;
-- insert stimulus here
rst <= '1';
wait;
end process;
END;
任何帮助都会非常感激,我很难过。
谢谢, Yusif Nurizade
答案 0 :(得分:0)
敏感度列表告诉进程它必须“唤醒”的操作。这意味着,您的流程仅对 clk 或 rst 信号的活动做出反应。因此pseu_rand就是'U',直到出现第一个时钟边沿。 这实际上不是可合成代码的问题。但是,如果您想更改它,请将种子和 biffer 添加到您的敏感列表中。
lfsr : PROCESS(clk,rst,seed,biffer)
顺便说一句。如果您使用(注释掉的)信号解决方案,则直接使用种子定义pseu_rand而不是 biffer ...因此,它从一开始就在模拟中定义!
答案 1 :(得分:0)
我认为发生的事情是当您取消注释与pseu_rand相关的代码时, 您在重置期间分配了两次值。
pseu_rand <= seed;
和
pseu_rand <= biffer;
在评估过程语句期间,最后一个分配将覆盖并发信号的先前分配。因此,'pseu_rand'将在第一次重置后获得'U',因为'biffer'没有在开头定义。
要解决此问题,只需删除第二个pseu_rand分配。
答案 2 :(得分:0)
您当前的敏感列表问题是由于将种子异步加载到biffer并将biffer异步加载到pseu_rand。你可能不想要其中任何一个。
您正在使用Seed作为常量,因此请将其设为一个。这修复了第一个异步加载:
常数种子:std_logic_vector(7 downto 0):=“10000000”;
要修复第二个,请在此过程中删除两个分配: pseu_rand&lt; = biffer;
现在在流程之外,添加作业: pseu_rand&lt; = biffer;
全部完成。
吉姆