代码基本上如下:值将时钟周期计数到150,然后重置为0,VOutReg计算值达到150的次数,当VOutReg达到50次时,它重置为0.就是这样。但是,当我只用以下代码编写一个测试夹具时:永远#20 clock = not clock我得到的结果是时钟变化而不是ValueOut。
代码:
module Asd(
input CLK,
output [8:0] ValueOut
);
reg [9:0] Value;
reg [8:0] VOutReg;
initial Value = 0;
initial VOutReg = 0;
always@(posedge CLK) begin
if (Value == 150)
Value <= 0;
else
Value <= Value + 1;
end
always@(posedge CLK) begin
if (VOutReg == 50)
VOutReg <= 0;
else begin
if (Value == 150)
VOutReg <= VOutReg + 1;
end
end
assign ValueOut = VOutReg;
endmodule
答案 0 :(得分:1)
我在您的代码中看到的主要问题是您的最后一个if语句没有与之关联的其他内容,因此如果Value != 150
,则VOutReg未定义。您还要创建不需要的推断锁存器。要真正创建寄存器,您需要为每个始终定义的寄存器Next
项D
。然后,寄存器输出Q
在每个正时钟边沿变为D
,即寄存器输入。像这样:
module Asd(
input CLK,
output [8:0] ValueOut
);
reg [9:0] Value;
reg [8:0] VOutReg;
reg [9:0] ValueNxt;
reg [8:0] VOutRegNxt;
initial Value = 'b0;
initial VOutReg = 'b0;
always@(posedge CLK)
begin
Value <= ValueNxt;
VOutReg <= VOutRegNxt;
end
always@(*)
begin
if (Value == 150)
begin
ValueNxt = 'b0;
if (VOutReg == 50)
VOutRegNxt = 'b0;
else
VOutRegNxt = VoutReg + 1'b1;
end
else
begin
ValueNxt = Value + 1'b1;
VoutRegNxt = VOutReg;
end
end
assign ValueOut = VOutReg;
endmodule
答案 1 :(得分:1)
您可以使用重置信号(RST
)来避免初始语句,如下所示。
module Asd(
input CLK,
input RST,
output [8:0] ValueOut
);
reg [9:0] Value;
reg [8:0] VOutReg;
//initial Value = 0;
//initial VOutReg = 0;
always@(posedge CLK, negedge RST) begin
if (!RST) begin
Value <= 0;
end
else begin
if (Value == 150)
Value <= 0;
else
Value <= Value + 1;
end
end
always @(*) begin
if (VOutReg == 50)
VOutReg <= 0;
else begin
if (Value == 150)
VOutReg <= VOutReg + 1;
end
end
assign ValueOut = VOutReg;
endmodule
此外,您的代码使用CLK
的上升沿作为VoutReg
逻辑的控制信号,这可能无法为您提供预期值,因为从您的说明中Voutreg
仅取决于{{ 1}}不是Value
。您需要使用CLK
作为控制信号。如果需要,您可以使用单独的Value
块注册此输出。