今までは、厳密な言語仕様のVHDLで演算をしてきた。math_realパッケージをuse すれば、log2 も sin() も cos() も使用することができる。

例えば、”LOG2の値の求め方2”でスタティックなlog2の値 をreal で求めた。

VHDLのmath_realパッケージを使用した sin() と cos() の計算”では、スタティックな sin()もcos()の値を math_realパッケージを使用して求めた。

VHDLでは、”ポートを配列で宣言して下位階層に配線を接続する”事もできる。

それで、演算を本格的に使う場合は、VHDLを使って来たが、Verilog HDL も簡単な演算は使ってみようということでやってみることにした。

まずは、Verilog HDL は普通に宣言すると unsigned で、signed にする場合は、特別に signed を付けるとのことだ。(初めてでも使えるVerilog HDL文法ガイド ―― 記述スタイル編

wire        [31:0] data;
wire signed [31:0] data;


Verilog HDLでsinged と unsigned の演算の取り扱いの違いをツイッターで聞いてみた。(ツイッターのログです。@KSuzukii さん、@tkuro11 さんありがとうございました。問題がありましたら、お知らせ下さい)
比較演算子の取り扱いが気になって聞いてみました。signed になると最上位ビットが負の符号になって、大小関係が変わるはずだ。(2の補数)
通常に宣言した unsigned を signed にキャストする時は、最上位ビットに 1'b0 を付け加えて1ビット増やしてから signed にキャストするのが一般的だと思う。

signed, unsigned 演算については、元大学院生の日記さんの
[メモ]verilogのsigned演算をいろいろ試してみた”と
[メモ]verilogでsignedとunsignedの乗算
に詳しく載っていた。
signed キャストは、$signed()を使うそうだ。signed で宣言された data3 に unsigned で宣言された data1, data2の引き算の値を代入するには下の式を使うようだ。

assign data3 = $signed({1'b0, data1}) - $signed({1'b0, data2});


次は、実際に自分でXilinxのツールを使って演算をしてみたいと思う。