我正在学习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
答案 0 :(得分:4)
多么出色的原理图:+1用于解决生成它的问题。您的代码存在多个问题,这是使用阻止分配,反馈,不使用合成模板等的危险的一个很好的例子。 Quartus肯定搞砸了,但考虑到输入,这并不奇怪。的问题:
<=
begin
和end
。作为一个注意点,除非有必要,否则不要在代码中添加任何begin
/ end
;它很冗长,并且隐藏了这样的错误。明确需要制作多重版块时,只能使用begin
/ end
。请注意,aux=aux+1
超出了您的时钟if
/ else
语句 - 何时执行?aux
增加的位置和时间。aux=aux+1
之类的反馈,请务必小心。如果你不小心,真正的硬件会振荡。 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,但是这显示了通过加法器的组合反馈循环,这看起来根本不起作用。