在非常简单的Verilog模块中找不到我的错误

时间:2013-11-04 13:43:00

标签: signal-processing verilog xilinx system-verilog

代码基本上如下:值将时钟周期计数到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

2 个答案:

答案 0 :(得分:1)

我在您的代码中看到的主要问题是您的最后一个if语句没有与之关联的其他内容,因此如果Value != 150,则VOutReg未定义。您还要创建不需要的推断锁存器。要真正创建寄存器,您需要为每个始终定义的寄存器NextD。然后,寄存器输出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块注册此输出。