这些verilog代码有什么区别?

时间:2015-05-24 22:52:17

标签: verilog fpga

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

1 个答案:

答案 0 :(得分:1)

您的第一个示例使用连续分配将 led 的值设置为开关的值。这就像直接用电线连接 led 开关一样。每当切换更改时, led 也会发生变化。

您的第二个示例执行相同操作但使用始终块。 始终块具有敏感列表,其中包含将触发块运行的信号。在这种情况下,它是 * ,这意味着它会在块中的任何信号发生变化时触发。我相信这与你的第一个例子相同。

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

顺便说一句,我不认为你的第一个或第二个例子是可综合的。我认为 led 开关应该是 LEDR SW

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

作业:http://verilog.renerta.com/mobile/source/vrg00005.htm

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