Quartusで遊ぼう (9) [プログラム三昧]
2進数の足し算で、キャリーを取り出したい時、どうしましょうか。
トランジスタ技術誌の回答例
トランジスタ技術の記事で使用されていた例では、4bit + 4bit + 1bit の全加算器の出力を 5bit のワイヤに割り当てて、さらに sum 部と carry 部に分けていました。
assign work[4:0] = dat1[3:0] + dat2[3:0] + cin; assign cout = work[4]; assign out[3:0] = work[3:0];
もちろん、これでも答えは得られるのですが、 Verilog では、別の書き方が出来ます。
Verilog流の回答例
それは、 Perl にも似た文法です。
assign {cout,out[3:0]} = dat1[3:0] + dat2[3:0] + cin;
カーリー・ブラケット(中括弧?)は、複数のビット列を結合して束ねる機能なのですが、 Verilog では、右辺式ばかりでなく、左辺式にも使うことが出来ます。 このため、この一行だけで目的は達せられます。 ハーフ・キャリーつきの 8bit 加算も二行で書けます。
assign { dc,out[3:0]} = dat1[3:0] + dat2[3:0] + cin; assign {cout,out[7:4]} = dat1[7:4] + dat2[7:4] + dc;
合成してみたけれど
この回路は、単なる全加算器の回路なので、 Logic Element (LE) が8個使用されるだけと期待していたのですが、実際に合成してみると、12個の LE が使用されていました。
そこで、「テクノロジ・マップ」を表示させた結果がこれです。 これは、下位 4bit から上位 4bit にハーフキャリーを渡している箇所なのですが、なぜか、二つの LE がバッファとして使用されています。 これと同じバッファが最下位キャリーと最上位キャリーにも追加されているので、バッファに使用されている LE は合計4個もあります。 これに全加算器の分、8個を加えて12個という内訳です。
なぜ、バッファが挿入されたのかをオンライン・マニュアルで探しました。 まだ、はっきりとはしていませんが、キャリーが直接外部端子に出てくるときにバッファが挿入されているようです。 また、確認してみなきゃ。
参考文献
トランジスタ技術 (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