0

我已经编写了一段代码,它将根据我提供的数字和我用来将数字移动到位的一些其他数据返回一个商和一个提醒。
我现在遇到的问题是,如果我一个接一个地测试更多的值,我就无法很好地跟踪我的商数。
我需要一种方法来初始化我的cat寄存器,这样我就不再从以前的计算中获得残差值。

这是我正在谈论的代码:

module divide(
  input      [7:0] a, b,
  input      [3:0] counter, msb,
  output reg [7:0] q,
  output reg [7:0] r
);
always @(*) begin
  for(i = 0; i < counter + 1  ; i = i+1) begin
    sum = s_a + s_b;     //previously calculated values
      if(sum[8-msb] == 1) begin
        assign s_a       = s_a; 
        assign s_b       = s_b >>> 1;
        cat[counter - i] = 1'b0;                
      end
      else begin
        assign s_a       = sum;
        assign s_b       = s_b >>> 1;
        cat[counter - i] = 1'b1;
      end
      assign r = s_a;
      assign q = cat;
    end
  end
endmodule 

注意:我已经声明了这段代码中的所有寄存器,但出于某种目的,我不能在这里声明它们。

4

1 回答 1

3

您不使用assign内部alwaysinitial块。

cat 的赋值是组合的,因此它不是触发器,即没有复位。它是一种类型的事实reg与硬件无关,而是模拟器优化。

我会把它写成(没有进行功能更改):

module divide#(
  parameter DATA_W = 8
)(
  input      [7:0] a, b,
  input      [3:0] counter, msb,
  output reg [7:0] q,
  output reg [7:0] r
);
//Definitions
reg [DATA_W-1:0] sum;
reg [DATA_W-1:0] s_a;
reg [DATA_W-1:0] s_b;
integer i;

always @* begin
  for(i = 0; i < (counter + 1); i = i+1) begin
    sum = s_a + s_b;     //previously calculated values
      if(sum[8-msb] == 1'b1) begin
       s_a              = s_a; 
       s_b              = s_b >>> 1;
       cat[counter - i] = 1'b0;                
      end
      else begin
        s_a              = sum;
        s_b              = s_b >>> 1;
        cat[counter - i] = 1'b1;
      end
      r = s_a;
      q = cat;
    end
  end
endmodule

您有以下行:

sum = s_a + s_b;     //previously calculated values

您没有在此处包含任何触发器,除非您有真正要避免的隐含锁存器,否则不涉及内存或状态。即没有先前计算的值。

您可能希望添加一个触发器并使用多个时钟周期来计算结果,而不是组合块。

而不是always @*尝试:

always @(posedge clk or negedge rst_n) begin
  if (~rst_n) begin
     s_a <= 'b0; //Reset Value
  end
  else begin 
    s_a <= next value; //Normal logic
  end
end
于 2013-11-06T09:18:19.797 回答