本章では、前回に学習した組合せ回路をさらに詳細に見ていきます。
VHDLは厳格な型を持つ言語です。型は機能ライブラリの中で定義されています。2入力1出力のセレクタ回路「mux21.vhd」の入出力ポートの宣言で用いている「std_logic」は、「0, 1, X (unknown), Z (high impedance)」 などの 9 値をとることができる標準の型で、IEEE 1164 のライブラリで定義されています。主に以下の表に示すような演算があります。
VHDLの演算子等
演算子など 意味 使用例 and AND a and b or OR a or b nand NAND a nand b nor NOR a nor b not NOT not a xor EXOR a xor b & ビット連接 a & b (2 ビットのデータ) ( downto ) 多ビット数 a(3 downto 0) はa(3) & a(2) &
a(1) & a(0) ( downto ) 部分ビット a(3 downto 2) はa(3) &
a(2) '0', '1' 定数 " " 2 進定数 "0001", "0011" X" " 16 進定数 X"f8a3"
VHDLでは、値を保持する要素として、シグナル (「signal」で宣言) と変数 (「variable」で宣言) の 2 種類があります。多くの場合、シグナルは記憶素子、変数は記憶を持たない配線素子に対応しますが、必ずしもシグナルがレジスタになり変数が配線になるとは限りません。代入文の記号は、シグナルへの代入では
<=
変数への代入では
:=
を用います。
VHDLの文法とは、基本的な構文にすぎません。通常用いる型や演算子などは「ライブラリ」として提供されます。これまでの例でも、entity宣言の前に「IEEE 標準 (Std. 1164) ライブラリ」を呼び出して用いてきました。「std_logic, std_logic_vector」といった基本的な型も IEEE ライブラリで定義されており、「ieee.std_logic_1164」を呼び出すことにより使用できます。
「ieee.std_logic_unsigned」は、「std_logic_vector」などを符号無し2進数と見て扱うための加減算などの演算子が定義されています。他にも、実装するデバイス (特に FPGA など) に特有の機能に応じてライブラリが用意されていることがあります。
以下に「ieee.std_logic_unsigned」の演算子を用いた加算回路の記述「adder8.vhd」を示します。論理合成後にこの記述がどのような加算回路となるかは、合成系に依存します。Synopsys Design Compiler では、回路全体の遅延時間などの制約に依存して、順次桁上げ加算器になるか、桁上げ先見加算器になるかが選択されます。乗除算などの演算子は用意されていないこともありますが、用意されている場合でも、回路規模が大きくなるため注意する必要があります。
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity adder8 is port ( op1, op2: in std_logic_vector(7 downto 0); result: out std_logic_vector(7 downto 0) ); end adder8; architecture behavior1 of adder8 is begin result <= op1 + op2; end behavior1; |
IEEE ライブラリを用いた 8 ビット加算器「adder8.vhd」
課題:この「adder8.vhd」について、アナライズ、シミュレーション、論理合成を行って下さい。またFPGAへダウンロードできるように書き直し、ボード上で動作を検証して下さい。
答え
上記の8ビット加算器の回路を論理合成すると、回路図が出来上がりますが、これがどのような回路なのかを評価する方法について述べます。デザインアナライザ上で以下のような回路が出来上がったとします。
デザインアナライザ上に実現された8ビット加算器の回路図
この回路のどこでどれだけの処理時間がかかっているのでしょうか? デザインアナライザでは、最も時間がかかる経路を画面に表示させることができます。まず初めにテクノロジマッピングを行います。
Tools -> Design Optimization...
新たなウィンドウが表示されますが、何も変更せずにそのまま「OK」ボタンを押します。するとテクノロジマッピングが完了します。次にデザインアナライザ上で
Analysor -> High light -> Critical path
と選択すると、最も時間がかかる経路(Critical Path)を表示させることができます。
表示されたCritical Path
さてここで、「Setup -> Command Window...」でコマンドウィンドウを表示させます。
コマンドウィンドウ
コマンドウィンドウの最下部のコマンドラインに「report_timing」(遅延時間)と入力してみましょう。すると各セルでどれだけの遅延時間があるのかを表示することができます。
コマントウィンドウ
上記の例では、全遅延時間は「10.08」であることがわかります。また各セルでの遅延時間も表示されています。これをさらに最適化する(もっと遅延時間を短くする)にはどうしたらよいのでしょうか? それにはもう一度、マッピングしなおすことです。デザインアナライザの初期画面(アナライザの画面左に上下の矢印がありますが、上向きの矢印を押し続けて最後に出てくる画面)に戻り、コマンドウィンドウのコマンドラインに
組合せ回路の場合 |
set_max_delay 5 -to all_outputs() |
順序回路の場合 |
create_clock -period 1 -name clk {clk} set_max_delay 1 -to all_outputs() + all_registers(-data_pins) |
注1:create_clockで設定する時間(上記の例の「1」)は、set_max_delayで設定する時間(上記の例の「1」)より大きくなければならない
注2:create_clockの「clk」はクロックのこと。もし各自がクロック信号として他の変数を使用している場合には、それに変更する。
と入力してみて下さい。するとデザインアナライザは「最大遅延時間が5ナノ秒以内」になるように設定しなおします。その後、再度、最適化
「Tools -> Design Optimization...」
を行うと、デザインアナライザはマッピングしなおします。出来上がった回路を表示して、「report_timing」で遅延時間を確認して下さい。どのようになったでしょうか? なお遅延時間を急に短くしようとするとデザインアナライザはうまく回路をマッピングできないので、指定する最大遅延時間を少しずつ短くしていくことがコツです。