我正在编写代码来实现异步复位D flipfip,但always@
行显示语法错误:
`timescale 1ns / 1ps
module Dflipflop(
input D,
input reset,
input clk,
output Q
);
reg Q;
initial
begin
if(reset==1) //clear the output (Q=0)
begin
Q <= 0;
end
else if(reset==0)
begin
always@(posedge clk) //syntax error here...
begin
Q <= D;
end
end
end
endmodule
可能出现的错误是什么?是否有更好的逻辑来实现相同的错误?
答案 0 :(得分:2)
首先,我不鼓励您使用initial
语句,除了在testbench中。这不是可合成的,因此不应出现在RTL中。
然后我认为你正在使用标准编程语言来混淆Verilog,而不是。
在Verilog中,有两类陈述:
always
或initial
assign
,可让您直接指定一个“值”&#39;电线在流程中可以区分两个类:
只有当//do something
中指定的边缘出现时,才会评估同步流程begin end
语句@
always @ (posedge clock) begin
//do something
end
每次//do something
块中使用的wire
或reg
的值发生变化时,都会评估组合流程//do something
语句
always @* begin
//do something
end
在这里,您已经在流程中实例化了一个没有物理现实的流程。
另一点,如上所述,您只想在reset==0
时激活流程,以便您输入条件进入流程。再一次,这在合成方面没有任何意义。应该激活该过程,并且应该评估条件。
实现具有异步复位的D触发器的经典解决方案如下:
module Dflipflop(
input D,
input reset,
input clk,
output reg Q
);
always @ (posedge clk or negedge reset) begin
if (!reset)
Q <= 1'b0; // Clear Q when reset negative edge occurs
else
Q <= D; // Capture D in Q when clk positive edge occurs and reset is high
end
endmodule
答案 1 :(得分:0)
你不能总是阻止初始内部。它应该写成这样:
`timescale 1ns / 1ps
module Dflipflop(
input D,
input reset,
input clk,
output Q
);
reg Q;
always @(posedge clk, posedge reset)
begin
if(reset==1) //clear the output (Q=0)
begin
Q <= 0;
end
else
begin
Q <= D;
end
end
endmodule
答案 2 :(得分:0)
您应该使用initial(不建议用于合成)或始终使用。一个程序块不能进入另一个程序块。如果你真的对设计一个不可合成的逻辑感兴趣并想尝试初始化,你可以做下面提到的这样的事情。初始和始终都是程序块。
.ebextensions