首页 文章

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

提问于
浏览
0

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

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

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

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

1 回答

  • 1

    我不是一个用户,所以不熟悉波形查看器的限制,但这看起来像是从类型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

相关问题