Vector VHDL异步纹波计数器故障

Vector VHDL异步纹波计数器故障,vector,vhdl,counter,Vector,Vhdl,Counter,这里是一个使用T触发器的4位异步纹波计数器的设计,但是我没有为Tff定义一个组件,只是编码了关于T信号的电路行为 问题如下: 一,。inout端口,我首先将Q定义为inout,因为它显然是我的输出,并且这些位也被用作后面触发器的clk输入。然而,当我想要模拟我的代码时,Q输出是uuu,这是有意义的,因为我必须用我想要的计数开始的数字初始化它。虽然我不知道如何设置inout初始值,但我尝试了这个过程。。。Q当在可实现的硬件(ASIC或FPGA)中实现计数器时,千万不要使用纹波计数器。通过使用触发器

这里是一个使用T触发器的4位异步纹波计数器的设计,但是我没有为Tff定义一个组件,只是编码了关于T信号的电路行为

问题如下:


一,。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)