我正在阅读来自Microsemi网站(Actel HDL Code)的文档,我发现了一些触发器(同步,异步等)的实现。在所有情况下,作者都用触发器模拟了触发器。阻止陈述。
我想知道这些实现是否正确,因为我一直使用非阻塞来建模顺序逻辑?我错过了什么,或者它只是一种模拟触发器而不是顺序电路的方法吗?
// Rising Edge Flip-Flop with Asynchronous Reset
module dff_async_rst (data, clk, reset, q);
input data, clk, reset;
output q;
reg q;
always @(posedge clk or negedge reset)
if (~reset)
q = 1'b0;
else
q = data;
endmodule
//Rising Edge Flip-Flop with Synchronous Reset
module dff_sync_rst (data, clk, reset, q);
input data, clk, reset;
output q;
reg q;
always @ (posedge clk)
if (~reset)
q = 1'b0;
else
q = data;
endmodule
注意:阻止始终阻止使用的分配以获得顺序逻辑
答案 0 :(得分:1)
触发器应该按照您之前的想法使用非阻塞(<=
)进行建模。
如果您在1995年之后使用任何版本的verilog ,那么您的端口声明可以稍微整理一下。注意:为了清晰起见,我添加了开头,_n
指定了有效的低信号。
具有异步复位的上升沿触发器
module dff_async_rst (
input data,
input clk,
input reset_n,
output reg q //SystemVerilog logic is preferred over reg
);
always @(posedge clk or negedge reset_n) begin
if (~reset_n) begin
q <= 1'b0;
end
else begin
q <= data;
end
end
endmodule
具有同步复位功能的上升沿触发器
module dff_sync_rst(
input data,
input clk,
input reset_n,
output reg q //SystemVerilog logic is preferred over reg
);
always @(posedge clk) begin
if (~reset_n) begin
q <= 1'b0;
end
else begin
q <= data;
end
end
endmodule