1

我是第一次使用所以请多多包涵。

我们必须为分配进行的简单游戏的一部分涉及以 8 位 LFSR 的形式编写伪随机数生成器。我正在使用 Xilinx ISE、我的笔记和此处提供的示例代码编写代码:

http://www.oocities.org/siliconvalley/screen/2257/vhdl/lfsr/lfsr.html

现在代码确实合成了,但给了我关于敏感度列表的警告。然而,当我运行测试台时,我得到了 pseudo_rand 的所有 U 值。我意识到这个随机数生成器将是内部的,因此不应该有输出,但是当我使用 pseudo_rand 作为信号编写代码时(该变体当前已被注释掉),它不会出现在模拟中。

下面是 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; 

任何帮助将不胜感激,我很难过。

谢谢,尤西夫·努里扎德

4

3 回答 3

0

敏感度列表告诉进程它必须“唤醒”哪些操作。这意味着,您的进程只会对clkrst信号的活动做出反应。因此 pseu_rand 在第一个时钟沿出现之前都是“U”。这实际上不是可合成代码的问题。但是,如果您想更改它,请将种子分叉添加到您的敏感度列表中。

lfsr : PROCESS(clk,rst,seed,biffer)

顺便提一句。如果您使用(注释掉的)信号解决方案,您可以直接使用种子定义 pseu_rand而不是超过biffer ...因此它从一开始就在您的模拟中定义!

于 2013-03-17T18:52:59.640 回答
0

我认为发生的事情是当您取消注释与 pseu_rand 相关的代码时,您在重置期间分配了两次值。

pseu_rand <= seed;

pseu_rand <= biffer;

在流程语句的评估期间,最后一个分配将覆盖并发信号的先前分配。结果,“pseu_rand”将在第一次重置后得到“U”,因为“biffer”在开始时没有定义。

要解决此问题,只需删除 pseu_rand 的第二个分配。

于 2013-07-12T20:26:25.300 回答
0

您当前的敏感度列表问题是由于种子异步加载到 biffer 和 biffer 到 pseu_rand。你可能不想要这些。

您将 Seed 用作常量,因此将其设为一个。这修复了第一个异步加载:
常量种子:std_logic_vector(7 downto 0):= "10000000";

要修复第二个,在此过程中删除两个分配:pseu_rand <= biffer;

现在在进程之外,添加赋值:pseu_rand <= biffer;

全部做完。

吉姆

于 2013-07-12T21:25:10.433 回答