gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:35:42 25 4
gpt4 key购买 nike

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

最佳答案

多么棒的原理图:+1,因为你费心去生成它。您的代码有多个问题,这是使用阻塞分配、反馈、不使用综合模板等危险的一个很好的例子。 Quartus 肯定搞砸了,但鉴于输入,这并不奇怪。问题:

  1. 不要在这里使用阻塞赋值——使用<=
  2. 整理出你的begin s 和 end秒。作为一个起点,不要放任何 begin/end在您的代码中,除非有必要;它很冗长,并且隐藏了这样的错误。仅使用 begin/end当您明确需要制作多语句 block 时。注意 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 的书,阅读有关增量延迟/赋值的章节,您的 Verilog 将会好得多

关于verilog - 使用 verilog 的 quartus RTL 查看器中的奇怪组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21843632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com