1.28k likes | 1.36k Views
VHDL設計演習 Ⅰ 入 門 編 広島県立西部工業技術センター. 1.作業ディレクトリの作成 まず、エクスプローラを起動し、 ルートディレクトリの下にseminarというディレクトリを、 その下にVHDLというディレクトリを作成して下さい。 ( DOS/V の場合) C:¥seminar¥VHDL (98の場合) A:¥seminar¥VHDL 以下、VHDL演習で作成するファイルはVHDLの下に作ります。 それ以外の、ディレクトリには何も作らないで下さい。. A. B. F. C. D. 2.VHDLの基本ブロック.
E N D
VHDL設計演習Ⅰ 入 門 編 広島県立西部工業技術センター
1.作業ディレクトリの作成 まず、エクスプローラを起動し、 ルートディレクトリの下にseminarというディレクトリを、 その下にVHDLというディレクトリを作成して下さい。 (DOS/Vの場合) C:¥seminar¥VHDL (98の場合) A:¥seminar¥VHDL 以下、VHDL演習で作成するファイルはVHDLの下に作ります。 それ以外の、ディレクトリには何も作らないで下さい。
A B F C D 2.VHDLの基本ブロック 例題1 aoiゲート aoi.vhd library ieee; use ieee.std_logic_1164.all; entity aoi is port(a,b,c,d:in std_logic; f :out std_logic); end aoi; architecture aoi_body of aoi is begin f<=not((a and b)or(c and d)); end aoi_body;
(1)VHDLの基本ブロックはエンティティとアーキテクチャ。 (2)エンティティは ブロックの名前(これをエンティティ名と呼ぶ。) 入出力ピン名とその方向,ビット幅など ブロックを外部から見た場合の仕様を記述する部分。 (3)アーキテクチャはブロックの内部表現, 論理回路としての構造を記述する部分。 (4)上の例ではaoiがエンティティ名、aoi_bodyがアーキテクチャ名。 (5)libraryは使用するライブラリ名を, useはライブラリ中の使用するパッケージ名を宣言する。 両方とも決まり文句と思ってよい。 (6)入出力ピン宣言はエンティティのport部分で行い, 入 力 = in std_logic 出 力 = out std_logic 双方向 = inout std_logic (7)簡単な機能は,信号代入文<=で記述する。 (8)VHDLのビット演算子は論理演算子と共用で and or not xor が使える。 (9)わかりやすい様に( )を使ってよい。 参照:長谷川テキストp17~23
クイックロジック社QuickWorks 配置配線ツールSpDE 兼 統合化環境 回路図入力 SYNARIO 論理合成 Synplify Verilogシミュレータ SILOSⅢ Verilog学習 VHDL学習 HDLエディタ ターボライタ
3.SpDEの起動 スタート - プログラム - QuickLogic ー SpDEで SpDEを起動します。
4.HDLエディタの起動 SpDEのツールバーから、HDLエディタのアイコン を 押して、HDLエディタを起動し、クリエイトアイコン を押す。
5.VHDLコードの入力、保存 例題1のVHDLコードを入力し、FileーSaveAsメニューから ¥seminar¥VHDLの下に、ファイル名aoi.vhdで保存する。 拡張子が定まると、entity、architectureなどのVHDLキーワード が紺色でハイライトされます。紺色は見にくいのでHDLエディタの Window-ColorsーKeyword で、青色に変更して下さい。 File-ExitでHDLエディタを終了し、SpDEに戻ります。 6.論理合成Synplifyの起動 SpdeのFile-Import-VHDLメニューから ¥seminar¥VHDL¥aoi.vhdを指定し、論理合成ツールを 起動します。
7.ターゲットデバイスの指定と論理合成 RUNボタンのすぐ上のChangeボタンを押して、 Partをp8x12b、Packageをpl44に変更し、OKを押します。 次に、RUNボタンを押して、論理合成をかけます。
8.エラーの修正 ソースファイルにエラーがあると、下の画面で停止します。 ViewLogボタンでエラー内容を確認した後、Editボタンを 押して、HDLエディタを再度起動し、エラー箇所を修正します。
9.論理合成プロジェクトの保存 エラーがなければDoneが表示されて、下の画面で停止します。 「はい」を選んで論理合成プロジェクトを保存し、SpDEに戻ります。
10.配置配線の実行 SpDEのツールバーからRunToolsアイコン を押して、 配置配線を実行します。途中、RUNと「いいえ」を選択します。
11.配置配線結果の確認 SpDEツールバーからFullFitアイコン を選択し、 チップ全体を表示させます。
次に、View-NormalFitメニューを選択し、Zカーソルを 次に、View-NormalFitメニューを選択し、Zカーソルを 回路のある部分でクリックして、回路部分を拡大表示します。 さらに拡大したければZoomInアイコン を使います。
回路部分のみを拡大すると、下図のようになります。 回路部分のみを拡大すると、下図のようになります。 台形印のセレクタはr=s・p+s・qを表しますので、全体として a・b=1またはc・d=1の時 f=0 それ以外の時 f=1 となり、最初のVHDLコードを満す回路が生成されていること が分かります。 s f p b r a q 入力s 出力r 0 p 1 q ※論理合成結果を確認したら、 File-Saveメニューで結果を 保存します。 d c
12.ここで、この後のシミュレーションのために、シミュレータ・12.ここで、この後のシミュレーションのために、シミュレータ・ タイプを変更しておきます。 SpDEツールバーからToolOptionsボタン を押して、 BackAnnotationタブのSimulatorを Vital3.0 Compliant に変更してから、SaveSettingしてから、OKを押します、
AB A O B F C D CD 13.基本ブロック(続き) HDLエディタを起動し、aoi.vhdを次のように修正します。 library ieee; use ieee.std_logic_1164.all; entity aoi is port(a,b,c,d:in std_logic; f :out std_logic); end aoi; architecture aoi_body of aoi is signal ab,cd,o:std_logic; begin -- f<=not((a and b)or(c and d)); ab<=a and b; cd<=c and d; o <=ab or cd; f <= not o; end aoi_body;
(1)やや複雑な機能は、signal宣言したローカル信号を使う(1)やや複雑な機能は、signal宣言したローカル信号を使う ことができる。上の例ではab,cd,oがローカル信号。 ローカル信号はアーキテクチャ内部でのみ有効。 (2)VHDLには暗黙宣言はない。 (3)--は1行のみのコメント行。 VHDLには、Verilogの/* */の様に 複数行を一度にコメントアウトする方法はない。 修正が終わったらソースコードを保存し、論理合成をかけて 配置配線を実行して下さい。結果は同じになります。
問題1 インバータLS04.vhdを設計し、結果を確認しなさい。 問題2 NANDゲートLS00.vhdを設計し、結果を確認しなさい。 問題3 NORゲートLS02.vhdを設計し、結果を確認しなさい。
SEL g2 A g3 O g1 AOI F SELB B 14.階層設計 例題2 マルチプレクサ mux2.vhd library ieee; use ieee.std_logic_1164.all; -- inverter --- entity inv is port(a:in std_logic; f:out std_logic); end inv; architecture inv_body of inv is begin f<=not a; end inv_body; --------------------------------------- library ieee; use ieee.std_logic_1164.all; -- multiplexer -- entity mux2 is port(sel,a,b:in std_logic; f :out std_logic); end mux2; architecture mux2_body of mux2 is component inv port(a:in std_logic; f:out std_logic); end component; component aoi port(a,b,c,d:in std_logic; f :out std_logic); end component; signal selb,o:std_logic; begin g1:inv port map(sel,selb); g2:aoi port map(sel,a,selb,b,o); g3:inv port map(o,f); end mux2_body;
(1)もっと複雑な回路記述には、階層設計を使う。 (2)階層設計は複数のエンティティ,アーキテクチャ宣言と コンポーネント宣言およびコンポーネントインスタンスを使う。 (3)複数のエンティティ,アーキテクチャ宣言は invの様に同一ファイル内に書いても良いし, aoiの様に別ファイルに書いても良い。 ただし、libraryとuseはエンティティ毎に必要。 (4)コンポーネントインスタンスは,サブルーチンコールの様なもので, g1,g2,g3の様に インスタンス名:コンポーネント名 port map(ポートリスト); の形式で行う。verilogとは順序が逆なのに注意。 参照:長谷川テキストp24~26
(5)コンポーネントインスタンスのポートリストは、(5)コンポーネントインスタンスのポートリストは、 呼び出す側と呼び出される側のポートを接続するもので, 上の例の様に並びによる接続が一般的。 次の例の様に名前による接続も使える。 g3:inv port map(a=>o,f=>f); 出力信号を接続しない場合は、予約語openを使う。 (6)コンポーネント・インスタンスをするためには, アーキテクチャ内で予めコンポーネント宣言して おかなければならない。 component コンポーネント名 port(ポートリスト); end component; の形式で行う。エンティティ宣言からisを取ったのと同じ形式。 C言語のプロトタイプ宣言に似た概念。 コンポーネント宣言時の信号名は、エンティティ宣言時と 同じであること。
(7)メインブロックmux2のサブブロックaoiは、別ファイルに入って(7)メインブロックmux2のサブブロックaoiは、別ファイルに入って いるので、下図のようにSynplifyで2つのファイルを指定して 論理合成します。ファイルを追加するにはAddボタンを使います。 この時、メインのmux2が一番下に来るように指定します。
例題2を入力し、論理合成、配置配線を実行します。例題2を入力し、論理合成、配置配線を実行します。 結果は、論理圧縮の効果で例題1より簡単になり、 下図のようになります。 sel=1なら f=a sel=0なら f=b となっています。 b a sel f
15.条件付き信号代入文 例題3 セレクタ mux21.vhd library ieee; use ieee.std_logic_1164.all; -- multiplexer -- entity mux21 is port(sel,a,b:in std_logic; f :out std_logic); end mux21; architecture v1 of mux21 is begin f <= a when (sel='1') else b; end v1; mux21 sel a f b ※後のシミュレーションの為に ファイル名、エンティティ名とも 必ず、mux21にして下さい。 ファイル名とエンティティ名が 一致しないと、遅延シミュレー ション時にエラーが出ます。
(1)前の例(mux2)では,階層設計を説明するため,複雑な(1)前の例(mux2)では,階層設計を説明するため,複雑な 書き方をしたが,セレクタ自体はもっと簡単に記述できる。 (2)信号代入文<=には,C言語の条件演算子に似た 条件付信号代入文があり, 左辺<=(右辺1) when (条件式) else (右辺2); が使える。 (3)上の例では,sel=1ならf=a,sel=0ならf=bになる。 (4)条件式に使う関係演算子は = 等しい > 大 >= 以上 /= 等しくない < 小 <= 以下 が使え,それらの論理演算 AND 論理積 OR 論理和 NOT 論理否定 も使える。 (5)1ビット幅の定数は '1' '0' と書く。
mux21 sel a f b 16.process文とif文 例題3 セレクタ mux21.vhd library ieee; use ieee.std_logic_1164.all; -- multiplexer -- entity mux21 is port(sel,a,b:in std_logic; f :out std_logic); end mux21; architecture v2 of mux21 is begin process(sel,a,b) begin if(sel='1') then f<=a; else f<=b; end if; end process; end v2;
(1)条件演算子よりもわかりやすいif文もあるが,(1)条件演算子よりもわかりやすいif文もあるが, アーキテクチャ内にダイレクトに書くことはできない。 上の例の様にprocessブロックの中で記述する。 (verilogのalwaysブロックに相当) (2)process文は process(信号名) begin : end process; の形で記述し,( )内の信号名が変化したときのみ評価される。 つまり( )内にはprocessブロックとしての入力信号を記述する。 これをセンシティビティ・リストという。 複数の入力信号が有る場合は,カンマで区切って記述する。 (3)processブロックで組合せ回路を生成する場合,入力信号を 全てセンシティビティ・リストに記述しなければならない。 (順序回路の場合はそうとは限らない。)
(4)processブロック内では,if文,case文が使え if(条件式) then 式1; else 式2; end if; と書く。(then と end if がある点が,verilogと違う)。 多重ifは, if(条件式1) then 式1; elsif(条件式2) then 式2; else 式3; end if; と書く。elseif でない点に、特に注意。 (5)if文で全ての条件が列挙されていれば組合せ回路, そうでなければ順序回路が生成されるのはverilogと同じ。 例題3を入力し、論理合成、配置配線を実行します。 結果は例題2と同じになります。
VHDL設計演習Ⅱ シミュレーション編 広島県立西部工業技術センター
1.テスト・ベンチの準備 例題3の設計mux21.vhdを、VHDLシミュレータを用いて検証します。 設計検証用テストパターンを発生させるVHDLコードのことを テスト・ベンチと呼びます。拡張子は通常 .tb を使います。 HDLエディタでmux21.vhdを開いた状態で、 HDLー GenerateTestBench を実行すると、テストベンチの雛形mux21.tbが生成されます。 ※遅いマシンでは数分かかることもあります。 library ieee; use ieee.std_logic_1164.all; ①ENTITY TestBench IS END TestBench; ②ARCHITECTURE HTWTestBench OF TestBench IS ③COMPONENT mux21 PORT (sel,a,b:in std_logic; f :out std_logic); END COMPONENT; ④SIGNAL selSignal,aSignal,bSignal: std_logic; ④SIGNAL fSignal : std_logic; BEGIN ⑤U1 : mux21 PORT MAP (sel => selSignal, a => aSignal, b => bSignal, f => fSignal); ⑥ ②END HTWTestBench;
①テストベンチのエンティティには、ポートリストが有りません。①テストベンチのエンティティには、ポートリストが有りません。 エンティティ名は何でもかまいませんが、ここではTestBenchです。 ②アーキテクチャ名は何でもかまいませんが、 ここではHTWTestBenchです。 ③シミュレーション対象であるmux21をコンポーネント宣言します。 ④入力信号、出力信号ともに、シグナル宣言します。信号名は 元の信号名にSignalをつけたものが自動生成されています。 ⑤シミュレーション対象mux21をコンポーネント・インスタンスとして、 呼び出します。信号の接続には、名前による接続が行われていま すが、並びによる接続でも構いません。 ⑥この位置に、実際のテストパターン用コードを追加します。
それでは、⑥の位置に下記を追加して、 テストベンチを完成させてから、mux21.tbとして保存して下さい。 process begin selSignal <='0'; aSignal <='0'; bSignal <='0'; wait for 100ns; selSignal <='0'; aSignal <='0'; bSignal <='1'; wait for 100ns; selSignal <='0'; aSignal <='1'; bSignal <='0'; wait for 100ns; selSignal <='0'; aSignal <='1'; bSignal <='1'; wait for 100ns; selSignal <='1'; aSignal <='0'; bSignal <='0'; wait for 100ns; selSignal <='1'; aSignal <='0'; bSignal <='1'; wait for 100ns; selSignal <='1'; aSignal <='1'; bSignal <='0'; wait for 100ns; selSignal <='1'; aSignal <='1'; bSignal <='1'; wait for 100ns; wait; end process; この例で分かるように、テストベンチでの信号値の代入には process文とwait文を使用します。 意味としては、sel,a,bの初期値として全て0を代入した後、 100ns毎に異なる値を代入しています。最後のwaitが無いと、 800ns毎に同じ信号入力が繰り返されてしまいます。
2.機能シミュレーション(Pre-Layout)2.機能シミュレーション(Pre-Layout) (1)QuickWorksにはVHDLシミュレータは付属していないので、 Accolade社のPeakVHDLを使います。 スタート ー プログラム ー Accolade PeakVHDL ー PeakVHDL Version4 でPeakVHDLを立ち上げます。
(2)PeakVHDLは拡張子が*.vh*のファイルしか入力できない(2)PeakVHDLは拡張子が*.vh*のファイルしか入力できない ので、エクスプローラでテストベンチmux21.tbのファイル名を mux21.tb.vhdに変更して下さい。 (重要!!) (3)PeakVHDLのNewProjectアイコン を押して、新しいプロ ジェクトをオープンし、File-SaveProjectAsでこのプロジェクト に名前を付けます。ここでは¥seminar¥VHDL¥mux21.acc として保存します。
(4)AddModuleアイコン を押して、mux21.vhdと(4)AddModuleアイコン を押して、mux21.vhdと mux21.tb.vhdを選択します。
(5)Rebuildアイコン を押して、階層構造の再構築をし、(5)Rebuildアイコン を押して、階層構造の再構築をし、 モジュールの前に+マークが付くことを確認します。
(6)オプションボタン を押して、Optionsウインドウを(6)オプションボタン を押して、Optionsウインドウを 表示させます。 ①Compileタブの compile only if out of date をチェック無 ②Linkタブ の link only if out of date をチェック無 ③Simulateタブの Run to time を1000 Time unit を ns ④Systemタブの Save options as default をチェック有 に設定してから、OKを押して下さい。 ③以外は1回だけ行えば、結構です。 ③はこれから行うシミュレーション時間を1000nsに設定する ものですので、別の設計をシミュレーションするなど、シミュレ ーションすべき時間が変わった場合は、適宜、変更します。 ※シミュレーション時間は波形表示ウインドウ(10)で マウス右ボタンのoptionsからも変更できます。
① ② ③ ④
(7)mux21.tb.vhdをクリックして、ハイライトした状態で(7)mux21.tb.vhdをクリックして、ハイライトした状態で シミュレーションボタン を押します。エラーがあると トランスクリプト・ウインドウにエラーメッセージが表示されます。 エラーがなければ、(9)に進みます。
(8)mux21.vhdは論理合成のチェックを通っているので、(8)mux21.vhdは論理合成のチェックを通っているので、 エラーがあるとすれば、mux21.tb.vhdの方です。 エラーメッセージを確認後、mux21.tb.vhdをダブルクリック すると、エディタが立ち上がるので、エラー箇所を修正します。 修正が終わったら、File-SaveModuleで保存し、 mux21.tb.vhdウインドウのアイコン化ボタン でアイコン化 します。 シミュレーションボタン を押して、エラーがなければ、 (9)に進みます。 エラーが有れば、エラーメッセージ確認後、アイコン化していた mux21.tb.vhdを通常の大きさに戻し、修正を繰り返します。
(9)エラーがなければ、下の画面で停止するので、(9)エラーがなければ、下の画面で停止するので、 AddPrimariesボタンとCloseボタンを、この順番に押します。
(10)下の画面で停止するので、GOボタン を押します。(10)下の画面で停止するので、GOボタン を押します。 波形の一部が表示されるので、PeakSimウインドウの ツールバーからView-ZoomAllを選び、波形全体を 表示させます。
(11)sel=0の時 f=b、 sel=1の時 f=a を確認します。(11)sel=0の時 f=b、 sel=1の時 f=a を確認します。 ZoomINボタン を押して拡大しても、入力信号 a,b、selと 出力信号fには時間差がありません。 これは、現在表示している結果が遅延時間情報の入っていない 機能シミュレーション(Pre Layout)である為です。 結果を確認したら、PeakSimウインドウを閉じた後、 SaveProjectアイコン を押して、プロジェクトを保存します。
3.遅延シミュレーション(Post-Layout)3.遅延シミュレーション(Post-Layout) PeakVHDLで遅延シミュレーションを行うには、デバイスメーカ 各社が供給するVITALライブラリを、以下の(1)~(4)の手順で PeakVHDL用にコンパイルする必要があります。 VITALはVhdl Initiative Toward Asic Libarayの頭文字で、VHDL で遅延シミュレーションをするための手法の総称です。 (1)~(4)は1度だけ実行すれば、以後は必要ありません。 (1)まず、エクスプローラを起動して、 ¥ACC-EDA¥LIB4 の下に QLOGIC というディレクトリを作成します。 次に、クイックロジック社の供給するVITALライブラリ ¥PASIC¥SPDE¥DATA¥QLVTL95.VHD を、今作成したディレクトリ ¥ACC-EDA¥LIB4¥QLOGIC にコピーします。
(2)PeakVHDLのツールバーから、NewProject を押して、(2)PeakVHDLのツールバーから、NewProject を押して、 新しいプロジェクトをオープンし、File-SaveAsで ¥ACC-EDA¥LIB4¥QLOGIC¥QLOGIC.acc として名前を付けて、保存します。
(3)AddModuleアイコン でQLVTL95.VHDを追加し、(3)AddModuleアイコン でQLVTL95.VHDを追加し、 Rebuildアイコン でモジュールの前に+マークが付くことを、 確認します。
(3)QLVTL95.VHDをクリックしてハイライトした状態で、(3)QLVTL95.VHDをクリックしてハイライトした状態で、 Optionアイコン を押して、Compileタブの Compile into Libraryに QLPRIMS を設定します。
(4)QLVTL95.VHDをクリックしてハイライトした状態で、(4)QLVTL95.VHDをクリックしてハイライトした状態で、 コンパイル を押します。 エラーが無いことを確認後、 SaveProjectアイコン を押して、このプロジェクトを 保存します。これでライブラリQLPRIMSができました。
(5)ここからmux21.vhdの遅延シミュレーションを始めます。(5)ここからmux21.vhdの遅延シミュレーションを始めます。 NewProjectアイコン を押して、新しいプロジェクトを オープンし、File-SaveAsで ¥seminar¥vhdl¥mux21vtl.acc と名前を付けて、保存します。