2.2 fpgaボードの設計デモ...
TRANSCRIPT
摂大・鹿間論理回路
論理回路 (第15回)
特別講義: 言語を使った設計(2)
2.1 HDL設計入門
2.2 FPGAボードの設計デモ
配布資料 「VHDLの言語構造と基本文法」
鹿間 信介
摂南大学 理工学部 電気電子工学科
論理回路 摂大・鹿間
2.1 HDL設計入門
② HDLコード記述
④ 論理合成
⑤ 配置配線
⑦ ダウンロードファイル作成
⑧ ダウンロード
③ 論理シミュレーション
⑥ 遅延シミュレーション
⑨ 実機での動作確認
FPGAベンダーが提供(例: QuartusⅡ/Altera, ISE/Xilinx)
① 仕様設計
EDA*ツール:メンター社製品が有名FPGAベンダーのSWにも簡易機能あり
* EDA: Electronic Design Automation
① 仕様: 製作する回路機能を明確化
② コード: VHDLによる記述
③ 論理SIM: 実回路での遅延を考慮
しないSIM (小規模回路では省略)④ 合成: 論理回路を生成
⑤ 配置配線: FPGA内部構成用デー
タを生成し,ピン割り当てを行う
⑥ 遅延SIM: 遅延を含めた動作SIM⑦ ファイル作成: FPGAに転送する形
式のファイルを作成
⑧ ダウンロード: PCよりファイル転送
⑨ 実機動作: FPGAボードで実際の
動作を確認
論理回路 摂大・鹿間
2.2 FPGAボードの設計デモ
FPGAボードAltera EP1C3(5万ゲート相当)搭載
設計ツール (QUARTSⅡ)
FPGAEP1C3
PC接続コネクタ
7セグメントLED×3
プッシュSW×4
単体LED緑3,赤3
論理回路 摂大・鹿間
FPGAボードのブロック図
FPGAAltera社EP1C3
7セグメントLED×3
単体LED緑×3, 赤×3
ダウンロード回路(ByteBlasterMV)
パソコンのパラレルポート
電源回路1.5V, 3.3V
DC入力5~6V
クロック発振器33MHz
プッシュ・スイッチ×4
拡張ヘッダ(26I/O, オプション)
論理回路 摂大・鹿間
QuartusⅡによるFPGA設計フロー
④ ダウンロード
① プロジェクトの作成
② デザイン・エントリ(ソース・コード入力)
③ コンパイル
プロジェクト名の指定
設計ファイルの指定
ターゲット・デバイスの指定
(サードパーティ・ツールの指定)
プログラミング方式の指定
コンフィグレーション・ファイルの指定
プログラミングの実行
論理合成
配置配線
コンフィグレーション・データ生成
ピン配置指定
論理回路 摂大・鹿間
VHDLの基本構文 ライブラリ宣言
各種データ型や演算子に関するライブラリを指定
エンティティ宣言 入出力端子(port)
の設定
アーキテクチャ宣言
論理回路の機能・動作を記述
library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_unsigned.all;
entity エンティティ名 is[エンティティ文]
end [エンティティ名];
architecture アーキテクチャ名 of エンティティ名 is-- ノード宣言部 (外部には出力しない信号)signal, type 等
begin[アーキテクチャ文]
end [アーキテクチャ名];
論理回路 摂大・鹿間
例題1: LEDの点灯と消灯
LEDの点灯・消灯をピンの
L/Hで制御 (負論理)
LEDのアノードにはVcc (3.3V)が印加されている
I/Oピンが”L”で点灯
I/Oピンが”H”で消灯
FPGAボードのLED周辺回路
EP1C3
560Ω×6363526283427
D4
D5
D6
D8 D9D7
Vcc3.3V
LED(D9)を点灯するピン配置
ピンの名前 ピン番号
led_out 36
論理回路 摂大・鹿間
例題1: LEDの点灯-- VHDLソースコード
library ieee;use ieee.std_logic_1164.all;entity practice1 is
port (led_out: out std_logic);
end practice1;architecture rtl of practice1 isbegin-- led_outが ‘0’で LEDが点灯-- led_outが ‘1’ でLEDが消灯led_out <= '0';
end rtl;
ライブラリ宣言
パッケージ呼び出し
エンティティ宣言(出力ポート設定)
アーキテクチャ宣言--- RTLレベルで論理回路の動作記述
論理回路 摂大・鹿間
QuartusⅡの操作手順 (操作デモ概要)
プロジェクト名の指定
設計ファイルの指定
ターゲット・デバイスの指定
(サードパーティ・ツールの指定)
Tools ⇒ Programmer
設定確認,Auto Detect (EP1C3認識)
ファイル名指定 (*.sof) ⇒ Start
プリフィット(論理合成・配置配線)-- 回路規模,動作周波数チェック他
ポストフィット(書込みデータ生成)
④ ダウンロード
① プロジェクトの作成
② デザイン・エントリ(ソース・コード入力)
③ コンパイル
QuartusⅡの起動
EP1C3T100C8
・ ピン配置指定・ 未使用ピン処理(プルアップ&Hi-Z)
時間の関係上既存qpfを開く
(qdesigns¥quartus_usage)
論理回路 摂大・鹿間
例題2: 3個のLEDで2進数を表示する
library ieee;use ieee.std_logic_1164.all;entity practice2 is
port (led_out: out std_logic_vector(2 downto 0));
end practice2;architecture rtl of practice2 isbegin-- led_outが ‘0’のビットはLED点灯-- led_outが ‘1’のビットはLED消灯-- 2進数ビット反転式で(5)10を表現led_out <= "010";
end rtl;
ライブラリ宣言
パッケージ呼び出し
エンティティ宣言(3ビットバス出力)
アーキテクチャ宣言--- RTLレベルで論理回路の動作記述
論理回路 摂大・鹿間
例題3: 7セグメントLEDに16進数を表示する(1)
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity practice3 is
port (led_out: out std_logic_vector(7 downto 0));
end practice3;architecture rtl of practice3 issignal counter : std_logic_vector(3 downto 0) := (others=>'0');begin
counter <= "0010";
-- 以下に続く
ライブラリ宣言
エンティティ宣言(8ビットバス出力)
アーキテクチャ宣言ノード”counter”定義4ビットで7セグLED
の表示数値を設定
パッケージ呼び出し
論理回路 摂大・鹿間
FPGAボードの7セグメントLED回路
EP1C3
560Ω×8252221
2426
23
20
5
Vcc (3.3V)comA
comDP
abcdefg
D3
7セグメントLED(D3)のピン配置ピンの名前 接続 ピン番号
led_out[0] dp 25led_out[1] g 22led_out[2] f 21led_out[3] e 24led_out[4] d 26led_out[5] c 23led_out[6] b 20led_out[7] a 5
LED表示 a b c d e f g
0 0 0 0 0 0 11 0 0 1 1 1 10 0 1 0 0 1 00 0 0 0 1 1 01 0 0 1 1 0 00 1 0 0 1 0 00 1 0 0 0 0 00 0 0 1 1 1 10 0 0 0 0 0 00 0 0 0 1 0 00 0 0 1 0 0 01 1 0 0 0 0 01 1 1 0 0 1 01 0 0 0 0 1 00 1 1 0 0 0 00 1 1 1 0 0 0
アクティブLow信号
論理回路 摂大・鹿間
例題3: 7セグメントLEDに16進数を表示する(2)
process(counter)begincase counter iswhen "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";
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;
end process;end rtl;
process文: 4ビット入力値の変化による8ビット出力値の変化を記述(7セグ表示用デコーダ)
case文:”when”条件で場合分けし,”=>”の文を実行する(同時並列に実行)
・othersは「それ以
外のとき」,処理なしの場合’null’・省略しないこと 論理回路 摂大・鹿間
例題4: 7セグメントLED表示を順次増加させる(1)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity practice4 is
port (clk : in std_logic;led_out: out std_logic_vector(7 downto 0));
end practice4;architecture rtl of practice4 is
signal counter : std_logic_vector(3 downto 0) := (others=>'0');signal div_counter : std_logic_vector(24 downto 0) := (others=>'0');signal div_clk : std_logic := '0';
ライブラリ宣言
エンティティ宣言(クロック入力clk)
アーキテクチャ宣言分周用カウンタ div_counter分周用クロック div_clk
パッケージ呼び出し
論理回路 摂大・鹿間
例題4: 7セグメントLED表示を順次増加させる(2)
begin
process (clk)begin
-- if文で33MHz clkの立上がりを検出し,div_counterを進めるif clk'event and clk='1' then
div_counter <= div_counter + 1;end if;
end process;
-- div_clkが1Hzの分周クロックで,デコーダへのクロック入力div_clk <= div_counter(24);
process(div_clk)begin
if div_clk'event and div_clk='1' thencounter <= counter + 1;
end if;end process;
Process文(分周回路):33MHzのclkを分周し,1秒のclkを作成(25bitカウンタのMSBは32M分周)
Process文:div_clkの立上がり検出し,LED表示用counterを進める
論理回路 摂大・鹿間
例題4: 7セグメントLED表示を順次増加させる(3)
process(counter)begin
case counter iswhen "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";
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;
end process;end rtl;
process文: 4ビット入力値の変化による8ビット出力値の変化を記述(7セグ表示用デコーダ)
論理回路 摂大・鹿間
3人による多数決の真理値表(論理回路基礎 第2回講義より)
入力変数A, B, Cとして,出力Yは
A B C0 0 00 0 10 1 00 1 11 0 01 0 11 1 01 1 1
Y00010111
AB
C
ABCCABCBABCAY
この論理式を順次簡単化
ABCABCABCCABCBABCAY )()()( CCABBBACAABC
CABCAB 論理回路 摂大・鹿間
SW入力回路とチャタリング除去
SW1~SW4:40~37番ピン(負論理)
ピンの名前 ピン番号
led_out 36sw_in1 37sw_in2 38sw_in3 39
clk 10
FPGAボードのSW入力回路
EP1C3
100Ω×4
Vcc3.3V
SW1
SW2
SW3
SW4
37
38
39
40
2.2k×4
1μ×4
10
33ΩCK
(33MHz)
OFF ⇒ ON チャタリング(1ms位)
↓ CK波形(基本CKの分周波形)
SW波形
理想タイミング
1回目"H"タイミング
1回目"L"タイミング
#1
#1
#1 #2
#2
CK立上がりでSW信号取得
1回目の結果がマチマチでも、2回目は”L" (周期msオーダ)
論理回路 摂大・鹿間
例題51: 3個のスイッチによる多数決論理(1)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity practice51 is
-- div_bits is division bits numbergeneric (div_bits : integer :=15);
port(clk : in std_logic;sw_in1 : in std_logic;sw_in2 : in std_logic;sw_in3 : in std_logic;led_out : out std_logic);
end practice51;
エンティティ宣言
②入出力ポート設定入力: SW1~3出力: LED
① チャタリング除去用分周設定(※)- 15bit分周 (33MHz⇒1KHz)
※ generic文:回路全体に適用可能なパラメータ(アーキテクチャ部でも使用可)
ライブラリ宣言 &パッケージ呼び出し
論理回路 摂大・鹿間
例題51: 3個のスイッチによる多数決論理(2)architecture rtl of practice51 issignal 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;begin
-- チャタリング防止のためのクロック分周回路process(clk)begin
if clk‘event and clk = ’1‘ then -- CLKの立上がり検出 ⇒ カウントUPdiv_counter <= div_counter + 1;
end if;end process;-- 分周信号でSW入力をラッチする回路(分周CKのMSBをCKにする)process (div_counter(div_bits-1))begin -- processif div_counter(div_bits-1)'event and div_counter(div_bits-1) ='1' thensw_in_node1 <= sw_in1;sw_in_node2 <= sw_in2;sw_in_node3 <= sw_in3;
end if;end process;
div_counterの最上位ビットの立ち上がり検出3個のSW入力
(多数決入力)
論理回路 摂大・鹿間
例題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;end rtl; cabcaby
多数決論理
論理演算結果をLEDに出力
論理回路の内部演算
論理回路 摂大・鹿間
まとめ
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)