16ビットsignedサンプルを含むレジスタreg [15:0] my_reg
があると仮定します。
サンプルを符号付きから符号なしに変換するにはどうすればよいですか? このウィキペディアの記事 を読み、符号付き数値の2ビット補数を認識していますが、Verilogでこの変換を効率的に実行するにはどうすればよいですか? (my_reg
が正か負かはわかりませんが、クロックサイクルごとに変化します=正のクロックエッジごとに新しいサンプルを受け取ります)。
究極の目標(コンテキストを少し追加すること)は、デジタルFPGA内蔵の自動ゲイン制御(AGC)を実装することです。
EDIT:提案されているように、2つの質問を2つの異なる投稿に分割しました。もう1つを参照してください ここ
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)
を使用して署名されていると解釈できます。