0

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

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

我已经实现的代码(在本学科中,我们使用 Quartus 13 和 FPGA Cyclone IVE EP4CE129C7 进行仿真)在此链接中。然而,生成的模拟仅显示输出 q0 和 q1 的“0”。

那么,代码中可能出现的瓶颈在哪里?

4

1 回答 1

2

我不是 quartus 用户,所以不熟悉波形查看器的限制,但这看起来是由于从 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' );

NOT of a 'U' 是一个 'U'。

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

显示“U”的波形查看器

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

INV:  sq0_n <= not sq0;

除了在 I1 的第一个实际值中用 sq0_n 代替 sq0:Mux2x1。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 触发器。

此时我们得到:

固定模拟

于 2013-10-21T04:13:12.800 回答