Vector VHDL异步纹波计数器故障
这里是一个使用T触发器的4位异步纹波计数器的设计,但是我没有为Tff定义一个组件,只是编码了关于T信号的电路行为 问题如下:Vector VHDL异步纹波计数器故障,vector,vhdl,counter,Vector,Vhdl,Counter,这里是一个使用T触发器的4位异步纹波计数器的设计,但是我没有为Tff定义一个组件,只是编码了关于T信号的电路行为 问题如下: 一,。inout端口,我首先将Q定义为inout,因为它显然是我的输出,并且这些位也被用作后面触发器的clk输入。然而,当我想要模拟我的代码时,Q输出是uuu,这是有意义的,因为我必须用我想要的计数开始的数字初始化它。虽然我不知道如何设置inout初始值,但我尝试了这个过程。。。Q当在可实现的硬件(ASIC或FPGA)中实现计数器时,千万不要使用纹波计数器。通过使用触发器
一,。inout端口,我首先将Q定义为inout,因为它显然是我的输出,并且这些位也被用作后面触发器的clk输入。然而,当我想要模拟我的代码时,Q输出是uuu,这是有意义的,因为我必须用我想要的计数开始的数字初始化它。虽然我不知道如何设置inout初始值,但我尝试了这个过程。。。Q当在可实现的硬件(ASIC或FPGA)中实现计数器时,千万不要使用纹波计数器。通过使用触发器输出作为下一个时钟,您将获得次优计时,工具将无法准确验证设置和保持时间,并且您无法利用专用时钟路由。一般来说,异步设计对于实际实现来说是个坏主意 真正的同步设计对于合成来说会更好,并且在VHDL代码中更容易推断 有关计数器实现的verilog和vhdl示例,请参见上面的链接。TL;DR的答案是,q3不会出现在您的流程敏感度列表中
architecture behavioral of four_bit_asynch_counter is
signal q: std_logic_vector (3 downto 0) := "0000";
begin
process (clk, q(0), q(1), q(2))
begin
if falling_edge(clk) then
if t0 = '1' then
q(0) <= not q(0);
-- else
-- q(0) <= q(0);
end if;
end if;
if falling_edge(q(0)) then
if t1 = '1' then
q(1) <= not q(1);
-- else
-- q(1) <= q(1);
end if;
end if;
if falling_edge(q(1)) then
if t2 = '1' then
q(2) <= not q(2);
-- else
-- q(2) <= q(2);
end if;
end if;
if falling_edge(q(2)) then
if t3 = '1' then
q(3) <= not q(3);
-- else
-- q(3) <= q(3);
end if;
end if;
q_out <= q;
end process;
end architecture behavioral;
在对q3不敏感的情况下,q_out的值在敏感度列表中的下一个事件(恰好在clk上)之前不会更新:
有两种方法可以解决此问题,您可以将q_out赋值移到process语句之外,在该语句中,它将成为一个并发信号赋值,其中一个精心设计的等效进程的灵敏度列表设置为q,或者您可以在当前进程中更改灵敏度列表:
process (clk, q)
因此,q3事件的q_out更新,注意上面8.1中最后引用的段落
这种行为也适用于标准的后续修订
随着工艺灵敏度列表的固定:
您的计数器工作正常
还请注意,我注释掉了q0、q1、q2和q3的冗余else赋值,信号将保持其值,直到赋值,这些是顺序时钟语句。还消除了多余的括号对。非常感谢您的提示。实际上,这只是一个练习VHDL的基本示例,它仍然不是一个严肃的设计,谢谢你的有效观点,我将在设计中考虑它。只是想了解为什么将语法和一个4位向量更改为四个单位向量的行为会有所不同?您的答案没有说明“为什么作为4位向量的第一个样式Q不起作用”,这是唯一的问题。
architecture behavioral of four_bit_asynch_counter is
signal q: std_logic_vector (3 downto 0) := "0000";
begin
process (clk, q(0), q(1), q(2))
begin
if falling_edge(clk) then
if t0 = '1' then
q(0) <= not q(0);
-- else
-- q(0) <= q(0);
end if;
end if;
if falling_edge(q(0)) then
if t1 = '1' then
q(1) <= not q(1);
-- else
-- q(1) <= q(1);
end if;
end if;
if falling_edge(q(1)) then
if t2 = '1' then
q(2) <= not q(2);
-- else
-- q(2) <= q(2);
end if;
end if;
if falling_edge(q(2)) then
if t3 = '1' then
q(3) <= not q(3);
-- else
-- q(3) <= q(3);
end if;
end if;
q_out <= q;
end process;
end architecture behavioral;
q_out <= q;
process (clk, q)