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

问题描述 投票:-1回答:1

我正在做一个1位正边D'Flip Flop。仅当存在时钟信号的上升沿时,才应分配所有输出。 Q与D相同,Qbar是D的否定。

当我尝试使用Qbar作为电线时,它会以某种方式工作。

assign Qbar = ~Q;

在总是阻止之外。但是下面的原始代码给出了“语法错误接近=”和“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的新手。

verilog flip-flop
1个回答
1
投票

您的错误消息是由于在Verilog中如果在always块中有多个语句(在其他地方也是如此),它必须包含在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
© www.soinside.com 2019 - 2024. All rights reserved.