这些verilog代码有什么区别?

What is the difference between these verilog codes?

我正在按照教程使我的 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

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

你的第二个例子做了同样的事情,但使用了一个 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