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

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

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

設計のポイント

verilog記述のポイント:グレイコードカウンタで多ビット値をドメイン間へ渡す

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

実現したい仕様・課題

FIFOのポインタのように連続的に変化する多ビットカウンタ値を別クロックドメインで参照したい場合、バイナリカウンタをビットごとに2段同期化すると、複数ビットが同時に変化する瞬間の取り込みで各ビットの新旧が混ざり、実際には存在しない値として読めてしまいます。多ビットの変化値を安全にドメインをまたいで観測したいというのが課題です。

設計のポイント

連続カウンタのドメイン間受け渡しには、グレイコード(隣接する値の間で1ビットしか変化しない符号)を使用します。バイナリコードでは、たとえば7→8(0111→1000)で4ビットが同時に変化し、同期化のタイミングによっては新旧ビットが混在した無関係な値(0000や1111など)が読めてしまいます。グレイコードなら値の遷移で変化するのは常に1ビットだけなので、同期化タイミングがどうであれ、読める値は「変化前」か「変化後」のいずれかに限定され、偽の中間値が原理的に発生しません。実装は、カウンタ本体はバイナリで保持し、bin ^ (bin >> 1) でグレイコードに変換した値をレジスタで受けてから相手ドメインへ渡し、受け側で2段同期化します。受け側で数値として使う場合はグレイ→バイナリ変換(上位から順次XOR)を行います。この手法は非同期FIFO(DCFIFO)の内部でポインタ比較に使われている標準技術であり、自前で非同期FIFOやドメインまたぎの進捗カウンタを設計する際の必須要素です。適用条件として、カウンタが±1ずつ連続的に変化することが前提であり、ジャンプする値には適用できません。また、グレイ変換後の値は必ずレジスタ経由で渡し、組み合わせ出力のまま渡してグリッチを拾わないようにすることが実装上の注意点です。

【コード例】
// バイナリ→グレイ変換(レジスタで受けて渡す)
always @(posedge clk_a) gray_a <= bin_a ^ (bin_a >> 1);

// 受け側:2段同期化
always @(posedge clk_b) begin g1 <= gray_a; g2 <= g1; end

// グレイ→バイナリ変換(4bitの例)
wire [3:0] bin_b;
assign bin_b[3] = g2[3];
assign bin_b[2] = bin_b[3] ^ g2[2];
assign bin_b[1] = bin_b[2] ^ g2[1];
assign bin_b[0] = bin_b[1] ^ g2[0];

verilog記述のポイント:グレイコードカウンタで多ビット値をドメイン間へ渡す | 組み込み機器・ハードウェア設計製作.com

補足情報

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

FPGA設計のポイント

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

設計のポイント 一覧

FPGA設計のポイント

お問い合わせ

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

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