VHDL - 异步向上/向下计数器

时间:2013-10-20 23:59:30

标签: asynchronous counter vhdl

我正在做一个大学的任务,要求在VHDL中实现一个上/下异步计数器。

我的实现包括使用控制变量 ctrl ,所以当它为0时,计数器按升序计数,否则计入后代。

我已实现的代码(在该学科中,我们使用Quartus 13和FPGA Cyclone IVE EP4CE129C7进行仿真)在此link中遵循。但是,结果simulation仅对输出q0和q1显示“0”。

那么,代码中可能存在瓶颈,以便发生这种情况?

1 个答案:

答案 0 :(得分:2)

我不是一个用户,因此不熟悉波形查看器的限制,但这看起来像是从类型BIT迁移到类型Std_Logic。默认值(除非另有说明,Std_Logic(Std_ULogic)为'U',而BIT为'0'。

这会导致您将FFT q的NOT'U'分配给MUX的输入。结果是您的触发器永远不会被赋予除“U”以外的值。

来自std_logic_1164包:

   -- truth table for "not" function
    CONSTANT not_table: stdlogic_1d :=
    --  -------------------------------------------------
    --  |   U    X    0    1    Z    W    L    H    -   |
    --  -------------------------------------------------
         ( 'U', 'X', '1', '0', 'X', 'X', '1', '0', 'X' );

不是'U'是'U'。

使用波形查看器显示“U”值:

waveform viewer showing 'U'

这是通过ghdl和gtkwave以及添加的测试平台完成的。对Taraefa09的架构弧的唯一改变是添加sq0_n并将其分配给并发信号:

INV:  sq0_n <= not sq0;

在I1:Mux2x1的第一个实际中,将sq0_n替换为sq0。 ghdl不支持与实际输入一起使用的函数。

解决方案是a)复位触发器或b)使用BIT类型或c)在FFT中为q0提供默认值。除非您的目标设备提供已知的默认(初始)值,否则选择a)将是首选。

事实证明还有其他错误:

ENTITY FFT IS
    PORT(
        clk: IN STD_LOGIC;
        q: OUT STD_LOGIC
    );
END FFT;

ARCHITECTURE Arc OF FFT IS
    SIGNAL sq: STD_LOGIC := '0' ;  -- choice c) 
    BEGIN
        PROCESS(clk)
        BEGIN
            IF(clk'event AND clk='1') THEN -- clk'event: é o evento de subida/descida. 
                sq <= (not sq);         -- changed target from q to sq
            END IF;
        END PROCESS;

    BUF: q <= sq;   -- added concurrent statement

    END Arc;

这表示选择c)触发器中实际q的默认值(名为sq)。触发器的类型称为触发器触发器或T触发器。

此时我们得到:

fixed simulation