寄存器类型变量给出错误:未知类型

时间:2019-04-10 09:15:51

标签: verilog flip-flop

我正在制作1位上升沿Dflipflop。仅当时钟信号出现上升沿时,才应分配所有输出。 Q与D相同,Qbar是D的负数。

当我使用Qbar作为导线尝试此操作时,它以某种方式起作用。

assign Qbar = ~Q;

在Always块之外。但是,如下所示的原始代码给出了一个错误:“ =附近的语法错误和“ Qbar是未知类型”

我试图使Qbar分配成为非阻塞类型,但是没有效果。

module DFlipFlop(
    input D,
    input clk,
    output reg Qbar,
    output reg Q
    );
//assign Qbar = ~D;
always @(posedge clk)
     Q = D;
     Qbar = ~D; 
endmodule

我在这里想念什么?我是Verilog的新手。

1 个答案:

答案 0 :(得分:0)

您的错误消息是由以下事实引起的:在Verilog中,如果始终块(以及其他位置)中有多个语句,则必须将其包含在begin-end构造内。因此,您需要这样做:

module DFlipFlop(
    input D,
    input clk,
    output reg Qbar,
    output reg Q
    );

  always @(posedge clk) begin
     Q = D;
     Qbar = ~D; 
  end
endmodule

但是,这不是一个好的解决方案,因为

i)(除非您知道自己在做什么),始终对要在合成后变成触发器的变量使用非阻塞分配,并且

ii)使用wireassign语句可能是一个更好的解决方案,因为(至少在最初)如果您在时钟控制的always块中分配了两个单独的变量,具有两个触发器的合成器-一个用于Q和一个用于Qbar

这是一个更好的解决方案:

module DFlipFlop(
    input D,
    input clk,
    output Qbar,
    output reg Q
    );

  always @(posedge clk)
     Q <= D;

  assign Qbar = ~Q;

endmodule