0

代码基本上如下: Value 将时钟周期计数为 150,然后重置为 0,VOutReg 计算 Value 达到 150 的次数,当 VOutReg 达到 50 次时,它重置为 0。就是这样。但是,当我只使用以下代码编写测试夹具时:永远#20 时钟 = 不是时钟,我得到的结果是时钟在变化,而不是 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
4

2 回答 2

1

我在您的代码中看到的主要问题是您的最后一个 if 语句没有与之关联的 else ,因此 VOutReg 是 undefined if Value != 150。此外,您正在创建不受欢迎的推断锁存器。要真正创建一个寄存器,您需要一个始终定义的每个寄存器的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
于 2013-11-04T21:21:27.470 回答
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仅取决于Valuenot CLK。您需要使用Valueas 控制信号。如果需要,您可以使用单独的always块注册此输出。

于 2013-11-05T10:47:09.193 回答