这些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 的值。就好像直接用电线连接led和switch一样。每当 switch 改变时,led 也会改变。
你的第二个例子做了同样的事情,但使用了一个 always 块。 总是 块有一个敏感列表,其中包含将触发块到 运行 的信号。在这种情况下,它是 *,这意味着它会在块中的任何信号发生变化时触发。我相信这与您的第一个示例相同。
您的第三个示例使用顺序逻辑将 LEDR 设置为 SW。在这种情况下,always 块仅在 CLOCK_50 信号从非高状态变为高时触发。如果 CLOCK_50 永远不会上升,则 LEDR 永远不会设置为任何值。
顺便说一句,我不认为你的第一个或第二个例子是可综合的。我觉得led和switch应该是LEDR和SW .
这些文章更好地描述了您示例中的概念:
作业:http://verilog.renerta.com/mobile/source/vrg00005.htm
总是阻止:http://www.asic-world.com/verilog/verilog_one_day3.html
我正在按照教程使我的 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 的值。就好像直接用电线连接led和switch一样。每当 switch 改变时,led 也会改变。
你的第二个例子做了同样的事情,但使用了一个 always 块。 总是 块有一个敏感列表,其中包含将触发块到 运行 的信号。在这种情况下,它是 *,这意味着它会在块中的任何信号发生变化时触发。我相信这与您的第一个示例相同。
您的第三个示例使用顺序逻辑将 LEDR 设置为 SW。在这种情况下,always 块仅在 CLOCK_50 信号从非高状态变为高时触发。如果 CLOCK_50 永远不会上升,则 LEDR 永远不会设置为任何值。
顺便说一句,我不认为你的第一个或第二个例子是可综合的。我觉得led和switch应该是LEDR和SW .
这些文章更好地描述了您示例中的概念:
作业:http://verilog.renerta.com/mobile/source/vrg00005.htm
总是阻止:http://www.asic-world.com/verilog/verilog_one_day3.html