Quartusで遊ぼう (4) [プログラム三昧]
前回の「Quartusで遊ぼう (3)」で4値のアップ・ダウンカウンタを作成しました。 さて、このカウンタで論理合成後に使われているフリップ・フロップは、何個(何ビット)でしょうか?
ワン・ホット・コード
図のテクノロジ・マップを見てわかるように、正解は4個です。 HDL では、2ビットのレジスタに4種類のコードをキレイに割り当てて、ジョンソン・カウンタを作らせようとしていました。 ところが、出来上がったのは、ワン・ホット・コードのカウンタ。 ワン・ホット・コードとは、ステート・マシンの個々の状態に対して一つのフリップ・フロップを割り当てる手法です。 このため、同時には単一のフリップ・フロップ出力がホットになる(アサートされる)ので、この名前で呼ばれています。
ワン・ホット・コードの利点は、状態コードをデコードする論理が不要なので、デコード回路が縮小できることです。 また、欠点は、フリップ・フロップの数が増えることです。 CPLD の場合には、デコード回路とフリップ・フロップの比率がはじめから決まっているので、双方を天秤にかけることになると思います。
ジョンソン・カウンタにしておくれ
ワン・ホット・コードなんか使っていられるか。 という向きには、 "syn_encoding" という属性を付けて、別のコーディングを使うこともできます。 以下の例では、ジョンソン・カウンタで構成させています。
: reg q; // synthesis syn_encoding = "johnson" reg[1:0] st; always @(posedge clk or negedge reset_b) begin if (!reset_b) begin :
出来上がった状態遷移表がこれです。 もうひとつ、納得できない割り当てだなあ。
ST_0 0 0 ST_1 1 0 ST_3 1 1 ST_2 0 1
設定選択肢には、 "gray" (グレイ・コード)や "compact" (最小ビット数)なんてのもありますが、4状態の場合にはどれもジョンソンと同じになってしまうので、ここでは省略。 論理合成ツールが信用できない場合には、 "user" を指定すると、 HDL に記述したとおりのコードを割り当ててくれます。
論理合成時の設定を変えることもできる
逐一、論理合成の方法を指定していられないという場合には、すべての論理合成で使用される設定を変更することも出来ます。
まず、 Task ペインの "Compile Design → Analysis & Synthesis → Edit Settings" から "Analysis & Synthesis Settings" ダイアログを開きます。 さらに、そのダイアログの "More Settings..." ボタンで "More Analysis & Synthesis Settings" ダイアログを』開きます。 このダイアログで "State Machine Processing" を変更します。 深すぎだよ。
初期設定は、 "Auto" となっています。 マニュアルによれば、 "Auto" を設定すると、「FPGA の場合にはワン・ホット・コードを使い、 CPLD の場合には最小ビット数を使う」と書いてあります。 あれ? 何で、ワン・ホット・コードを使ってくれたんだろう?
ワン・ホット・コードの問題点
ワン・ホット・コードは、 FPGA などに適用すると、論理が簡単になるという利点はあるのですが、状態遷移のときに必ず二つのフリップ・フロップが状態を変えます。 そのため、ステート・マシンの状態をデコードして出力を得るような場合には、状態遷移時にグリッチが発生する可能性があります。 また、他の設定でもヘタなコード割り当てをすると同じ問題が起こります。 次回は、シミュレータでグリッチが発生する様子が観測出来るか試してみます。
参考サイト
- Quartus II Development Software Literature
-
ステート・マシンの選択肢に関する説明は、"Volume 1: Design and Synthesis → Section III. Synthesis → Chapter 8. Quartus II Integrated Synthesis" の "State Machine Processing" (page 8-35) と "Manually Specifying State Assignments Using the syn_encoding Attribute" (page 8-36) に記述があります。
参考文献
トランジスタ技術 (Transistor Gijutsu) 2008年 12月号 [雑誌]
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2008/11/10
- メディア: 雑誌
付録 : 「Quartus で遊ぼう」索引
- Quartus で遊ぼう (1)
- Altera の EPM2210F324 が話題になっているので、私も使ってみました。 ただし、ハードウェアは購入していないので、ソフトウェアで遊んだだけです。
- Quartus で遊ぼう (2)
- 「Quartus で遊ぼう」の二回目は、組み合わせ論理回路の合成を調べます。
- Quartus で遊ぼう (3)
- 論理合成後の状態を表示してくれるツールを探しました。
- Quartus で遊ぼう (4)
- 前回作成した4値のアップ・ダウンカウンタで論理合成後に使われているフリップ・フロップは、何個(何ビット)でしょうか?
- Quartus で遊ぼう (5)
- 今回は、ワン・ホット・コードを使ったステート・マシンでグリッチが発生すかどうかを観測します。
- Quartus で遊ぼう (6)
- トランジスタ技術誌に「リセット信号生成回路」のHDL記述がありました。 この記述は、ちょっともったいないですよ。
- Quartus で遊ぼう (7)
- トランジスタ技術誌に書かれていたインストラクション・デコーダは、3項演算子が連なっていました。 もっと、別の書き方はできないかな。
- Quartus で遊ぼう (8)
- Verilog の代入には、 <= と = の二種類が使われています。 これって、何が違うんでしょうかね。
- Quartus で遊ぼう (9)
- 2進数の足し算で、キャリーを取り出したい時、どうしましょうか。
- Quartus で遊ぼう (10)
- 作らせてみました。 リップル・キャリーカウンタ。
- Quartus で遊ぼう (11)
- 先ごろ、請求していた"DVD"が届きました。
コメント 0