論理回路設計
- 実習:VHDLによるデジタル回路設計 –
東京理科大学 基礎工学部電子応用工学科 (非常勤講師)藤岡 督也
【2018年度前期 集中講義】 1 /80 講座の目的 実習を通して、専門分野の問題発見・解決の能力を修得する - LSI設計の基礎知識を得る - 言語:VHDLによる設計手法を実習する - EDAツールの操作を経験する - FPGAを搭載した評価ボードで動作を確認する集中講義の日程
1日目 2日目 3日目 4日目 6月16日(土) 2~5時限 6月23日(土) 2~5時限 6月30日(土) 2~5時限 7月07日(土) 2~4時限 【課題1】 加算器 - Quartus Ⅱの操作と 作業手順の習得 ・ 回路図/VHDL による設計 ・ ピンアサイン ・ 実機での動作確認 【課題1】 加算器 - ModelSimの操作と 作業手順の習得 ・シミュレーションによる 設計の機能確認 ・テストベンチの作成 &実行方法 【課題2】 自分の名前の 表示させよう 【課題3】 1分時計 【課題4】 追加仕様版加算器 (追加仕様) ・10進表示への変更 ・ビット拡張 ・乗算機能の追加 - 設計の実践&動作確認 - 言語設計の理解 (実習で使用する環境)[EDAツール] Quartus Ⅱ(Altera社)、 ModelSim (Mentor社: VHDLシミュレータ)
[ボード] DE0 (Terasic Technologies社): (FPGA) Cyclone Ⅲ(Altera社) 搭載 2
3
実習の内容
各課題を設計して、シミュレーションで機能確認後、
実機を使って動作を確認する。
1.課題を理解し、設計仕様にまとめる
→ 入力、出力、機能、性能を決める → 設計手法を選択する: 回路図入力/言語設計/両者の混在等 → 検証内容(シミュレーション内容等)を決める2.選択した設計手法で回路設計を行う
→ QuartusⅡ: 回路図入力/VHDL設計/両者の混在 → ModelSim : VHDL設計3.シミュレーションで機能確認を行う
→ VHDLシミュレータ:ModelSimを使う → 波形入力 or テストベンチを使って実行する4.評価ボード:DE0を使って、実機確認を行う
→ Quartus Ⅱで実行モジュールを作成する → シミュレーション回路と実機評価回路は、異なる場合がある実習の設計フロー
デザインエントリ
ダウンロード
実機評価
コンパイル
端子割り当て
コンパイル
FPGAの接続データ (実行モジュール)を作成する 実行モジュールをPCから FPGAに書き込む - ModelSim - QuartusⅡ - DE0 4デザインエントリ
コンパイル
- QuartusⅡシミュレーション
仕様に基づき、 回路を設計する FPGA上で動作確認をする 仕様に基づき、 回路を設計する 回路の動作を確認する 記述をチェックして、論理合成する
評価ボード:DE0の外観
5 7seg LED スライド・スイッチ ボタン・スイッチ FPGA (Altera社製) 電源スイッチ USB端子6
1.搭載FPGA:
(Family)Cyclone Ⅲ
(name)EP3C16F484C6
[Package] FBGA (Fine pitch Ball Grid Array)
[Pin count] 484 [speed grade] 6
- QuartusⅡ(Altera社)で実行モジュールを作成する
2.入力機能
1) ボタンスイッチ: 3個 (Button0~2) ・a接点スイッチ [← b接点スイッチとの違いを理解] 2) スライドスイッチ:10個 (SW0~SW9) ・上方にスライド(logic”1”)、下方にスライド(logic”0”)3.出力機能
- 7seg LED: 4個 (HEX0~3)
・アノードコモン型 [← カソードコモン型との違いを理解] (- 液晶パネルを搭載することも可能)
4.実行モジュールのダウンロード
- USBケーブルを接続して、Quartus Ⅱから実行する評価ボード:DE0の概要
[詳細は、授業HP上のマニュアル(英文)参照]評価ボード:DE0のブロック図
7 USB端子 FPGA 7seg LED ボタンスイッチ スライドスイッチ8
DE0のボタンスイッチの動作
a接点: スイッチを押すと接点が繋がり電流が流れる b接点: スイッチを押すと接点が離れて電流が止まる a接点スイッチ push push 通常の入力信号: BS 反転入力信号: not BS A RST B9
DE0のスライドスイッチの動作
Logic “1” Logic “0” D2 E4 E3 H7 J7 G5 G4 H6 H5 J6 SW9 SW8 SW7 SW6 SW5 SW4 SW3 SW2 SW1 SW0 (PIN番号) (SW番号) 上方にスライド 下方にスライド 通常の入力信号: SS 反転入力信号: not SS =a b c e d f g dp 10
DE0の7seg LEDの動作
a b c d e f g dp HEX0 E11 F11 H12 H13 G12 F12 F13 D13 (PIN番号) (ピン名) 端子割り当て表 LED0[7] LED0[6] LED0[5] LED0[4] LED0[3] LED0[2] LED0[1] LED0[0] ⇐ ピンとPADの整合 - アノードコモン型 - 7seg LEDの動作タイプ [参考]端子割り当て(ピンアサイン)
FPGAチップ - FPGAチップはパッケージングされている ⇒ PADはPINに接続されている - パッケージはボード上に実装されている ⇒ ボード上部品と接続されている(PAD=)PINから先の接続は変更できない FPGAパッケージ FPGA FPGA搭載ボード - 入力信号は、決まったPINから入力する - 出力信号は、決まったPINへ出力する 設計回路 11 [テキスト図1-55参照]
12
設計端子名 入出力 FPGAピン番号 備考 A Input PIN_H2 BUTTON0 B Input PIN_F1 BUTTON2 clk Input PIN_G21 クロック入力 EQUAL Input PIN_J6 SW0
reset Input PIN_G3 BUTTON1 LED0[7] Output PIN_E11 HEX0_a LED0[6] Output PIN_F11 HEX0_b LED0[5] Output PIN_H12 HEX0_c LED0[4] Output PIN_H13 HEX0_d LED0[3] Output PIN_G12 HEX0_e LED0[2] Output PIN_F12 HEX0_f LED0[1] Output PIN_F13 HEX0_g LED0[0] Output PIN_D13 HEX0_dp LED1[7] Output PIN_A13 HEX1_a LED1[6] Output PIN_B13 HEX2_b
ピン割り当て表
13
1日目の実習内容
- テキスト:1~72頁 [実習の目的]
- 設計から実機評価まで設計フロー全体の把握
- QuartusⅡの操作方法の習得
・特に、ピンアサイン、実行モジュールの作成&ダウンロード- 回路図入力と設計言語(VHDL)で設計
⇒ 回路図設計と言語設計の違いを理解
14
1日目の実習内容と進め方
課題1:
『4ビット加算器』を
“回路図入力”と“VHDL記述”で設計して、
実機(DE0)で評価する
(テキスト: 6 ~ 72頁) 【回路図入力】 - QuartusⅡの回路エディター機能を使って、階層設計手法で、 所望の回路図を入力して設計するhalf_adder, full_adder, adder_4bit, adder_4bit_top (テキスト: 6 ~ 41頁) - 端子割り当て後、実行モジュール(*.sof)を作成し、 実機にダウンロードして、動作を確認する (テキスト: 42 ~ 49頁) 【VHDL記述】 - 回路図入力で設計した同じ回路をQuartus Ⅱ上で、 設計言語:VHDLを使って再設計して、実機で動作確認する half_adder/vhd, full_adder.vhd, adder_4.vhd, adder_4_top.vhd (テキスト: 50 ~ 72頁)
15
設計の内容と流れ
課題1 実機 [ ≡ 評価ボード: DE0 ]で設計した回路の機能確認 QuartusⅡ環境から評価ボードへ 実行モジュールをダウンロードする『4ビット加算器』 を“回路図/VHDL”で設計する
QuartusⅡの回路図エディタを 使って、課題回路を設計する 設計言語:VHDLで 課題回路を設計する QuartusⅡ 1st step [テキスト:~49頁] 2nd step [テキスト:~72頁] QuartusⅡ - 設計回路と評価ボードの整合 ⇒ 端子割り当て(ピンアサイン) - 実行モジュール([拡張子] *.sof )の作成 (評価ボード)DE016
評価ボード:DE0を使って、4ビット加算器を設計する。
1.入力データ: ボタンスイッチを使って、押下回数を入力数とする。 Button0 : 加数の入力。 HEX0へ16進表示。 0~Fをトグルする。 Button2 : 被加数の入力。 HEX3へ16進表示。 0~Fをトグルする。 Button1 : リセッの入力。 button0とbutton2を同時にリセットする。 2.出力データ: 加算結果を7segLEDに表示する。 加算結果は、hex表とする( 00~1E; 4ビット加算 → 加算結果は5ビット) HEX0 : 加算結果の下位桁を16進表示する。 HEX1 : 加算結果の上位桁を16進表示する。 HEX2 : ”=”を表示する。 HEX3 : ”=”を表示する。 3.モード切替: スライドスイッチを使って、入力/出力表示を切り替える。 SW0 : 0(入力モード): 被加数と加数を表示する。 1(出力モード): 加算結果を表示する。課題1:『4ビット加算器』の開発仕様
キー入力 検出回路 キー入力 保持回路 キー入力 検出回路 キー入力 保持回路 加算器 キー入力 検出回路 キー入力 保持回路 信号選 択 & LED 表示制 御 LED3 被加数 加数 -= -クリア LED2 LED1 5 4 4 8 8 8 クロック 分周回路 -クロック LED0 8
『4ビット加算器』の設計回路
[課題]と全体回路
図1-56 周辺回路ブロック図 全体回路 → FPGAへダウンロード - 全体回路は、設計回路“加算演算部”と周辺回路から構成される - 周辺回路は、回路図シンボルとperipheral_DE0.vhdで準備されている - 設計回路“加算演算部”と周辺回路を使って、全体回路を設計する 17 設計回路 周辺回路18
『4ビット加算器』の設計内容
加算演算部
(加算モジュール) (実機用周辺回路)peripheral_DE0
コンパイル 実機による動作確認 実行 モジュール ダウンロード QuartusⅡ 回路図 & VHDL記述4ビット加算器
(トップモジュール) 回路図 & VHDL記述 既存のVHDL記述を ダウンロードする ピン割り当て [評価ボード: DE0] A[3..0] B[3..0] S[3..0] CO “加算モジュール”の外形図 - 回路図力 (5 ~ 41頁) ・加算モジュール、トップモジュール - 端子割り当て後、 実行モジュールを作成し、 実機で動作を確認 (42 ~ 49頁) - VHDLを使って再設計して、 実機で動作を確認 (50 ~ 72頁) 設計作業の流れ「加算演算部
(加算モジュール)
」を階層設計
4ビット加算演算部(加算モジュール)
full_adder
half_adder
20
VHDL記述の構造と記述例
「パッケージ」の指定 entity エンティティ名 is end エンティティ名; architecture アーキテクチャ名 is bigin end アーキテクチャ名; 入出力ポート宣言 signal 他の宣言 VHDL本体 - 動作、機能の記述 -- 半加算器の記述例 library IEEE; use IEEE.std_logic_1164.all; entity half_adder is port(A,B: in std_logic; S,CO: out std_logic); end half_adder;architecture RTL of half_adder is signal sig1, sig2: std_logic;
begin
sig1 <= A nand B; sig2 <= A or B; CO <= not sig1;
S <= sig1 and sig2; end RTL;
of エンティティ名
21
半加算器の回路図とVHDL記述
VHDL記述(図2-7参照) [図2-9] 回路図入力(図1-24参照) O コンパイル後(図2-13参照[等価]) -- 半加算器の記述例 library IEEE; use IEEE.std_logic_1164.all; entity half_adder is port(A,B: in std_logic; S,CO: out std_logic); end half_adder;architecture RTL of half_adder is signal sig1, sig2: std_logic; begin
sig1 <= A nand B; sig2 <= A or B; CO <= not sig1;
S <= sig1 and sig2; end RTL; 機能のゲート記述 A B S CO 0 0 0 0 1 0 1 0 0 1 1 0 1 1 1 1 architecture RTL of half_adder_bh is
signal AB : std_logic_vector (1 downto 0); begin
AB <= A & B; process(A,B) begin
if(AB=“00”) then S<='0'; CO<='0'; elsif(AB="01") then S<='1'; CO<='0'; elsif(AB="10") then S<='1'; CO<='0'; else S<='1'; CO<='1'; end if; end process; end RTL;
22 [図2-14] library IEEE; use IEEE.std_logic_1164.all; entity full_adder is port(A,B,CIN : in std_logic; S,CO: out std_logic); end full_adder;
architecture RTL of full_adder is component half_adder
port(A,B : in std_logic; S,CO: out std_logic); end component;
signal sig1, sig2, sig3 : std_logic; begin
H1: half_adder port map (A,B,sig2,sig1);
H2: half_adder port map (sig2, CIN, S, sig3); CO <= sig1 or sig3; end RTL;
全加算器の回路図とVHDL記述
ライブラリ記述 エンティティ記述 アーキテクチャ コンポーネント宣言 コンポーネント呼び出し (コンポーネント・インスタンス) [図2-15]23
「加算演算部
(加算モジュール)
」のVHDL記述
《図2-18 adder_4の回路図》
24
『4ビット加算器』のVHDL記述
01 -- Top module for 4bit adder 02 library IEEE;
03 use IEEE.std_logic_1164.all; 04
05 entity is
06 port ( clk,RESET,A,B,EQUAL : in std_logic;
07 LED0,LED1,LED2,LED3 : out std_logic_vector( )); 08 end adder_4_top;
09
10 architecture RTL of adder_4_top is 11 component peripheral_DE0
12 port ( add_result: in std_logic_vector(4 downto 0);
13 clk, reset, a, b, equal : in std_logic;
14 a_count, b_count: out std_logic_vector(3 downto 0);
15 led0,led1,led2,led3: out std_logic_vector(7 downto 0));
16 end component;
17 component adder_4 port ( A,B : in std_logic_vector(3 downto 0); 18 S : out std_logic_vector(3 downto 0); 19 CO: out std_logic);
20 end ; 21
22 signal a_count_sig: std_logic_vector(3 downto 0); 23 signal b_count_sig: std_logic_vector(3 downto 0); 24 signal : std_logic_vector(4 downto 0); 25
26 begin
27 I1: peripheral_DE0
28 port map ( add_result => ADD, clk => clk, reset => RESET, 29 a => A, b => B, equal => EQUAL,
30 a_count => a_count_sig, b_count => b_ count_sig,
31 led0 => LED0, led1 => LED1, led2 => LED2, led3 => LED3); 32 I2: adder_4 port map ( A => a_ count_sig, B => b_ count_sig,
33 S => ADD(3 downto 0), CO=> ADD(4) ); 34 end ;
《図2-21 adder_4_topの回路図》
《図2-25 adder_4_topの VHDL記述》
25
【参考資料1】
EDAツール:QuartusⅡの
プロジェクトメンバー管理
設計エントリー: QuartusⅡ
26
【EDAツール】
- 回路図入力、VHDL入力、論理合成(Cyclone用)
QuartusⅡのプロジェクトへのファイルの追加
プロジェクトをオープンした状態で
“File → New” を選択すると”New“画面がポップアップされるので、 “VHDL File”を選択する
“VHDL File”選択後、編集画面が表示 されるので、持ち込みたい VHDL記述を pasteして、“Save As”で保存する
QuartusⅡのプロジェクト・ディレクトリ
“file → open”後のポップアップ画面 プロジェクト[ adder_4bit ]をオープンした時のディレクトリ下のファイル一覧 ・ファイル名と更新日時が正しいかを常にチェックする ・ファイル名(拡張子以外の部分)は、異なる名前にする → 古い版を保存したい場合は、”*_old1.vhd”のようにする ・複雑になった場合は、新しいプロジェクトを作って、別に管理する 28QuartusⅡのプロジェクトメンバー
現在のプロジェクトメンバーの一覧 ・リストされているファイルを正しく管理する → 同名のモジュール名は避ける ・変更する場合は、次頁のように行う 29QuartusⅡのプロジェクトメンバーの変更
1.オープンしているファイルをメンバーに追加する: “Project → Add current file to Project”
2.プロジェクトディレクトリ下のファイルを使って変更する “Project → Add/Remove files to Project”
31
2日目の実習内容
- テキスト:73~110頁 [実習の目的]
- 設計言語:VHDLを使った設計フローの理解
- 論理シミュレーションによる機能確認の方法
- ModelSimの操作方法の習得
- テストベンチによるシミュレーションの実行方法
32
課題1のシミュレーション検証
要求仕様 所望回路の仕様を決定 - 設計回路と評価ボードの整合 ⇒ 端子割り当て(ピンアサイン) - 実行モジュール([拡張子] *.sof )の作成 実機 [ ≡ 評価ボード: DE0 ]で設計した回路の機能確認 QuartusⅡ環境から評価ボードへ実行モジュールをダウンロード -設計内容は、評価ボード: DE0 (Terasic社製)で機能確認する ・FPGA:CycloneⅢ[Altera社(Intel社の子会社)]を実装 設計言語: VHDLで設計 設計回路の機能検証 -論理シミュレーションで機能検証 -テストベンチでの実行 ModelSim 回路図入力 で設計 言語:VHDL で設計 設計回路の機能検証 -シミュレーションで機能検証 QuartusⅡ33
2日目の実習内容と進め方
課題1のVHDL記述の機能検証をするために
シミュレーションを実行する
(テキスト: 73 ~110頁) - シミュレータは、ModelSimを用いる。 - QuartusⅡ上で設計、実機確認した『4ビット加算器』のVHDL記述を用いる ⇒QuartusⅡのVHDL記述(テキスト)をModelSim環境に移す。 【加算モジュール: adder_4.vhd】 - コンパイルして、エラーが無いことを確認する (テキスト: 78 ~80頁) - 入力パターンを「Apply Wave」で設定し、シミュレーションを実行する。 実行結果を分析して、動作が正しいかを確認する。 (テキスト: 80 ~89頁) 【4ビット加算器: adder_4_top.vhd】 - adder_4.vhdと同様に、コンパイルエラーが無いことを確認して、 入力パターンを「Apply Wave」で設定し、シミュレーションを実行する。 実行結果を分析して、動作が正しいかを確認する。 (テキスト: 90 ~100頁) 【テストベンチを用いたシミュレーションの実行】 - adder_4.vhd、adder_4_top.vhdを「Apply Wave」で入力パターンを設定せず、 テストベンチを記述して、シミュレーションを実行する (テキスト:101 ~110頁)34
VHDLシミュレータ:
ModelSimでの機能確認
(加算モジュール)加算演算部:
adder_4 VHDL記述 ModelSim (実機用周辺回路)peripheral_sim
VHDL記述 (トップモジュール)4ビット加算器:
adder_4_top.vhd VHDL記述 VHDL記述 Sim用にカスタマイズした専用モジュールを 指定の場所からダウンロードする ⇓ adder_4_top.vhdの記述を変更する ① peripheral_sim.vhdのダウンロード ② コンパイル(記述の確認) ③ 「Apply wave」で入力パタンを 指定して、シミュッレーションを実行 ④ テストベンチを記述して、 シミュレーションを実行 手順 QuartusⅡ上で設計した『4ビット加算器』のVHDL記述(テキストファイル): half_adder.vhd, full_adder.vhd, adder_4.vhd, adder_4_top.vhd35
VHDL記述の構造と記述例
「パッケージ」の指定 entity エンティティ名 is end エンティティ名; architecture アーキテクチャ名 is bigin end アーキテクチャ名; 入出力ポート宣言 signal 他の宣言 VHDL本体 - 動作、機能の記述 -- 半加算器の記述例 library IEEE; use IEEE.std_logic_1164.all; entity half_adder is port(A,B: in std_logic; S,CO: out std_logic); end half_adder;architecture RTL of half_adder is signal sig1, sig2: std_logic;
begin
sig1 <= A nand B; sig2 <= A or B; CO <= not sig1;
S <= sig1 and sig2; end RTL;
of エンティティ名
36
VHDL記述&コンパイル時の注意点
1.規約どおりに記述する
- 構文規則を覚えて、キーワードとパラメータを正確に記述する
・代入文の右辺と左辺でデータイプは同じでなければならない
signal s1: std_logic_vector(2 downto 0); signal n1: integer range 0 to;
× s1 <= 0 ⇒ ○ s1 <= “000”
《 Error (10517): VHDL type mismatch error at half_adder_bh.vhd(23): 》 《 std_logic type does not match integer literal 》
× n1 <= s1 ⇒ ○ n1 <= CONV_INTEGER(s1); ・サブプログラムの戻り値も同じデータタイプでなければならない ・std_logicの論理値は、9値である → 0、1、X、L、H、W、Z、U(uninitialize)、-(don’t care) - “)”や”;”の数を間違えない ・()は必ず対になっている ・”;”は、必要な場所と必要ない場所を正確に把握する - 未定義の変数は使えない(必ず事前定義)
2.コンパル時のエラーは、しっかり読む
- 必ずしも、的確な記述間違いをメッセージしてくれる訳ではない37
テストベンチの構造
「パッケージ」の指定 entity エンティティ名 is end エンティティ名; architecture アーキテクチャ名 is bigin end アーキテクチャ名; - DUTの宣言 - 入出力の宣言 - DUTの呼び出し - 波形記述 configuration コンフィグレーション名 is for アーキテクチャ名 end for; end コンフィグレーション名; ライブラリ記述 ポートリストの無いエンティティ記述 アーキテクチャ名 of エンティティ名 テストモジュール(DUT)のコンポーネント宣言 DUTの入出力信号宣言 整数の定義(クロック周期等) DUTの呼び出し宣言(インスタンス) 入力信号の入力波形記述 (期待値照合も可能) コンフィグレーション名を定義 → コンフィグレーション名 of エンティティ名 ⇓ このコンフィグレーション名でシミュレーターの 実行モジュールが作られる38
テストベンチでの入力波形記述例
constant STEP: time := 100 ns ; begin
U0: COUNT4LD port map( CLK, RST, LD, D, Q ); -- 入力;CLK、RST、LD、D
process begin -- クロックの記述
CLK <=‘0’; wait for STEP/2; -- STEP/2毎に“01”を繰り返す CLK <=‘1’; wait for STEP/2; -- 無限にループする
end process ; process begin
D <=“0000”; -- 入力Dに”0000”をセット wait for STEP; RST <=‘1’; -- 1クロック後、リセットをon wait for STEP; RST <=‘0’; -- 1クロック後、リセットをoff wait for STEP*20; -- 20クロック進める
D <=“1001”; LD <=‘1’; -- ロードをonして、Dに9をロード wait for STEP; LD <=‘0’; -- ロードをoff
wait for STEP*8; -- 8クロック進める
D <=“0110”; LD <=‘1’; -- ロードをonして、Dに6をロード wait for STEP; LD <=‘0’; -- ロードをoff
wait for STEP*12 ; -- 12クロック進める
assert false severity failure; -- シミュレーションの強制終了 end process;
39
【参考資料2】
EDAツール:ModelSimの
プロジェクトメンバー管理
VHDLシミュレータ: ModelSim
40
【EDAツール】
- VHDL入力 → 機能/論理シミュレーション
ModelSimのプロジェクトへのファイルの持ち込み
“File → Source → VHDL” の操作で編集ウィンドウ が開くので、vhdl記述をpasteし、“Save As”で保存する。
ModelSimのプロジェクト・ディレクトリ
プロジェクト・ディレクトリ下のファイル一覧 (プロジェクトメンバーの候補)
ModelSimのプロジェクト・メンバー
プロジェクト・メンバーの一覧
- トップモジュール以下の全モジュールがリストされている (リストされるように管理する)
Project画面内で右クリック
- “Add to Project” を使って、変更する
ModelSimのプロジェクト・メンバーの変更
45
【参考資料3】
VHDLの概要
- VHDL: VHSIC Hardware Description Language の略称
- 1981年 米国国防総省(国防高等研究計画局:DARPA(Defense Advanced Research Projects Agency)のVHSIC委員会が提唱 ・VHSIC: Very High Speed Integrated circuit
・ICの大規模/高機能化に伴った、明確に仕様を記述する仕様記述言語
- 1986年 Version 7.2 リリース
IEEEの標準化作業スタート VASG (VHDL Analysis & Standardization Group) 委員会
- 1987年 LRM(言語仕様書; Language Reference Manual ) 作成 IEEE Std 1076-1987として承認
- 1993年 IEEE 1164を採用: 9値のstd_logic
- その後 IEEE 1076-1993、 IEEE 1076-2000、 IEEE 1076-2002、 IEEE 1076-2008 (最新版)
ハードウェア記述言語: HDL
- Hardware Description Language; HDL
- デジタル回路、特に集積回路を設計するためのコンピュータ言語 - ハードウェアの動作仕様を記述するための言語で、電子回路の 経時的動作と空間的構造を表現し、構文(syntax)や意味(semantics)は、 ハードウェアの基本的属性である時間や並行性を記述。 - 処理を検証するテストベンチ記述ができ、シミュレーションが可能。 - 論理合成が可能 - Verilog HDL と VHDL が、主要な言語 (IEEEで標準化を推進)
RTL (Register Transfer Level) とは?
・ レジスタ間の転送関係を 表現したレベル ・ 機能を、代入、if、case等で 表現したもの ・ クロックを意識した記述 ゲートレベル とは? ・ ゲート回路やフリップフロップ等の 接続関係を表現したもの ( → 素子と等電位点の列挙 ) ・ ネットリストとも言う 論理 合成 46
VHDLの基本構造①
回路記述: ・論理合成に適した記述をする ・回路の種類ごとに適した記述スタイルがある テストベンチ: ・文法を満たしていれば、どんな記述でもよい ・記述のテクニックを駆使できる VHDLの文法 回路記述 テストベンチ ライブラリ記述 論理合成可能 論理合成不可 シミュレーション可能 47architecture architecture architecture process C process B 一つの entityに 複数の architectureを 書ける
library …複数のライブラリ
useentity ….1つ
port 一つの entityに複数の architectureを書ける 一つの architectureに複数のprocessを書けるVHDLの基本構造②
process A 一つの architectureに 複数のprocessを書ける 48VHDLの基本構造③
合成用の記述に使用するもの (回路の合成が可能な記述) シミュレーション・テストベクタ記述に 使用するもの(合成困難,不能) Library … Entity … port … Architecture …… この部分の信号割当ては、process文の外なのでSLSも イベントもない。 コンカレント(非同期, 即時代入, 即時信号割り当て)実行される。 - <= 非同期で即時,コンカレント信号代入, - 条件文 when-else, with-select(others文で全条件記述) - 反復文 generate Process … ()がない場合は,process文内の処理を永遠に継続 制御反復文 loop for loop while loop wait for wait on wait until Process (センシティビティー・リスト信号;:SLS) - <= SLSのイベントに同期し同時に信号代入 - := SLSのイベントに同期しシーケンシャルに信号代入 (:=の左辺は,variable文で定義した変数) - 条件文- case文, if文, if-then-elsif文
50
- 階層化記述例 -
A C B X Z Y L library IEEE; use IEEE.std_logic_1164.all; entity X isport (A, B : in std_logic; C : out std_logic); end X; architecture RTL of X is component Y port( A : in std_logic; D : out std_logic); end component; component Z port( B, D : in std_logic; C : out std_logic); end component; signal L : std_logic; begin U0 : Y port map ( A => A, D => L ); U1 : Z port map ( D => L, B => B, C=> C ); end RTL; コンポネント インスタンス コンポーネント 宣言(定義) コンポーネント 宣言(定義)
VHDLの基本構造④
library IEEE;
use IEEE.std_logic_1164.all; entity M_BEHAVIOR is
port (SELS : in bit_vector(0 to 1);
A,B,C,D : in bit;
M : out bit); end;
architecture DSELS of M_BEHAVIOR is begin process(SELS,A,B,C,D) begin case SELS is when ”00” => M <= A; when ”01” => M <= B; when ”10” => M <= C; when others => M <= D; end case; end process; end DSELS;
case 文
M
SELS
D
A
B
C
51if then else/elsif 文
library IEEE; use IEEE.std_logic_1164.all; entity S_BEHAVIOR is port(SELS: in bit_vector(0 to 1); A,B,C,D: in bit; M: out bit); end;architecture DSELS of S_BEHAVIOR is begin
process(SELS,A,B,C,D) begin
if (SELS = "00") then M <= A; elsif (SELS = "01") then M <= B; elsif (SELS = "10") then M <= C; else M <= D; end if; end process; end DSELS; library IEEE; use IEEE.std_logic_1164.all; entity N_BEHAVIOR is port(SELS: in bit_vector(0 to 1); A,B,C,D: in bit; M: out bit); end;
architecture DSELS of N_BEHAVIOR is begin process(SELS,A,B,C,D) begin if (SELS = “00”) then M <= A; if (SELS = "01") then M <= B; if (SELS = "10") then M <= C; else M <= D; end if; end if; end if; end process; end DSELS; 52 M SELS D A B C
when else 文
entity J_BEHAVIOR is
port (A,B,SEL : in boolean; M : out boolean);
end;
architecture DSEL of J_BEHAVIOR is begin
M <= A when SEL else B; end DSEL;
M
A
B
SEL
entity K_BEHAVIOR isport (SELS : in bit_vector(0 to 1); A,B,C,D : in bit; M : out bit); end;
architecture DSELS of K_BEHAVIOR is begin M <= A when (SELS="00") else
B when (SELS="01") else
C when (SELS="10") else D ; end DSELS;
M
SELS
A
B
C
D
53library IEEE;
use IEEE.std_logic_1164.all; entity M_BEHAVIOR is
port (SELS : in bit_vector(0 to 1); A,B,C,D : in bit; M : out bit); end;
architecture DSELS of M_BEHAVIOR begin
with SELS select M <=A when ”00”, B when ”01”, C when ”10”, D when ”11”; end DSELS;
with select 文
library IEEE; use IEEE.std_logic_1164.all; entity M_BEHAVIOR isport (SELS : in std_logic_vector(0 to 1); A,B,C,D : in bit; M : out bit);
end;
architecture DSELS of M_BEHAVIOR begin
with SELS select
M <= A when ”00”, B when ”01”, C when ”10”, D when ”11”; end DSELS; この記述を、 D when others; とするとOK M SELS D A B C 54 この宣言のとき、 SELSは、9x9=81値となり,, 左の記述ではエラー
55
3/4日目の実習内容
- テキスト:111~153頁 [実習の目的]
- 課題2/3/4をVHDLで設計し、実機動作させる
- 記述したVHDLのテストベンチを記述して、
ModelSimで機能確認する
- 検証したVHDLをQuartusⅡに移し、実機回路用に
修正して実行モジュールを作成する
- 課題を繰り返し、設計スキルを習得する
- Sim用回路と実機用回路の違いを理解する
56
課題2/3/4の設計作業の流れ
コンパイル 実機による動作確認 実行 モジュール ダウンロード QuartusⅡ ピン割り当て [評価ボード: DE0] VHDL記述 ModelSimVHDLで設計し、テストベンチを記述して、
シミュレーションで機能検証
検証したVHDLをQuartusⅡに移し、実機用回路に修正 VHDL記述課題2/3/4の開発仕様の確認
57
課題2:
『自分の名前を表示させよう』
- 3日目 -
0123456789_I_AM_TOKUYA_FUJIOKA. 自分の名前 [注] 31文字なので、5ビット化(32文字)が可能 M _ T O←・・
←・・
[各文字と各セグメントの表示は、 テキストpp111、112を参照]58
課題2の実習内容と進め方
ModelSim環境でVHDLで設計する。
テストベンチでシミュレーションして機能確認後、
実機
(回路変更が必要)
で動作を確認する。
[ Modelsim ]
(テキスト: 116 ~ 130頁) ① 新規プロジェクト(moji_deco)を作成する ② conversion_ascii.vhd (各自で記述内容が異なる) moji_deco.vhd (全員の記述内容が同じ) を設計する。 ③ moji_deco_top.vhd トップ回路をVHDLで設計する ④ テストベンチでシミュレーションを実行し、機能確認する[QuartusⅡ]
(テキスト: 131 ~ 137頁) ⑤ 新規プロジェクト(moji_deco_DE0)を作成する ⑥ 実機用回路に修正し(図4-24)、コンパイルする ⇒ 修正後のデータをエラーフリーにする ⑦ 端子割り当て後、コンパイルして実行モジュールを作成する ⑧ 実機で動作を確認する59 [実現機能] 4個の7segLEDに、1秒毎に左に流れるように、0~9の数字を 表示させた後に、自分の名前をアルファベットで表示する。 [ボタン仕様] Button0(stop): 押下毎に停止/再開の動作を繰り返す 停止: 押下時点での表示をそのまま継続する 再開: 表示状態から次の表示を再開する Button1(reset): 初期状態に戻る(0表示から始める) [LED表示] HEX0 : 0123456789_I_am_(各人の名前をアルファベットで表示 HEX1/2/3 : -1/-2/-3秒遅れて、HEX0を同じ内容を表示 [モジュール構成] - peripheral_moji: 準備されている。 ボタン動作に従って、1MHz周期 (Sim用)のカウント信号(0~31)が出力される: deco0~3[5_0] 実機用には、1Hz周期になるように変更する。 - conversion_ascii: カウント信号をascii文字コードに変換 - moji_deco: ascii文字コードを7segLED信号に変換
『名前表示』の開発仕様
moji_deco conversion_ascii 60
『名前表示』のSim用モジュール構成
- 図4-5 実習課題概要 - deco0 0 1 2 3 4 5 6 7 8 9 ・・・ 30 31 deco1 31 0 1 2 3 4 5 6 7 8 ・・・ 29 30 deco2 30 31 0 1 2 3 4 5 6 7 ・・・ 28 29 deco3 29 30 31 0 1 2 3 4 5 6 ・・・ 27 28 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9 _ I _ a m _ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9 _ I _ a m _ (ascii) (7seg) (← 1秒毎にカウントアップする) (← カウントアップした数をascii文字と7segに変換する) CNV0 DEC0 CLK STOP RESET conversion_ascii decoder_7seg CNV1 DEC1 CNV2 DEC2 CNV3 DEC3 S0(5) A0(7) S1(5) A1(7) S2(5) A2(7) S3(5) A3(7) LED0 LED1 LED2 LED3 HEX0 HEX1 HEX2 HEX3 PERI deco0 deco1 deco2 deco3 moji_deco_top peripheral_moji (配付モジュール) 今回設計する部分 [注意] 図中のS0(5)、A0(7)という表記は、単に信号のバス幅を示している。61
Sim用回路と実機用回路の相違
clk chattering SW_in SW_out 50Mhz(システムクロック) チャタリング発生信号 チャタリング除去信号1.実機の入力信号には雑音が含まれる
⇒ チャタリング防止回路を挿入する必要がある
図4-22 図4-232.すべての状態をシミュレーションすることは不可能
⇒ 不必要な入力パターンを入力しない
⇒ 効率的な検証を行うためにモデル化が必要である
62 CLK STOP RESET LED0 LED1 LED2 LED3 HEX0 HEX1 HEX2 HEX3 moji_deco_DE0 CLK LED0(7..0) I3: moji_deco_top STOP RESET LED1(7..0) LED2(7..0) LED3(7..0) clk I1: chattering SW_in SW_out clk I2: chattering SW_in SW_out chat_STP chat_RST
『名前表示』の実機用モジュール構成
- 図4-24 実機評価用最上位回路: moji_deco_DE0 - - 入力信号の雑音を削除 ⇒ チャタリング防止回路の挿入 - 表示周期を1秒(=1Hz)に変更 ⇒ moji_deco_top内のperipheral_mojiの一部を変更 (図4-26、133頁)63
『名前表示』のシミュレーション
1.シミュレーション用回路の設計
1)図4-5に従って、
conversion_ascii, decoder_7seg, moji_deco_top を設計する
2)peripheral_mojiは、シミュレーション用にカスタマイズする(されている) ・シミュレーションでは、雑音等は削除してよい ・シミュレーションの効率化を図る ⇒ 出力:deco0/1/2/3を1MHz(=1us)周期に設定 3)テストベンチを記述して、シミュレーションを実行する
2.シミュレーション後の確認内容
1)decoのカウント数に従って、所望の文字列が発生されているか? 2)カウント数が、asciiコードに正しく変換されているか? 3)7segLEDの信号が正しく生成されているか? 4)resetが正しく動作しているか? 5)stop信号が正しく動作しているか? ・1回目押下:カウント停止 →(継続) 2回目押下:カウント再開64
『名前表示』のシミュレーション結果(1)
65
『名前表示』のシミュレーション結果(2)
66
『名前表示』のシミュレーション結果(3)
67
課題3:
『1分時計』
68
課題3の実習内容と進め方
ModelSimのシミュレーションは、サブ回路で実行する。
QuartusⅡで実機用回路を設計して、動作確認する。
[ Modelsim ]
(テキスト: 142 ~ 146頁) ① 新規プロジェクト(one_min_clock)を作成する② Div_10ms: Sim用に、分周は、10usで設計する
CNT10 : カウントアップ機能付き10進カウンター を設計する ③ Parts : サブ回路のトップモジュールを設計する ④ テストベンチでシミュレーションを実行し、機能確認する
[QuartusⅡ]
(テキスト: 146 ~ 1148頁) ⑤ 新規プロジェクト( one_min_clock )を作成する ⑥ 実機用回路(図5-8)を設計する ⇐ 分周は、10msにする ⇒ コンパイルで設計データをエラーフリーにする ⑦ 端子割り当て後、コンパイルして実行モジュールを作成する ⑧ 実機で動作を確認する69 [実現機能] 1/100秒まで表示する1分時計を作る。60秒でトグルする。 (表示例) 12.34 [秒桁に、ドットを表示する] [ボタン仕様] Button0(reset): 初期状態に戻る(00.00秒表示に戻る) [LED表示] HEX0 : 1/100秒 HEX1 : 1/10秒 HEX2 : 1秒 ← “ドット”を表示させる HEX3 : 10秒 [モジュール構成] - one_min_clock_top: 1分時計の最上位回路 - Div_10ms: 50MHz(20ns)→100Hz(10ms)への分周回路。 - chattering: チャタリング防止回路(既設計。手法1、2どちらでも可) - CNT10: カウントアップ機能付き10進カウンタ - CNT06: カウントアップ機能付き6進カウンタ - BCD_7segLED: BCDコードを7segLED信号にデコード (注意) “ドット表示”をどこに組み込むかを考えること
『1分時計』の開発仕様
70
『1分時計』のトップ回路図
[入力] - CLK: 50Mhz(20ns) - 非同期reset [出力] 1 2. 3 4 1/100単位 ドットを付ける 60秒で繰り返す ドット表示 clk reset LED0 LED1 LED2 LED3 HEX0 HEX1 HEX2 HEX3 one_minute_top [チャタリング防止回路] chattering chat_rst clk_10ms clk_100ms BCD_7segLED [分周回路] Div_10ms bcd seg bcd seg bcd seg bcd seg clk clk_div clk_sig reset bcd up_sig 10進 カウンタ clk_sig reset bcd up_sig 10進 カウンタ clk_sig reset bcd up_sig 10進 カウンタ clk_sig reset bcd up_sig 6進 カウンタ clk_1s clk_10s bcd0_sig bcd1_sig bcd2sig bcd3_sig - 図5-8 『1分時計』のブロック図 -71 clk Parts clk_10ms clk_100ms [分周回路] Div_10ms clk_sig reset bcd up_sig [10進カウンタ] CNT10 clk clk_div bcd(3..0) reset ▼ ▼ ▼ ▼ ▼ 9 1 9 1
シミュレーション用サブ回路
図5-8の回路全体をシミュレーションするのは、非効率
⇒ サブ回路で、シミュレーションを実行
⇒ Div_10msとCNT10の動作を確認
⇒ 図5-10のサブ回路:Partsでシミュレーション実行
- 分周は、10ms→10us(1/1000)でシミュレーション - 図5-10 サブ回路:Partsのブロック図 - システムクロック: 50MHzbegin
DUT: parts port map (clk, reset, clk_100ms, bcd); process begin
clk <= '1'; wait for 10 ns ; clk <= '0'; wait for 10 ns ; end process;
process begin
wait for 3215 ns; reset <= '0'; wait for 2.0 us; reset <= '1'; wait for 500 us;
assert false severity failure; end process;
end SIM;
configuration cfg_parts_tb of parts_tb is for SIM end for; end cfg_parts_tb; library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity parts_tb is end parts_tb;
architecture SIM of parts_tb is component parts port
(clk, reset : in std_logic; clk_100ms : out std_logic;
bcd : out std_logic_vector(3 downto 0) ); end component;
signal clk, reset, clk_100ms : std_logic :='1'; signal bcd : std_logic_vector(3 downto 0);
72
『1分時計』のサブ回路のテストベンチ
- 分周周波数は、10us でシミュレーションを実行 CLK生成 RST生成 3215nsから2us間 reset後、 500us実行して、 強制終了 Sim継続時間73
サブ回路:Partsのシミュレーション結果①
[reset機能の確認]
74
サブ回路:Partsのシミュレーション結果②
75
課題4:
『追加仕様版加算器』
76
[追加仕様1]
4ビット加算器の表示を16進表示 ⇒ 10進表示に変更する
- “1100”(=CH) ⇒ [BCDコード] “0001_0010”(=1210)[追加仕様2]
追加仕様1の4ビット
(0~15)を7ビット
(0~127)へ拡張する。
-入力信号AとB: 0~99まで入力可。 99から0に戻る。 -加算結果は、HEX0/1/2に10進数で、HEX/3には“=”を表示する。 (表示例) “=005”、“=034”、“=198” 等[追加仕様3]
追加仕様2に乗算機能を追加する
-99x99=9801 ⇒ HEX0/1/2/3に表示可) -乗算機能は、単純に、MUL <= A * B; で実現する -MULの表示は、SW1を使う。 SW1=’1’の時に、HEX3~0に表示する。 SW0とSW1が同時に’1’の時は、SW1を優先する。『4ビット加算器』への追加仕様
77
課題4の実習内容と進め方
【4日目】 以下の手順で設計して、シミュレーションで確認後、
実機用回路を設計して、動作を確認する。
[ Modelsim ]
① 新規プロジェクト(adder_expand)を作成する ② プロジェクト:adder_4bit に、 ・4ビットカウンター: Counter_4bit.vhd ・BCD化モジュール:Binary2bcd.vhd ・表示信号の選択回路: Selector.vhd を追加する ③ 全体回路を整合し、テストベンチでシミュレーションを実行し、 機能確認する[QuartusⅡ]
④ 新規プロジェクト( adder_expand_DE0 )を作成する ⑤ 実機用回路を設計する(チャッタリング防止回路の追加) ⑥ 端子割り当て後、コンパイルして実行モジュールを作成する ⑦ 実機で動作を確認する ☆ 追加仕様2/3も同様の手順で作業する。78 A B RESET EQUAL システムクロック (50MHz) カウンター 波 形 整 形 (チ ャ タ リ ン グ ) SW0 0 加算 回路 BCD化 BCD化 BCD化 カウンター Hex0 Hex1 Hex2 Hex3 1 表 示 信 号 の 選 択 BCD_ 7segLED
(Hex3) (Hex2) (Hex1) (Hex0)
『追加仕様版_加算器』のブロック図
adder_expand_DE0
79 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity Binary2bcd is
port( bin_in : in std_logic_vector(4 downto 0); bcd1 : out std_logic_vector(3 downto 0); bcd2 : out std_logic_vector(3 downto 0)); end Binary2bcd ;
architecture RTL of Binary2bcd is
signal N1,N2,N3: integer range 0 to 63; begin N1 <= CONV_INTEGER(bin_in); N3 <= N1/10; N2 <= N1 - (N3*10); bcd1 <= CONV_std_logic_vector(N2,4); bcd2 <= CONV_std_logic_vector(N3,4); end RTL;
BCD化モジュール:Binary2bcd.vhd のVHDL記述
80 関数名 機能内容 std_logic_1164パッケージ内 To_stdlogicvector(A) bit_vectorからstd_logic_vectorへの変換 To_bitvector(A) std_logic_vectorからbit_vectorへの変換 To_stdlogic(A) bitからstd_logicへの変換 To_bit(A) std_logicからbitへの変換 std_logic_arithパッケージ内 CONV_std_logic_vector(A、ビット幅) integer、unsigned、signedから std_logic_vectorへの変換 CONV_INTEGER(A) unsigned、signedからintegerへの変換 std_logic_unsignedパッケージ内 CONV_INTEGER(A) std_logic_vectorからintegerへの変換