我遇到了一个带有计数器的伪随机数生成器的问题,以检查我是否使用不可约多项式进行了测试。 geenrator工作没有问题,但如果我尝试将它用作子模块,计数器不会。任何的想法 ??
-- x^6 + x^5 + x^3 + x^2 + 1
Library IEEE;
use ieee.numeric_std.all;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;
entity EPZG is
port (CLK: in std_logic;
EQ: out bit_vector(5 downto 0);
A : out bit );
end EPZG;
architecture behaviour of EPZG is
component Counter is port ( CLK, RESET : in std_logic;
result: out bit_vector(5 downto 0));
end component;
signal SZ: bit;
signal SEQ : bit_vector(5 downto 0);
signal CNT_RESET : std_logic;
signal CNT_RESULT : bit_vector(5 downto 0);
begin
SZ <= '1';
PZG : process(CLK)
begin
CNT_RESET <= '1';
if (CLK'event and CLK ='1') then
SEQ(0) <= SZ xor SEQ(5);
SEQ(1) <= SEQ(0);
SEQ(2) <= SEQ(1) xor SEQ(5);
SEQ(3) <= SEQ(2) xor SEQ(5);
SEQ(4) <= SEQ(3);
SEQ(5) <= SEQ(4) xor SEQ(5);
end if;
end process PZG;
EQ <= SEQ;
CNT: Counter port map ( CLK , RESET =>CNT_RESET,result =>CNT_RESULT);
end behaviour;
计数器代码
图书馆IEEE; 使用IEEE.STD_LOGIC_1164.ALL; 使用ieee.std_logic_unsigned.all;
entity Counter is port
(CLK, RESET : in std_logic;
result: out bit_vector(5 downto 0));
end Counter;
architecture BEHAVIOUR of Counter is
signal pre_counter: std_logic_vector(5 downto 0);
begin
REG : process(CLK, RESET)
begin
if(CLK'event and CLK = '1') then
if (RESET = '0') then
pre_counter <= (others =>'0');
else
pre_counter <= pre_counter +1 ;
end if;
end if;
end process;
result <= To_bitvector (pre_counter);
end BEHAVIOUR;
答案 0 :(得分:0)
好的,再试一次。您的计数器模块永远不会被重置,因此永远不会初始化pre_counter
- 这将至少在模拟中为您提供未定义的结果。在顶级代码中为其生成重置,或将其初始化为:
signal pre_counter: std_logic_vector(5 downto 0) := (others => '0');
此外,您的计数器模块中的流程代码可能会使用一些调整。过程敏感性列表包含clk
和reset
,但您的过程使用同步重置。您应该使用同步重置和灵敏度列表中的clk
进行处理:
process(clk)
begin
if(rising_edge(clk)) then
if(reset = '1') then
(...)
或使用异步重置以及敏感列表中的clk
和reset
:
process(clk, reset)
begin
if(reset = '1') then
(...)
elsif(rising_edge(clk)) then
(...)
还要注意使用rising_edge()
函数,这是检查边缘的“现代”方法。