2

我正在学习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

在此处输入图像描述

4

2 回答 2

4

多么棒的示意图:+1 用于生成它的麻烦。您的代码存在多个问题,这是使用阻塞分配、反馈、不使用综合模板等危险的一个很好的例子。Quartus 确实搞砸了,但考虑到输入,这并不奇怪。问题:

  1. 不要在这里使用阻塞分配 - 使用<=
  2. 整理你begin的s和ends。首先,除非必要,否则不要在代码中添加任何begin/ ;end它很冗长,并且隐藏了这样的错误。仅当您明确需要制作多节块时才使用begin/ 。end请注意,这aux=aux+1超出了您的时钟if/else语句 - 它打算何时执行?
  3. 找出你想要aux增加的时间和地点。
  4. 当您有类似的反馈时要非常小心aux=aux+1。如果你不小心,真正的硬件会振荡。
  5. 不要写这样的链式逻辑——开始并行思考。

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 的书,阅读关于 delta delays/assignments 的章节,你的 Verilog 会好很多

于 2014-02-18T09:21:30.363 回答
2

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

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

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

于 2014-02-18T04:50:20.193 回答