今までは、厳密な言語仕様の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のツールを使って演算をしてみたいと思う。
- 2013年12月03日 05:16 |
- 入門Verilog
-
| トラックバック:0
-
| コメント:0