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内部alwaysまたはinitialブロックは使用しません。

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 に答える