我正在做一所大学的任务,要求在 VHDL 中实现一个向上/向下异步计数器。
我的实现包括使用控制变量ctrl所以当它为 0 时,计数器按升序计数,否则按降序计数。
我已经实现的代码(在本学科中,我们使用 Quartus 13 和 FPGA Cyclone IVE EP4CE129C7 进行仿真)在此链接中。然而,生成的模拟仅显示输出 q0 和 q1 的“0”。
那么,代码中可能出现的瓶颈在哪里?
我不是 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”值的波形查看器:
这是通过 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 触发器。
此时我们得到: