我正在做一个大学的任务,要求在VHDL中实现一个上/下异步计数器。
我的实现包括使用控制变量 ctrl ,所以当它为0时,计数器按升序计数,否则计入后代。
我已实现的代码(在该学科中,我们使用Quartus 13和FPGA Cyclone IVE EP4CE129C7进行仿真)在此link中遵循。但是,结果simulation仅对输出q0和q1显示“0”。
那么,代码中可能存在瓶颈,以便发生这种情况?
答案 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”值:
这是通过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触发器。
此时我们得到: