組み込み機器・ハードウェアの設計開発から装置製作まで社内一貫対応!

組み込み機器・ハードウェア設計製作.com
組み込み機器・ハードウェア設計製作.com

produced by株式会社アイディアイ

設計のポイント

VHDL記述のポイント:shift_left・shift_right関数によるシフト演算

設計内容分類FPGA
解決できる課題CPU負荷低減

実現したい仕様・課題

シフト演算を連接やスライスの手書きで記述すると、シフト量が変数の場合に対応しにくく、符号付きデータの算術シフト(符号ビットを保つ右シフト)を誤って論理シフトにしてしまう危険もあります。シフトの種類と意図が明確な記述にしたいというのが課題です。

設計のポイント

unsigned/signedのシフトには、numeric_stdのshift_left(u, n)/shift_right(u, n)を使用します。これらの関数は型に応じて動作が定まっており、shift_rightはunsignedに対しては論理右シフト(上位をゼロ埋め)、signedに対しては算術右シフト(符号ビットで埋める)を行います。「符号付きの右シフトは符号を保つ」という重要な区別が型によって自動的に正しく選ばれるため、手書きの連接で符号ビットの複製を書き誤るリスクがなくなります。シフト量nはnatural(非負整数)で、変数・信号でもよいため、可変シフト(バレルシフタ)も同じ記述で表現でき、合成ツールが選択回路として展開します。2のべき乗の乗除算をシフトで表現する場合も、shift_left/shift_rightを使えば「何ビットシフトしたいのか」が関数呼び出しとして明示され、レビューで意図を追いやすくなります。回転(ローテート)が必要な場合はrotate_left/rotate_rightが同様に用意されています。なお、VHDLにはsll・srl等のシフト演算子も存在しますが、対象の型によって挙動の解釈に注意を要する経緯があり、numeric_stdの関数群に統一しておくのが移植性・可読性の面で無難です。シフト結果の幅は入力と同じであり、あふれたビットは失われるため、拡張が必要な演算ではresizeと組み合わせて幅を確保してからシフトします。

【コード例】
signal u : unsigned(7 downto 0);
signal s : signed(7 downto 0);
signal n : integer range 0 to 7;

y1 <= shift_left(u, 2); — 論理左シフト(x4)
y2 <= shift_right(u, 3); — 論理右シフト(/8)
y3 <= shift_right(s, 1); — 算術右シフト(符号保持で/2)
y4 <= shift_left(u, n); — 可変シフト(バレルシフタ)

VHDL記述のポイント:shift_left・shift_right関数によるシフト演算 | 組み込み機器・ハードウェア設計製作.com

補足情報

当事例のような、FPGA設計に関するポイントをまとめた冊子の無料DLが可能です。
是非以下よりご確認ください。

FPGA設計のポイント

>>ダウンロードはこちら!

設計のポイント 一覧

FPGA設計のポイント

お問い合わせ

組み込み機器・ハードウェア 設計製作.comを運営する株式会社アイディアイは、組み込み機器・ハードウェアの設計開発代行サービスを提供しています。
試験装置や制御機器、組み込みボードなど、設計・開発委託先をお探しの皆様、お気軽に当社に御相談ください。

技術資料のダウンロードはこちらから 技術資料ダウンロ―ド メールフォームでのお問い合わせはこちらから ご相談お問合せ