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

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

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

設計のポイント

VHDL記述のポイント:resize関数でビット幅を変換する

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

実現したい仕様・課題

ビット幅の異なる信号間の代入や演算では、幅を揃える必要がありますが、ゼロ埋めや符号拡張を連接で手書きすると、符号の扱いを誤ったり、幅変更時に修正漏れが生じたりします。幅の変換を安全かつ意図が明確な形で記述したいというのが課題です。

設計のポイント

unsigned/signedの幅変換には、numeric_stdのresize関数を使用します。resize(u, N) は、拡張時にはunsignedならゼロ拡張、signedなら符号拡張を自動的に行い、縮小時にはunsignedなら上位切り捨て、signedなら符号ビットを保持して下位を切り出します。連接による手書き拡張(”0000″ & u など)と異なり、「型に応じた正しい拡張」が関数の意味として保証されるため、符号の扱いを誤る余地がなく、変換先の幅も引数で明示されるのでコードの意図が明確です。幅の指定には対象信号の’length属性を使い、resize(a, sum’length) のように書くと、信号幅の変更に自動で追従します。加算で1ビット広い結果を受ける、乗算結果から必要部分を取り出す、異なる幅のレジスタ間で値を移す、といった場面がresizeの典型的な使いどころです。縮小方向のresizeは情報が失われる操作なので、切り捨てが設計意図であることをコメントで明示するか、事前に値域を保証しておきます。std_logic_vectorには直接resizeを適用できないため、いったんunsigned/signedへキャストして符号の解釈を与えてからresizeする、という手順になります。この「符号の解釈を明示してから幅を操作する」流れ自体が、幅変換に伴うバグの予防になっています。

【コード例】
signal a : unsigned(7 downto 0);
signal b : unsigned(11 downto 0);
signal s : signed(7 downto 0);
signal sw : signed(15 downto 0);

b <= resize(a, b’length); — ゼロ拡張(unsigned)
sw <= resize(s, sw’length); — 符号拡張(signed)
a <= resize(b, a’length); — 縮小(上位切り捨て・意図を明記)

VHDL記述のポイント:resize関数でビット幅を変換する | 組み込み機器・ハードウェア設計製作.com

補足情報

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

FPGA設計のポイント

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

設計のポイント 一覧

FPGA設計のポイント

お問い合わせ

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

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