HDLは抽象度の高い表現で「回路構成」や「回路機能」の記述ができるため、いとも簡単に加算器を作ることができる。
前回の宿題【問題2】は、“4ビット加算器をVerilog HDLで作成する”という問題でした。皆さん解けましたでしょうか?
解けた方も解けなかった方も答え合わせをして、次項の解説までぜひ読んでみてください。毎週コツコツ問題を解いて、ハードウェア記述言語によるデジタル回路設計の基礎知識を身に付けましょう。
それでは、解答を発表します!
4ビット加算器については、連載「完全マスター! 電子回路ドリルII」の【問題8】の解説で紹介しました。
Verilog HDLを使うと、「半加算器(half adder)」や「全加算器(full adder)」などを考える必要はなく、単に
assign {carry, X} = A + B;
と記述するだけで、加算器を作ることができます。いかがですか? とても簡単ですよね。
それでは、詳しく問題を解説していきます。
図1は【問題2】で示した4ビット加算器です。ポートのA、B、Xは4ビット(4本)の信号線です。従って、ビット幅の指定が必要になります。
外部と接続する信号の宣言、すなわちポートの入出力宣言は、
input [ MSB : LSB ] ポート名 , ポート名 , ・・・ ;
output [ MSB : LSB ] ポート名 , ポート名 , ・・・ ;
です。これがVerilog HDLの記述スタイルです。大括弧(“[”と“]”)で囲まれた部分にビット幅を指定します。「MSB(Most Significant Bit)」には最上位のビット番号を、「LSB(Least Significant Bit)」には最下位のビット番号をコロン(“:”)で区切って指定します。
【問題2】の場合は、
input [3:0] A, B; output [3:0] X; output carry;
となります。carryは1ビットなのでビット幅の指定はしません。このようにビット幅の異なる信号を個別に宣言します。
モジュール内で使用する信号の宣言、すなわちwire宣言も同様にビット幅を指定します。
wire [ MSB : LSB ] 信号名 , 信号名 , ・・・ ;
【問題2】の場合は、
wire [3:0] A, B, X; wire carry;
となります。
加算器は【問題1】と同様にassign文を使って定義します。
assign {carry, X} = A + B;
Verilog HDLでは、信号を中括弧(“{”と“}”)で囲むことで、その信号を連結できます。結果、carryには5ビット目の「けた上がり」がセットされます(図2)。
以上のように「HDLでは抽象度の高い表現で回路構成や回路機能の記述ができる」ため、いとも簡単に加算器を作ることができます。
HDLの記述は、「論理合成ツール」によって実際の回路に変換されます(図3)。この論理合成ツールには、過去の回路設計技術が詰まっているため、活用することで効率よく回路を生成できます。
こう聞くと「論理合成ツール=万能」と勘違いしてしまうかもしれませんが、論理合成ツールは万能ではありません。実は、すべてのHDLの記述が回路に変換できるわけではありません。
例えば、Verilog HDLの算術演算子には表1に示すようなものがありますが、この中の「除算」と「剰余」は回路にすることができません。そのため、HDLで回路を作成する場合は、「論理合成可能なレベル」で記述する必要があります。
以下のOR回路(Verilog HDL)を連載「触って学ぼう FPGA開発入門」で扱ったFPGAボード「FPGAトレーナ EDX-002」で動作させたところ、以下の表のようにANDで動作しました。これはなぜでしょうか?
答え. 解答はこちら(←クリック)
Copyright © ITmedia, Inc. All Rights Reserved.