1 / 128

VHDL設計演習 Ⅰ   入 門 編 広島県立西部工業技術センター

VHDL設計演習 Ⅰ   入 門 編 広島県立西部工業技術センター. 1.作業ディレクトリの作成  まず、エクスプローラを起動し、  ルートディレクトリの下にseminarというディレクトリを、  その下にVHDLというディレクトリを作成して下さい。 ( DOS/V の場合) C:¥seminar¥VHDL (98の場合) A:¥seminar¥VHDL 以下、VHDL演習で作成するファイルはVHDLの下に作ります。 それ以外の、ディレクトリには何も作らないで下さい。. A. B. F. C. D. 2.VHDLの基本ブロック.

moral
Download Presentation

VHDL設計演習 Ⅰ   入 門 編 広島県立西部工業技術センター

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. VHDL設計演習Ⅰ  入 門 編 広島県立西部工業技術センター

  2. 1.作業ディレクトリの作成  まず、エクスプローラを起動し、  ルートディレクトリの下にseminarというディレクトリを、  その下にVHDLというディレクトリを作成して下さい。 (DOS/Vの場合) C:¥seminar¥VHDL (98の場合) A:¥seminar¥VHDL 以下、VHDL演習で作成するファイルはVHDLの下に作ります。 それ以外の、ディレクトリには何も作らないで下さい。

  3. 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;

  4. (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

  5. クイックロジック社QuickWorks 配置配線ツールSpDE 兼 統合化環境 回路図入力 SYNARIO 論理合成 Synplify Verilogシミュレータ SILOSⅢ Verilog学習 VHDL学習 HDLエディタ ターボライタ

  6. 3.SpDEの起動  スタート - プログラム - QuickLogic ー SpDEで SpDEを起動します。

  7. 4.HDLエディタの起動 SpDEのツールバーから、HDLエディタのアイコン   を 押して、HDLエディタを起動し、クリエイトアイコン   を押す。

  8. 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を指定し、論理合成ツールを 起動します。

  9. 7.ターゲットデバイスの指定と論理合成  RUNボタンのすぐ上のChangeボタンを押して、 Partをp8x12b、Packageをpl44に変更し、OKを押します。 次に、RUNボタンを押して、論理合成をかけます。

  10. 8.エラーの修正  ソースファイルにエラーがあると、下の画面で停止します。 ViewLogボタンでエラー内容を確認した後、Editボタンを 押して、HDLエディタを再度起動し、エラー箇所を修正します。

  11. 9.論理合成プロジェクトの保存  エラーがなければDoneが表示されて、下の画面で停止します。 「はい」を選んで論理合成プロジェクトを保存し、SpDEに戻ります。

  12. 10.配置配線の実行  SpDEのツールバーからRunToolsアイコン   を押して、 配置配線を実行します。途中、RUNと「いいえ」を選択します。

  13. 11.配置配線結果の確認  SpDEツールバーからFullFitアイコン   を選択し、 チップ全体を表示させます。

  14.  次に、View-NormalFitメニューを選択し、Zカーソルを 次に、View-NormalFitメニューを選択し、Zカーソルを 回路のある部分でクリックして、回路部分を拡大表示します。  さらに拡大したければZoomInアイコン   を使います。

  15.  回路部分のみを拡大すると、下図のようになります。 回路部分のみを拡大すると、下図のようになります。 台形印のセレクタは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

  16. 12.ここで、この後のシミュレーションのために、シミュレータ・12.ここで、この後のシミュレーションのために、シミュレータ・ タイプを変更しておきます。  SpDEツールバーからToolOptionsボタン   を押して、 BackAnnotationタブのSimulatorを Vital3.0 Compliant に変更してから、SaveSettingしてから、OKを押します、

  17. 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;

  18. (1)やや複雑な機能は、signal宣言したローカル信号を使う(1)やや複雑な機能は、signal宣言したローカル信号を使う   ことができる。上の例ではab,cd,oがローカル信号。   ローカル信号はアーキテクチャ内部でのみ有効。 (2)VHDLには暗黙宣言はない。 (3)--は1行のみのコメント行。   VHDLには、Verilogの/*    */の様に   複数行を一度にコメントアウトする方法はない。 修正が終わったらソースコードを保存し、論理合成をかけて 配置配線を実行して下さい。結果は同じになります。

  19. 問題1  インバータLS04.vhdを設計し、結果を確認しなさい。 問題2  NANDゲートLS00.vhdを設計し、結果を確認しなさい。 問題3  NORゲートLS02.vhdを設計し、結果を確認しなさい。

  20. 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;

  21. (1)もっと複雑な回路記述には、階層設計を使う。 (2)階層設計は複数のエンティティ,アーキテクチャ宣言と  コンポーネント宣言およびコンポーネントインスタンスを使う。 (3)複数のエンティティ,アーキテクチャ宣言は invの様に同一ファイル内に書いても良いし, aoiの様に別ファイルに書いても良い。   ただし、libraryとuseはエンティティ毎に必要。 (4)コンポーネントインスタンスは,サブルーチンコールの様なもので, g1,g2,g3の様に インスタンス名:コンポーネント名 port map(ポートリスト);   の形式で行う。verilogとは順序が逆なのに注意。 参照:長谷川テキストp24~26

  22. (5)コンポーネントインスタンスのポートリストは、(5)コンポーネントインスタンスのポートリストは、   呼び出す側と呼び出される側のポートを接続するもので,   上の例の様に並びによる接続が一般的。   次の例の様に名前による接続も使える。 g3:inv port map(a=>o,f=>f);   出力信号を接続しない場合は、予約語openを使う。 (6)コンポーネント・インスタンスをするためには,   アーキテクチャ内で予めコンポーネント宣言して   おかなければならない。 component コンポーネント名 port(ポートリスト); end component;   の形式で行う。エンティティ宣言からisを取ったのと同じ形式。   C言語のプロトタイプ宣言に似た概念。    コンポーネント宣言時の信号名は、エンティティ宣言時と   同じであること。

  23. (7)メインブロックmux2のサブブロックaoiは、別ファイルに入って(7)メインブロックmux2のサブブロックaoiは、別ファイルに入って   いるので、下図のようにSynplifyで2つのファイルを指定して   論理合成します。ファイルを追加するにはAddボタンを使います。   この時、メインのmux2が一番下に来るように指定します。

  24. 例題2を入力し、論理合成、配置配線を実行します。例題2を入力し、論理合成、配置配線を実行します。 結果は、論理圧縮の効果で例題1より簡単になり、 下図のようになります。 sel=1なら f=a sel=0なら f=b となっています。 b a sel f

  25. 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にして下さい。  ファイル名とエンティティ名が 一致しないと、遅延シミュレー ション時にエラーが出ます。

  26. (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' と書く。

  27. 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;

  28. (1)条件演算子よりもわかりやすいif文もあるが,(1)条件演算子よりもわかりやすいif文もあるが,   アーキテクチャ内にダイレクトに書くことはできない。   上の例の様にprocessブロックの中で記述する。   (verilogのalwaysブロックに相当) (2)process文は process(信号名) begin : end process;   の形で記述し,( )内の信号名が変化したときのみ評価される。   つまり( )内にはprocessブロックとしての入力信号を記述する。   これをセンシティビティ・リストという。   複数の入力信号が有る場合は,カンマで区切って記述する。 (3)processブロックで組合せ回路を生成する場合,入力信号を 全てセンシティビティ・リストに記述しなければならない。   (順序回路の場合はそうとは限らない。)

  29. (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と同じになります。

  30.  VHDL設計演習Ⅱ シミュレーション編 広島県立西部工業技術センター

  31. 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;

  32. ①テストベンチのエンティティには、ポートリストが有りません。①テストベンチのエンティティには、ポートリストが有りません。  エンティティ名は何でもかまいませんが、ここではTestBenchです。 ②アーキテクチャ名は何でもかまいませんが、   ここではHTWTestBenchです。 ③シミュレーション対象であるmux21をコンポーネント宣言します。 ④入力信号、出力信号ともに、シグナル宣言します。信号名は   元の信号名にSignalをつけたものが自動生成されています。 ⑤シミュレーション対象mux21をコンポーネント・インスタンスとして、  呼び出します。信号の接続には、名前による接続が行われていま  すが、並びによる接続でも構いません。 ⑥この位置に、実際のテストパターン用コードを追加します。

  33.  それでは、⑥の位置に下記を追加して、 テストベンチを完成させてから、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毎に同じ信号入力が繰り返されてしまいます。

  34. 2.機能シミュレーション(Pre-Layout)2.機能シミュレーション(Pre-Layout) (1)QuickWorksにはVHDLシミュレータは付属していないので、 Accolade社のPeakVHDLを使います。  スタート  ー プログラム ー Accolade PeakVHDL ー PeakVHDL Version4  でPeakVHDLを立ち上げます。

  35. (2)PeakVHDLは拡張子が*.vh*のファイルしか入力できない(2)PeakVHDLは拡張子が*.vh*のファイルしか入力できない   ので、エクスプローラでテストベンチmux21.tbのファイル名を  mux21.tb.vhdに変更して下さい。      (重要!!) (3)PeakVHDLのNewProjectアイコン   を押して、新しいプロ   ジェクトをオープンし、File-SaveProjectAsでこのプロジェクト   に名前を付けます。ここでは¥seminar¥VHDL¥mux21.acc   として保存します。

  36. (4)AddModuleアイコン   を押して、mux21.vhdと(4)AddModuleアイコン   を押して、mux21.vhdと mux21.tb.vhdを選択します。

  37. (5)Rebuildアイコン   を押して、階層構造の再構築をし、(5)Rebuildアイコン   を押して、階層構造の再構築をし、 モジュールの前に+マークが付くことを確認します。

  38. (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からも変更できます。

  39. ② ③ ④

  40. (7)mux21.tb.vhdをクリックして、ハイライトした状態で(7)mux21.tb.vhdをクリックして、ハイライトした状態で シミュレーションボタン    を押します。エラーがあると トランスクリプト・ウインドウにエラーメッセージが表示されます。 エラーがなければ、(9)に進みます。

  41. (8)mux21.vhdは論理合成のチェックを通っているので、(8)mux21.vhdは論理合成のチェックを通っているので、 エラーがあるとすれば、mux21.tb.vhdの方です。  エラーメッセージを確認後、mux21.tb.vhdをダブルクリック すると、エディタが立ち上がるので、エラー箇所を修正します。  修正が終わったら、File-SaveModuleで保存し、 mux21.tb.vhdウインドウのアイコン化ボタン   でアイコン化 します。  シミュレーションボタン    を押して、エラーがなければ、 (9)に進みます。  エラーが有れば、エラーメッセージ確認後、アイコン化していた mux21.tb.vhdを通常の大きさに戻し、修正を繰り返します。

  42. (9)エラーがなければ、下の画面で停止するので、(9)エラーがなければ、下の画面で停止するので、 AddPrimariesボタンとCloseボタンを、この順番に押します。

  43. (10)下の画面で停止するので、GOボタン   を押します。(10)下の画面で停止するので、GOボタン   を押します。   波形の一部が表示されるので、PeakSimウインドウの   ツールバーからView-ZoomAllを選び、波形全体を   表示させます。

  44. (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アイコン   を押して、プロジェクトを保存します。

  45. 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 にコピーします。 

  46. (2)PeakVHDLのツールバーから、NewProject   を押して、(2)PeakVHDLのツールバーから、NewProject   を押して、 新しいプロジェクトをオープンし、File-SaveAsで  ¥ACC-EDA¥LIB4¥QLOGIC¥QLOGIC.acc として名前を付けて、保存します。

  47. (3)AddModuleアイコン   でQLVTL95.VHDを追加し、(3)AddModuleアイコン   でQLVTL95.VHDを追加し、 Rebuildアイコン   でモジュールの前に+マークが付くことを、 確認します。

  48. (3)QLVTL95.VHDをクリックしてハイライトした状態で、(3)QLVTL95.VHDをクリックしてハイライトした状態で、 Optionアイコン   を押して、Compileタブの Compile into Libraryに QLPRIMS  を設定します。

  49. (4)QLVTL95.VHDをクリックしてハイライトした状態で、(4)QLVTL95.VHDをクリックしてハイライトした状態で、 コンパイル   を押します。 エラーが無いことを確認後、 SaveProjectアイコン   を押して、このプロジェクトを 保存します。これでライブラリQLPRIMSができました。

  50. (5)ここからmux21.vhdの遅延シミュレーションを始めます。(5)ここからmux21.vhdの遅延シミュレーションを始めます。 NewProjectアイコン   を押して、新しいプロジェクトを オープンし、File-SaveAsで    ¥seminar¥vhdl¥mux21vtl.acc と名前を付けて、保存します。

More Related