【问题标题】:What is the difference between these verilog codes?这些verilog代码有什么区别?
【发布时间】:2015-05-25 10:20:38
【问题描述】:

我正在按照教程在我的 fpga 中闪烁 LED。 这些是提供的代码:

1)

module LED (    
    input      [17:0] SW,
    output reg [17:0] LEDR
);    
    assign led = switch;
endmodule

2) --------

module LED (    
    input [17:0] SW,
    output reg [17:0] LEDR
);
    always @(*)
        led = switch;
endmodule

3) ---------

module LED (        
    input CLOCK_50,
    input [17:0] SW,
    output reg [17:0] LEDR
);

    always @(posedge CLOCK_50)
        LEDR = SW;
endmodule

【问题讨论】:

  • 问题是什么?另外,请格式化代码。

标签: verilog fpga


【解决方案1】:

您的第一个示例使用连续赋值将 led 的值设置为 switch 的值。这就像用电线直接连接ledswitch。每当 switch 发生变化时,led 也会发生变化。

您的第二个示例做了同样的事情,但使用了 always 块。 always 块有一个敏感度列表,其中包含将触发块运行的信号。在这种情况下,它是 *,这意味着它会在任何时候块中的任何信号发生变化时触发。我相信这与您的第一个示例相同。

您的第三个示例使用顺序逻辑将 LEDR 设置为 SW。在这种情况下,always 块仅在 CLOCK_50 信号从非高电平状态变为高电平时触发。如果 CLOCK_50 永远不会上升,则 LEDR 永远不会设置为任何值。

顺便说一句,我不认为你的第一个或第二个例子是可综合的。我认为ledswitch应该是LEDRSW

这些文章更好地描述了您示例中的概念:

分配:http://verilog.renerta.com/mobile/source/vrg00005.htm

始终阻止:http://www.asic-world.com/verilog/verilog_one_day3.html

【讨论】:

  • 谢谢!!你是对的,LED 和开关应该是 LEFT 和 SW。那么所有这些代码都做同样的事情吗?但推荐的方法是什么?第三个?
  • LED 应该是 LEDR****
  • @Bruno 我认为没有“推荐”的方式;这取决于你的目标是什么。您必须研究组合逻辑和顺序逻辑,才能确定哪个更适合您的需求。如果你只是想设置 LED,分配就可以了。
  • @Bruno 不,它们并不完全相同。前两个是一样的。如果你正在做这么简单的事情,你会使用第一个。如果它变得更复杂,那么 always 块将变得有用。第三种情况不同。这是 SW 和 LEDR 之间触发器的逻辑,因此在这种情况下,SW 和 LEDR 不会始终相同。该值只是在每个时钟复制一次。
猜你喜欢
  • 2012-09-27
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 2011-11-22
  • 2013-05-13
  • 2014-04-01
相关资源
最近更新 更多