FPGA の実験 Ⅱ 1. 目的 (1)FPGA を用いて組合せ回路や順序回路を設計する方法を理解する (2) スイッチや表示器の動作を理解し 入出力信号を正しく扱う 2. スケジュール項目 FPGAの実験 Ⅱ( その1) FPGAの実験 Ⅱ( その2) FPGAの実験 Ⅱ( その3) FPGAの実験 Ⅱ( その4) FPGAの実験 Ⅱ( その5) FPGAの実験 Ⅱ( その6) FPGAの実験 Ⅱ( その7) 内容実験の説明 実験 (1) の予備実験実験 (1) の予備実験のまとめ実験 (1) の計画書の作成とチェック実験 (1) の実施実験 (1) のレポートの作成実験 (1) のレポートのチェック実験 (2) の予備実験実験 (2) の予備実験のまとめ実験 (2) の計画書の作成とチェック実験 (2) の実施実験 (2) のレポート作成プレゼンテーション 3. 実験 3-1. 実験の手順次の手順で実験を進める なお (S1) から (S3) は 予め実験計画書にまとめておくこと 予備実験はレポートに書かなくても良い (S1) 準備 ( 実験方法の基本的な考え方をまとめる ) (S2)FPGA で実現する回路の構成をブロック図 入出力信号を真理値表で表す (S3)VHDL コードの作成 ( コーディング ) (S4) 論理合成 配置配線及びダウンロードの実行と動作の確認 実験ボードの取り扱い及びパソコンの操作については 下記のサイト に掲載する資料 ( 実験補助テキスト ) を参考にしてください http://esato.net/ex/ 1
3-2. 実験ボードザイリンクス社製 XC3S700A-4FGG400C(Spartan-3A) System Gate 700K Equivalent Logic Cells 13,248 3-3. 実験 (1) デコーダ回路 3-3-1. 予備実験 (1) SW6 とSW7を操作し 7セグメントLEDのD30に0から3を表示させる回路を作成する (S1) 準備 ( 実現方法の基本的な考え方をまとめる ) 実験ボードでは プッシュスイッチSW6が図 1のとおりFPGAのM7ピンに接続されている またSW7も同様の回路で FPGAのL6ピンに接続されている SW6 及びSW7 のOFF/ONとFPGAの入力信号 ( 1 -High / 0 -Low) の関係は 表 1で表される 表 1 SWの状態とFPGA 入力信号 SW6 FPGA M7 SW7 FPGA L6 OFF OFF ON ON 図 1 プッシュスイッチ SW6 7セグメント LEDのD30とFPGAの接続を図 2に示す 使用している7セグメント LED は アノードコモンタイプであり FPGA の U15 ピンを High にすることで表示が可能になる また セグメントの割当を図 3に示す 各セグメントはカソード側に接続された FPGAのピン出力をHighにすることで点灯する 7セグメントLED に0から3を表示させるには FPGAから表 2の組み合わせで信号を出力する必要がある 2
図 2 7 セグメント LED D30 図 3 セグメント割当 7Seg. LED 表示 0 1 2 3 表 2 7セグメントに0から3を表示させるための出力信号各セグメント (FPGAのピン) の出力信号 [ 1 -High / 0 -Low] * D.P g f e d c (T13) (R13) (U9) (Y11) (W10) (W9) b a (Y9) (Y7) (S2) FPGA で実現する回路の構成をブロック図 入出力信号を真理値表で表す FPGAで実現するデコーダ回路は 入力信号が2ビット 出力信号が8ビットとなる 入出力信号は共にベクトル型で扱うものとし その変数と回路の構成を図 4 入出力信号の関係を表 3に示す 3
図 4 FPGA で実現するデコータ回路のブロック図 表 3 FPGAで実現するデコーダ回路の真理値表入力出力 A(1) A(0) L(7) L(6) L(5) L(4) L(3) L(2) L(1) L(0) 0 0 0 1 1 0 1 1 (S3) VHDL コードの作成 ( コーディング ) 7 セグメント LED に 0 から 3 を表示させるための VHDL コードを以下に示す < リスト 1 デコーダ回路の例 SEG01.vhd> 1 library IEEE; 2 use IEEE.STD_LOGIC_1164.ALL; 3 use IEEE.STD_LOGIC_ARITH.ALL; 4 use IEEE.STD_LOGIC_UNSIGNED.ALL; 5 6 entity SEG01 is 7 Port ( A : in STD_LOGIC_VECTOR (1 downto 0); 8 L : out STD_LOGIC_VECTOR (7 downto 0); 9 SEG : out STD_LOGIC); 10 end SEG01; 11 4
12 architecture Behavioral of SEG01 is 13 begin 14 process (A) 15 begin 16 case A is 17 when "11" => L <= " "; 18 when "10" => L <= " "; 19 when "01" => L <= " "; 20 when "00" => L <= " "; 21 when others => null; 22 end case; 23 end process; 24 25 SEG <= '1'; 26 end Behavioral; SEG は 7 セグメント LED D30 の選択に利用されている 今回の 7 セグメント LED の利用は D30 のみであるため 25 行目で 1 を出力する (S4) 論理合成 配置配線及びダウンロードを実行し 目的の動作が実現出来な い場合には 表 2 の信号パターンや VHDL コード 開発環境の操作手順を見直す こと SW7 表 4 予備実験 (1) の結果 SW6 7 セグメント LED(D30) の表示 3-3-2. 実験 (1) 4つのプッシュスイッチを利用して7セグメントLEDに0から9を表示させる回路を作成せよ なお 実験ボードのプッシュスイッチSW16はFPGAのL7ピン SW17はK5 ピンに接続されている まず実験の手順 (S1) から (S3) の実験計画書を作成する 次に実験計画書に基づいて (S4) を実行し 結果をまとめる 5
3-3-3. 追加課題図 5はブロック図と真理値表を用いて動作を表しているのに対して 図 6では回路図を示している VHDLでコードを記述する際にも 同様にリスト2( 動作記述 ) とリスト 2( 構造記述 ) の2 種類の書き方がある まずは リスト 3を参考にして実験 1のデコーダ回路を構造記述で実現し 次に動作記述並びに構造記述の長所 短所について検討せよ 真理値表 入力 出 A B AND/OR F 力 A B S F 0 0 0 0 S ブロック図 0 1 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 1 1 1 1 0 1 1 1 1 1 1 図 5 AND/OR セレクタ回路 ( 動作図 ) A B X = A B Y = A S S F = X + Y + Z X, Y, Z は内部信号としてアーキテクチャ宣言内の信号宣言部において 信号名とデータ型を記す Z = B S 図 6 AND/OR セレクタ回路 ( 構造図 ) 6
リスト 2( 動作記述 ) entity sample1 is Port( A, B, S : in std_logic ; F : out std_logic ) ; end sample1 ; architecture Behavioral of sample1 is begin process( A, B, S ) begin case S is when '0' => F <= A and B ; when '1' => F <= A or B ; when others => null ; end case ; end process ; end Behavioral ; リスト 3( 構造記述 ) entity sample2 is Port( A, B, S : in std_logic ; F : out std_logic ) ; end sample1 ; architecture Behavioral of sample1 is signal X, Y, Z : std_logic ; < 内部信号の宣言 > signal 信号名 : データ型 ; begin X <= A and B ; Y <= A and S ; Z <= B and S ; F <= X or Y or Z ; end Behavioral ; 7
3-4. 実験 (2) カウンタ回路 3-4-1. 予備実験 (2) FPGA のシステムクロックを利用して約 1 秒毎に汎用 LED7が点滅する回路を作成する (S1) 実験ボードでは FPGAのE11ピンに133MHzのシステムクロックが入力されている 約 1Hzのクロックを生成するには このシステムクロックを1/2 27 に分周すれば良い 2 27 = 133 10 6 / 2 27 = 汎用 LED7 は 図 5 のとおり FPGA の R3 と接続され ており Low レベルの信号出力があった場合に点灯 する 図 7 汎用 LED7 (S2) FPGA で実現する分周回路の構成を図 6 に示す この回路には システムクロックを 1/2 27 に分周するために内部信号 D0( ベクトル型 27 ビット ) を設け 表 4 のとおり2 進数でシステムクロックの立ち上がりエッジをカウントアップする D0の値が 011111111111111111111111111 になった時に出力信号 CE= 1 とし 111 1111 1111 1111 1111 1111 1111 になった時にはCE= 0 とする システムクロック 133MHz CLK 分周回路 CE LED7 図 8 分周回路 8
表 4 分周回路に設けた内部信号 D0と出力信号 CEの関係 10 進数 D0 CE 0 000 0000 0000 0000 0000 0000 0000 0 1 000 0000 0000 0000 0000 0000 0001 0 : : : 67,108,862 011 1111 1111 1111 1111 1111 1110 0 67,108,863 011 1111 1111 1111 1111 1111 1111 1 : : : 134,217,726 111 1111 1111 1111 1111 1111 1110 1 134,217,727 111 1111 1111 1111 1111 1111 1111 0 (S3) < リスト 4 分周回路の例 CNT01.vhd> 1 library IEEE; 2 use IEEE.STD_LOGIC_1164.ALL; 3 use IEEE.STD_LOGIC_ARITH.ALL; 4 use IEEE.STD_LOGIC_UNSIGNED.ALL; 5 6 entity CNT01 is 7 Port ( CLK : in STD_LOGIC; 8 CE : out STD_LOGIC); 9 end CNT01; 10 11 architecture Behavioral of CNT01 is 12 signal D0 : std_logic_vector(26 downto 0); 13 14 begin 15 process (CLK) 16 begin 17 if CLK'event and CLK='1' then 18 D0 <= D0 + '1'; 19 end if; 20 end process; 21 22 process (D0) 23 begin 24 if D0 = "011111111111111111111111111" then 25 CE <= '1'; 9
26 elsif D0 ="111111111111111111111111111" then 27 CE <= '0'; 28 end if; 29 end process; 30 31 end Behavioral; (S4) 論理合成 配置配線及びダウンロードを実行し 目的の動作が実現出来な い場合には 表 2 の信号パターンや VHDL コード 開発環境の操作手順を見直す こと 3-4-2. 実験 (2) 予備実験を参考にして 約 1 秒毎に表示が切り替わる10 進カウンタを作成する なおカウンタ値の表示は 汎用 LED4からLED7を利用する 各 LEDのFPGA への接続先を表 5に示す 各 LED は LED7と同様にLowレベル出力で点灯する まず実験の手順 (S1) から (S3) の実験計画書を作成する 次に実験計画書に基づいて (S4) を実行し 結果をまとめる 表 5 汎用 LEDの接続先 汎用 LED FPGAのピン LED4 T4 LED5 U1 LED6 U3 LED7 R3 システムクロック 133MHz CLK 分周回路 CE 10 進カウンタ QE(3) QE(2) QE(1) LED4 LED5 LED6 QE(0) LED7 図 9 10 進カウンタ 10
ヒントリスト 5 カウンタ回路の例 ( 改良点のみ ) 31 process (CE) 32 begin 33 if (CE'event and CE='1') then 34 if(qe =" ") then 35 QE <="0000"; 36 else 37 QE <= QE + '1'; 38 end if; 39 end if; 40 end process; QE を新たに出力端子としてエンティティ宣言する 一方 CE は内部変数 として D0 と同様にアーキテクチャ宣言部へ移動します 3-4-3. 追加課題 プッシュスイッチ SW6 を押すと 7 セグメント LED の表示が 9 となり 9 から 0 まで約 1 秒毎にカウントダウンするタイマを作成せよ ヒント 実験 (1) と実験 (2) の回路を合わせる 10 進カウンタに SW6 によるプリセット機能を設ける 各回路の入出力の論理 (High/Low) に注意すること システムクロック 133MHz 分周回路 CE 10 進カウンタデコーダ プッシュスイッチ SW6 QE(0)~QE(3) SEG L(0)~L(7) 7セグメントLED 表示器 (D30) 図 10 10 進カウンタの応用 11
4. 付録 :VHDL の書き方 VHDL のコードは ライブラリ宣言 エンティティ宣言 アーキテクチャ宣言の3ブロックからなる 1ライブラリ宣言データ型や演算子などを利用するために必要なライブラリとパッケージを指定する library ライブラリ名 ; use ライブラリ名. パッケージ名 ; 2 エンティティ宣言 入出力の設定 エンティティ名は 他のファイルと重複しないようにし モード型は入出力の区別 (input/output/inout; 双方向 ) を行う entity エンティティ名 is port ( ポート名 : モード型データ型 ); end エンティティ名 ; 3アーキテクチャ宣言デジタル回路の機能を記述 信号宣言部は 内部信号を記述する部分であり signal 文を使用する 機能宣言部は begin と end で挟まれた部分であり デジタル回路の論理機能を記述する 演算結果の代入には <= 記号を用いる architecture アーキテクチャ名 of エンティティ名 is 信号宣言部 begin 機能宣言部 end アーキテクチャ名 ; 12
A1. 論理演算子 演算子 機能 and 論理積 or 論理和 not 論理否定 nand 否定論理積 nor 否定論理和 xor 排他的論理和 xnor 否定排他的論理和 例 ) X <= A and B ; A とBの論理積をとり X に格納 Y <= not C ; Cの否定をとり Y とする A2. データ型 std_logic 0,1などの論理値 std_logic_vector std_logicのベクトル値 例えば 複数ビットの論理データはベクトルとして次のようにまとめることができる A0: in std_logic; A1: in std_logic; A: in std_logic_vector(2 downto 0); A2: in std_logic; * A(2),A(1),A(0) とみなす A3. Signal 文回路の内部信号は アーキテクチャ宣言の信号宣言部において以下のように記述する signal 信号名 : データ型 ; B1. Process 文センシティビティリストに記述した信号が変化すると シーケンシャル領域に記述した内容を上から順に実行する [ ラベル名 :] process( センシティビティリスト ) begin シーケンシャル領域 上から順に実行 end process [ ラベル名 ]; ** アーキテクチャ宣言部で記述した複数の文は 通常同時に ( 並行 ) 実行される 一般のプログラミング言語 ( アセンブラ, C など ) のようにシーケンシャルに実行させる必要がある場合には process 文を利用する 13
B2. If 文条件が真 ( 成立 ) の場合には順次処理 1 が実行され 偽の場合には順次処理 2 が実行される else 部は省略することもできる if ( 条件 ) then 複数の条件を判定したい場合には 順次処理 1 ; if ( 条件 1 ) then else 順次処理 1; 順次処理 2 ; elsif ( 条件 2 ) then end if; 順次処理 2; else 条件の記載に用いる関係演算子には 順次処理 3; A = B AとBは等しい end if; A /= B AとBは等しくない A < B AはBより小さい A >= B AはB 以上などがある B3. Case 文信号の値によって処理が選ばれる もし 一致するものが無ければ when others で指定した処理 n が実行される case ( 信号名 ) is when 信号の値 1 => 処理 1 ; when 信号の値 2 => 処理 2 ; : when others => 処理 n ; end case ; D. 実習ボード TS102( 東京エレクトロンデバイス ) 27 セグメント LED D30 3 汎用 LED7( 右端 ) 4 プッシュスイッチ SW17 SW7 SW7 SW6 1 電源スイッチ 14