使用verilog的quartus RTL查看器中的奇怪组件

时间:2014-02-18 03:15:13

标签: verilog digital-logic register-transfer-level

我正在学习verilog,当我不知道电路如何工作只看verilog代码时,我会去RTL查看器看数字逻辑。但是在这段代码中出现了一个奇怪的组件,我不知道这个组件是什么。是触发器,多路复用器还是逻辑端口? 下面是代码和图像,在图像中,组件是红色三角形。

代码:

module testesoma(clock,reset,in, out,aux);

input wire reset, clock, in ;
output reg [3:0] out,aux;


 always @(posedge clock or posedge reset)
begin
    if(reset)
        begin
            out = 0;
        end
    else    
        out = aux;
        aux = aux + 1;
end
endmodule

enter image description here

2 个答案:

答案 0 :(得分:4)

多么出色的原理图:+1用于解决生成它的问题。您的代码存在多个问题,这是使用阻止分配,反馈,不使用合成模板等的危险的一个很好的例子。 Quartus肯定搞砸了,但考虑到输入,这并不奇怪。的问题:

  1. 此处不使用阻止分配 - 使用<=
  2. 整理您的beginend。作为一个注意点,除非有必要,否则不要在代码中添加任何begin / end;它很冗长,并且隐藏了这样的错误。明确需要制作多重版块时,只能使用begin / end。请注意,aux=aux+1超出了您的时钟if / else语句 - 何时执行?
  3. 排序您希望aux增加的位置和时间。
  4. 如果您有aux=aux+1之类的反馈,请务必小心。如果你不小心,真正的硬件会振荡。
  5. 不要像这样编写链式逻辑 - 开始思考并行。
  6. Quartus有一个相当不错的选择,但它产生的电路只会振荡,aux输出没有时钟,这可能是你的意图。 Quartus已经放入了红色缓冲区,因为它可以看到它产生了一个不稳定的反馈电路,并且它有一个半心半意的破坏它。它应该在某处产生警告。

    1 - 重写你的代码;

    之类的东西
        always @(posedge clock or posedge reset)
           if(reset)
              out <= 0;
            else    
              out <= aux;
    
       always @(posedge clock or posedge reset)
           if(reset)
              aux <= 0;
            else    
              aux <= aux + 1'b1;
    

    2 - 不要在时钟always中分配多个变量,除非/直到您了解它可能出现的问题(提示:检查所有分支/执行路径,确认您在所有可能路径中分配的所有变量都会出现逻辑错误。

    3 - 查找有关VHDL的书籍,阅读有关增量延迟/分配的章节,您的Verilog将更好地

答案 1 :(得分:2)

该符号只是一个缓冲区,它驱动输出等于输入。至于它为何会出现在数字逻辑原理图中,我不确定。

缓冲器对电路的数字功能没有任何影响,当网络的电容太大而驱动器单元无法有效驱动时,它们会被合成器插入。你几乎可以忽略它。

此外,我对该原理图有点怀疑,它似乎与您的RTL不匹配。 rtl在每个posedge时钟上增加aux,但是这显示了通过加法器的组合反馈循环,这看起来根本不起作用。