( 第 15 回 ) 鹿間信介摂南大学理工学部電気電子工学科 特別講義 : 言語を使った設計 (2) 2.1 HDL 設計入門 2.2 FPGA ボードの設計デモ配布資料 VHDL の言語構造と基本文法 2.1 HDL 設計入門 EDAツール : メンター社製品が有名 FPGAベンダーのSW 1 1 仕様設計 にも簡易機能あり 2 3 2 HDLコード記述 3 論理シミュレーション 4 4 論理合成 5 6 遅延シミュ 5 配置配線レーション 6 7 ダウンロード 7 ファイル作成 8 ダウンロード 9 実機での動作確認 8 9 FPGAベンダーが提供 ( 例 : QuartusⅡ/Altera, ISE/Xilinx) 仕様 : 製作する回路機能を明確化コード : VHDLによる記述論理 SIM: 実回路での遅延を考慮しないSIM ( 小規模回路では省略 ) 合成 : を生成する配置配線 : FPGA 内部構成用データを生成し, ピン割り当てを行う遅延 SIM: 遅延を含めた動作 SIM ファイル作成 : FPGAに転送する形式のファイルを作成ダウンロード : PCよりファイル転送実機動作 : FPGAボードで実際の動作を確認する 2.2 FPGA ボードの設計デモ FPGA ボードのブロック図 7 セグメント LED 3 FPGA PC 接続コネクタ 拡張ヘッダ (26I/O, オプション ) プッシュ スイッチ クロック発振器 33MHz FPGA Altera 社 7 セグメント LED 3 単体 LED 緑 3, 赤 3 単体 LED 緑 3, 赤 3 プッシュ SW FPGA ボード Altera (5 万ゲート相当 ) 搭載 設計ツール (QUARTSⅡ) DC 入力 5~6V 電源回路 1.5V, 3.3V ダウンロード回路 (ByteBlasterMV) パソコンのパラレルポート
QuartusⅡ による FPGA 設計フロー VHDL の基本構文 1 プロジェクトの作成 プロジェクト名の指定 設計ファイルの指定 ターゲット デバイスの指定 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_unsigned.all; 各種データ型や演算子に関するライブラリを指定 2 デザイン エントリ ( ソース コード入力 ) 3 コンパイル 4 ダウンロード ( サードパーティ ツールの指定 ) 論理合成 配置配線 コンフィグレーション データ生成 プログラミング方式の指定 コンフィグレーション ファイルの指定 プログラミングの実行 ピン配置指定 entity エンティティ名 is [ エンティティ文 ] end [ エンティティ名 ]; architecture アーキテクチャ名 of エンティティ名 is -- ノード宣言部 ( 外部には出力しない信号 ) signal, type 等 [ アーキテクチャ文 ] end [ アーキテクチャ名 ]; 入出力端子 (port) の設定 アーキテクチャ宣言 の機能 動作を記述 例題 1: LED の点灯と消灯 例題 1: LED の点灯 -- VHDL ソースコード 27 Vcc 3.3V D4 34 28 26 35 36 560Ω 6 D7 D5 D6 FPGA ボードの LED 周辺回路 D8 D9 LED の点灯 消灯をピンの L/H で制御 ( 負論理 ) LED のアノードには Vcc (3.3V) が印加されている I/O ピンが L で点灯 I/O ピンが H で消灯 LED(D9) を点灯するピン配置 ピンの名前 led_out ピン番号 36 entity practice1 is led_out: out std_logic); end practice1; architecture rtl of practice1 is -- led_outが 0 で LEDが点灯 -- led_outが 1 でLEDが消灯 led_out <= '0'; ( 出力ポート設定 ) アーキテクチャ宣言 --- RTL レベルでの動作記述
QuartusⅡ の操作手順 ( 操作デモ概要 ) 例題 2: 3 個の LED で 2 進数を表示する QuartusⅡ の起動 1 プロジェクトの作成 2 デザイン エントリ ( ソース コード入力 ) 3 コンパイル 4 ダウンロード プロジェクト名の指定 設計ファイルの指定 ターゲット デバイスの指定 ( サードパーティ ツールの指定 ) プリフィット ( 論理合成 配置配線 ) -- 回路規模, 動作周波数チェック他 ポストフィット ( 書込みデータ生成 ) Tools Programmer 設定確認,Auto Detect ( 認識 ) ファイル名指定 (*.sof) Start 時間の関係上既存 qpf を開く (qdesigns quartus_usage) T100C8 ピン配置指定 未使用ピン処理 ( プルアップ &Hi-Z) entity practice2 is led_out: out std_logic_vector(2 downto 0)); end practice2; architecture rtl of practice2 is -- led_outが 0 のビットはLED 点灯 -- led_outが 1 のビットはLED 消灯 -- 2 進数ビット反転式で (5) 10 を表現 led_out <= "010"; (3 ビットバス出力 ) アーキテクチャ宣言 --- RTL レベルでの動作記述 例題 3: 7 セグメント LED に 16 進数を表示する (1) use ieee.std_logic_unsigned.all; entity practice3 is led_out: out std_logic_vector(7 downto 0)); end practice3; architecture rtl of practice3 is signal counter : std_logic_vector(3 downto 0) := (others=>'0'); counter <= "0010"; -- 以下に続く 4 ビットで 7 セグ LED の表示数値を設定 アーキテクチャ宣言ノード counter 定義 (8 ビットバス出力 ) FPGA ボードの 7 セグメント LED 回路 5 20 23 26 24 21 22 a b c d e f g 25 560Ω 8 f e D3 a g d Vcc (3.3V) b c coma comdp dp LED アクティブLow 信号表示 a b c d e f g 0 0 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 1 1 1 0 0 0 7セグメントLED(D3) のピン配置 ピンの名前 接続 ピン番号 led_out[0] dp 25 led_out[1] g 22 led_out[2] f 21 led_out[3] e 24 led_out[4] d 26 led_out[5] c 23 led_out[6] b 20 led_out[7] a 5
例題 3: 7 セグメント LED に 16 進数を表示する (2) process 文 : 4ビット入力 process(counter) 値の変化による8ビット 出力値の変化を記述 case counter is (7セグ表示用デコーダ) when "0000" => led_out <= "00000011"; when "0001" => led_out <= "10011111"; case 文 : when 条件 when "0010" => で場合分けし, => led_out <= "00100101"; の文を実行する when "1000" => led_out <= "00000001"; when "1001" => led_out <= "00001001"; when "1010" => led_out <= "00010001"; when "1011" => led_out <= "11000001"; when "1100" => led_out <= "11100101"; when "1101" => led_out <= "10000101"; when "1110" => led_out <= "01100001"; when "1111" => led_out <= "01110001"; when others => null; end case; 例題 4: 7 セグメント LED 表示を順次増加させる (1) use ieee.std_logic_unsigned.all; entity practice4 is clk led_out: out std_logic_vector(7 downto 0)); ( クロック入力 clk) when "0011" => ( 同時並列に実行 ) led_out <= "00001101"; when "0100" => end practice4; led_out <= "10011001"; when "0101" => architecture rtl of practice4 is led_out <= "01001001"; when "0110" => signal counter : std_logic_vector(3 downto 0) := (others=>'0'); led_out <= "01000001"; othersは それ以 signal div_counter : std_logic_vector(24 downto 0) := (others=>'0'); when "0111" => 外のとき, 処理な signal div_clk : std_logic := '0'; アーキテクチャ宣言 led_out <= "00011111"; しの場合 null 分周用カウンタ div_counter 省略しないこと 分周用クロック div_clk 例題 4: 7 セグメント LED 表示を順次増加させる (2) Process 文 ( 分周回路 ): 33MHzのclkを分周し,1 秒のclkを作成 (25bitカウンタのMSBは32M 分周 ) process (clk) -- if 文で33MHz clkの立上がりを検出し,div_counterを進める if clk'event and clk='1' then div_counter <= div_counter + 1; -- div_clk が 1Hz の分周クロックで, デコーダへのクロック入力 div_clk <= div_counter(24); process(div_clk) if div_clk'event and div_clk='1' then counter <= counter + 1; Process 文 : div_clk の立上がり検出し, LED 表示用 counter を進める 例題 4: 7 セグメント LED 表示を順次増加させる (3) process(counter) case counter is when "0000" => led_out <= "00000011"; when "0001" => led_out <= "10011111"; when "0010" => led_out <= "00100101"; when "0011" => led_out <= "00001101"; when "0100" => led_out <= "10011001"; when "0101" => led_out <= 01001001 ; when "0110" => led_out <= "01000001"; when "0111" => led_out <= "00011111"; process 文 : 4 ビット入力値の変化による 8 ビット出力値の変化を記述 (7 セグ表示用デコーダ ) when "1000" => led_out <= "00000001"; when "1001" => led_out <= "00001001"; when "1010" => led_out <= "00010001"; when "1011" => led_out <= "11000001"; when "1100" => led_out <= "11100101"; when "1101" => led_out <= "10000101"; when "1110" => led_out <= "01100001"; when "1111" => led_out <= "01110001"; when others => null; end case;
3 人による多数決の真理値表 ( 基礎第 2 回講義より ) A B C Y 0 0 0 0 A 0 0 1 0 C 0 1 0 0 B 0 1 1 1 1 0 0 0 入力変数 A, B, Cとして, 出力 Yは 1 0 1 1 Y = ABC + ABC + ABC + ABC 1 1 0 1 1 1 1 1 この論理式を順次簡単化 Y = ABC + ABC + ABC + ABC + ABC + ABC = BC ( A + A) + AC( B + B) + AB( C + C) = AB + BC + CA Vcc 3.3V SW1 SW 入力回路とチャタリング除去 SW2 FPGA ボードの SW 入力回路 SW3 SW4 2.2k 100Ω 1μ 40 39 38 37 10 CK (33MHz) SW1~SW4: 40~37 番ピン ( 負論理 ) 33Ω OFF ON SW 波形 ピンの名前 led_out sw_in1 sw_in2 sw_in3 clk チャタリング (1ms 位 ) CK 波形 ( 基本 CK の分周波形 ) 理想タイミング 1 回目 "H" タイミング 1 回目 "L" タイミング #1 #1 #1 #2 ピン番号 36 37 38 39 10 CK 立上がりで SW 信号取得 1 回目の結果がマチマチでも 2 回目は L" ( 周期 msオーダ ) #2 例題 51: 3 個のスイッチによる多数決論理 (1) use ieee.std_logic_unsigned.all; entity practice51 is -- div_bits is division bits number generic ( div_bits : integer :=15); port( clk sw_in1 sw_in2 sw_in3 led_out end practice51; : out std_logic); & 1 チャタリング除去用分周設定 ( ) - 15bit 分周 (33MHz 1KHz) 2 入出力ポート設定入力 : SW1~3 出力 : LED generic 文 : 回路全体に適用可能なパラメータ ( アーキテクチャ部でも使用可 ) 例題 51: 3 個のスイッチによる多数決論理 (2) architecture rtl of practice51 is signal div_counter : std_logic_vector(div_bits-1 downto 0) := (others=>'0'); signal sw_in_node1, sw_in_node2, sw_in_node3 : std_logic; signal a, b, c, y : std_logic; -- チャタリング防止のためのクロック分周回路 process(clk) if clk event and clk = 1 then -- CLK の立上がり検出 カウント UP div_counter <= div_counter + 1; -- 分周信号で SW 入力をラッチする回路 ( 分周 CK の MSB を CK にする ) process (div_counter(div_bits-1)) -- process if div_counter(div_bits-1)'event and div_counter(div_bits-1) ='1' then sw_in_node1 <= sw_in1; sw_in_node2 <= sw_in2; sw_in_node3 <= sw_in3; 3 個の SW 入力 ( 多数決入力 ) div_counter の最上位ビットの立ち上がり検出
例題 51: 3 個のスイッチによる多数決論理 (3) まとめ a <= not sw_in_node1; b <= not sw_in_node2; c <= not sw_in_node3; y <= (a and b) or (b and c) or (c and a); led_out <= not y; 論理演算結果を LED に出力 多数決論理 の内部演算 y = ab + bc + ca HDL 設計入門 設計の流れ FPGA ボードによる設計デモ VHDL 基本構文 QuartusⅡ の操作手順と例題 #1 LED の点灯と消灯 #2 3 個の LED による 2 進数表示 #3 7 セグメント LED に 16 進数を表示する #4 7 セグメント LED 表示を順次増加させる #51 3 個のスイッチによる多数決論理 参考図書 山際伸一, 改訂版 FPGA ボードで学ぶ設計,CQ 出版 (2009) 堀桂太郎, 図解 VHDL 実習第 2 版, 森北出版 (2004) 徹底図解ロジック回路設計はじめの一歩,CQ 出版 (2009)