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

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

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

設計のポイント

verilog記述のポイント:for文による組み合わせ回路の記述

設計内容分類FPGA

実現したい仕様・課題

ビットごとの変換、ビット順の反転、パリティ計算のような規則的なビット操作を1ビットずつ手書きすると、記述が冗長でバス幅の変更にも追従できません。ソフトウェアのループのように簡潔に書きたいものの、for文が合成でどう扱われるのか不安があり、安全な使い方を確立したいというのが課題です。

設計のポイント

always内のfor文は、合成時にループが静的に展開され、繰り返し回数分の並列回路として実装されます。ソフトウェアのように「順番に実行される」のではなく、「N個分の回路を一度に生成する」記述である点を理解することが出発点です。したがって、ループ回数は合成時に確定している必要があり(定数・parameter)、データに依存した可変回数ループは合成できません。典型的な用途は、ビット順反転、ビットごとのマスク処理、パリティ・多数決などのリダクション的計算、バイトレーン単位の選択処理など、規則的なビット・要素操作です。ループ変数はintegerで宣言し、組み合わせ回路として書く場合はalways @(*)内でブロッキング代入(=)を使います。累積型の計算(パリティ等)では、ループ前に初期値を代入してからループで畳み込む形にすると、意図が明確でラッチも防げます。注意点として、ループ展開の結果は「長い組み合わせ回路」になり得るため、ビット幅が大きい畳み込み処理は遅延が積み上がります。タイミングが厳しい場合は、パイプライン化やツリー構造への分割を検討します。generate-forとの使い分けは、「モジュールインスタンスやalwaysブロック自体を複数生成するのはgenerate-for、1つのalways内での規則的な計算はfor文」と整理できます。

【コード例】
parameter W = 8;
reg [W-1:0] rev;
integer i;
always @(*) begin
for (i = 0; i < W; i = i + 1)
rev[i] = din[W-1-i]; // ビット順反転(並列回路に展開)
end

reg p;
always @(*) begin
p = 1’b0;
for (i = 0; i < W; i = i + 1)
p = p ^ din[i]; // パリティ計算
end

verilog記述のポイント:for文による組み合わせ回路の記述 | 組み込み機器・ハードウェア設計製作.com

補足情報

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

FPGA設計のポイント

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

設計のポイント 一覧

FPGA設計のポイント

お問い合わせ

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

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