下面是一个简单的32分频计数器模块的VHDL代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity cnt32 is
port(
clk: in std_logic;
en: in std_logic;
co:out std_logic
);
end cnt32;
architecture RTL of cnt32 is
signal countx: std_logic_vector(4 downto 0);
signal co_reg: std_logic;
begin
process(clk,en)
begin
if (en='1') then
countx<="00000";
co_reg<='1';
elsif (clk'event and clk='1') then
if countx="11111" then
countx<="00000";
co_reg<='1';
else
countx<=countx+'1';
co_reg<='0';
end if;
end if; end if;
end process;
co<=co_reg;
end RTL;
该分频模块的RTL级视图如下 :
这里en作为异步复位端。单独对该模块的仿真波形见下:
从波形仿真图中可以得出的一个重要信息是,co输出"00000"的宽度是与en的宽度一致的。这一点验证了该带复位的分频模块单独仿真的正确性。
我遇到的疑惑是:若将该分频模块作为整个系统的一个子模块去工作,则co的输出"00000"的宽度竟然比en(这时en由另一个模块的输出来提供)宽一个时钟周期!!!天啊,这是怎么回事?波形见下:
图中红色圈内示出了co竟比div32en(可看作en)的怪现象。小弟苦思多日始终无解,故在此求教了,望前辈们不吝赐教!
我疑惑的重点是系统仿真的结果与单独仿真的结果不一致,而两者外界都是一样的输入呀。
假设作为异步复位的en输入只维持一个周期且是与时钟上升沿同时到来的。那么当它出现时co复位,将输出"00000"并且只维持一个周期。在下一个时钟周期co就应该像单独模块仿真时那样该输出"00001"了呀,为何作为系统中某一子模块来仿真时仍输出"00000"了,也就是co输出"00000"维持了两个周期呢?
莫非是DFF的异步复位端与上升沿同时到来时会延长一拍生效的时间?也不应该呀,如果是这样,那单独仿真时为什么又是正确的(en宽度与co输出"00000"的宽度一致)?
望路过高手拔刀相助了。
文章评论(0条评论)
登录后参与讨论