2013-10-20 58 views
0

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

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

我在这个link中执行了我已经实现的代码(在本学科中,我们使用Quartus 13和FPGA Cyclone IVE EP4CE129C7进行仿真)。然而,由此产生的simulation仅对输出q0和q1表现为“0”。

那么,哪里可能是代码中的一个可能的瓶颈,以便发生这种情况?

回答

1

我不是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'); 

不是一个“U”是一个“U”

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

waveform viewer showing 'U'

这与ghdl和gtkwave,和一个额外的测试平台完成。到Taraefa09的架构弧唯一的变化是在并行信号添加sq0_n并为它指定:

INV: sq0_n <= not sq0; 

随着第一实际I1为SQ0代sq0_n: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)在触发器(名为SQ)实际为q的默认值。触发器的类型被称为触发器或T触发器。

在这一点上,我们得到:

fixed simulation

+0

其实,我一直怀疑这一问题与STD_LOGIC,@DavidKoontz的,但在学科的讲义中的代码存在没有分配给一个默认值SIGNAL sq。因此,我遵循了您的提示,并且代码正常工作。非常感谢你的帮助和这个优秀的解释。最好的管家! –