异步复位D触发器代码语法错误

时间:2016-10-11 09:38:22

标签: verilog hdl

我正在编写代码来实现异步复位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

可能出现的错误是什么?是否有更好的逻辑来实现相同的错误?

3 个答案:

答案 0 :(得分:2)

首先,我不鼓励您使用initial语句,除了在testbench中。这不是可合成的,因此不应出现在RTL中。

然后我认为你正在使用标准编程语言来混淆Verilog,而不是。

在Verilog中,有两类陈述:

  • 流程,例如alwaysinitial
  • 分配,assign,可让您直接指定一个“值”&#39;电线

在流程中可以区分两个类:

  • 只有当//do something中指定的边缘出现时,才会评估同步流程begin end语句@

    always @ (posedge clock) begin
      //do something
    end
    
  • 每次//do something块中使用的wirereg的值发生变化时,都会评估组合流程//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