我正在制作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的新手。
答案 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)使用wire
和assign
语句可能是一个更好的解决方案,因为(至少在最初)如果您在时钟控制的always
块中分配了两个单独的变量,具有两个触发器的合成器-一个用于Q
和一个用于Qbar
。
这是一个更好的解决方案:
module DFlipFlop(
input D,
input clk,
output Qbar,
output reg Q
);
always @(posedge clk)
Q <= D;
assign Qbar = ~Q;
endmodule