web-dev-qa-db-ja.com

Verilogの符号付きサンプルと符号なしサンプルおよび最初のサンプル

16ビットsignedサンプルを含むレジスタreg [15:0] my_regがあると仮定します。

サンプルを符号付きから符号なしに変換するにはどうすればよいですか? このウィキペディアの記事 を読み、符号付き数値の2ビット補数を認識していますが、Verilogでこの変換を効率的に実行するにはどうすればよいですか? (my_regが正か負かはわかりませんが、クロックサイクルごとに変化します=正のクロックエッジごとに新しいサンプルを受け取ります)。

究極の目標(コンテキストを少し追加すること)は、デジタルFPGA内蔵の自動ゲイン制御(AGC)を実装することです。

EDIT:提案されているように、2つの質問を2つの異なる投稿に分割しました。もう1つを参照してください ここ

6

Verilogでは、regにはバイナリデータが含まれています。signedunsignedは解釈の問題です。ビット値は同じままで、減算と加算は常に2の補数を使用して実行されます。

たとえば、4ビットの値を見て、数値がどのように解釈されるかを確認できます。

_  Binary Unsigned  signed  
  1000          8      -8
  1110         14      -2
  1111         15      -1    
  0001          1       1
  0010          2       2
  0111          7       7
_

これらの数値を正のスケールに調整したいと思います。-8は0になり、0は8になり、7は15になります。これはMSB位置に1を追加することによって行われます。 4ビットの例では:

_  Binary   Signed  Addition Unsigned result
  1000         -8  +1000    0000   0
  1110         -2  +1000    0110   6
  1111         -1  +1000    0111   7
  0001          1  +1000    1001   9
  0010          2  +1000    1010   10  
  0111          7  +1000    1111   15
_

密接に関連する質問がいくつかあります。
1。 Verilog:絶対値の取得方法
2。 2の補数コンパレータのVerilog構築

レジスタに実際に署名された情報が含まれている場合は、意味的に次のように定義する必要があります。

_reg signed [15:0] my_reg;
_

値を絶対にするには:

_reg signed [15:0] my_reg;
reg        [15:0] my_reg_unsigned;

always @* begin
  if (my_reg < 16'd0) begin
    my_reg_unsigned = -my_reg ;
  end
  else begin
    my_reg_unsigned = my_reg ;
  end
end
_

絶対値にする必要はないが、その番号を使用して何かを駆動したい場合は、符号付きを符号なしに接続するだけで有効です。

_always @* begin
  my_reg_unsigned = my_reg ;
end
_

これによりビット値がコピーされます。_my_reg_unsigned_は$signed(my_reg_unsigned)を使用して署名されていると解釈できます。

7
Morgan