...

FPGA を用いた論理回路設計

by user

on
Category: Documents
5

views

Report

Comments

Transcript

FPGA を用いた論理回路設計
FPGA を用いた論理回路設計
目次
1. 実験目的
2
2. 基礎理論
2
2.1 HDL による設計手法
2
2.2 VHDL の概要
3
2.2.1 VHDL のデータタイプ
3
2.2.2 ライブラリ宣言
3
2.2.3 オブジェクトクラスと代入文
4
2.2.4 演算子
5
2.2.5 制御文
5
2.2.6 ループ文
5
2.2.7 コメント文
5
2.3 VHDL による論理回路記述
6
2.3.1 entity の記述
6
2.3.2 architecture の記述
6
2.3.3 フリップフロップ(FF)の記述
10
2.3.4 テストベンチの記述
11
2.3.5 ピン配置の記述
13
2.4 自動設計ツール
13
2.5 PLD(Programmable Logic Device)
14
2.6 実験用 FPGA ボード
14
2.7 実験上の注意事項
16
3. 予習事項
17
4. 実験方法
18
4.1 予備実験
18
4.1.1 ハーフアダー
18
4.1.2 7 セグメントLED 表示回路
18
4.1.3 16 進カウンタ
20
4.2 本実験
23
4.2.1 7 セグメントLED 表示回路 SSEG_DEC の改良
23
4.2.2 10 進表示 4 ビットカウンタの製作
23
4.2.3 除算回路の製作
25
4.2.4 ステートマシンの製作: 自動販売機の制御回路
27
4.2.5 電卓の製作
33
5. 検討事項
38
6. 調査事項
38
7. 参考文献
38
FPGA-1
1. 実験目的
この実験では、ハードウェア記述言語 HDL によりいろいろな論理回路を設計し、自動設計ツールを用
いてプログラマブルデバイス PLD によりLSI として実現して動作させる。HDL としては国際標準の一
つである VHDL、PLD としては FPGA を用い、言語による論理設計、自動設計ツールの使用法、
PLD の利用法を学ぶ。また応用としてステートマシンや演算回路を設計して動作させ、その理解を深
める。
2. 基礎理論
2.1 HDL による設計手法
プログラミング言語はプログラムの中でのいろいろなデータに対する論理的な処理手順を記述するた
めの言語であるが、データを論理信号に置き換えれば論理信号についての処理、すなわち論理回路
としての動作を記述することができる。例えば次の C 言語記述を考えてみよう。
int a, b, c;
if (a==b) c=0;
else c=1;
これは整数値 1 を論理信号’1’、整数値 0 を論理信号’0’に対応させれば、c は a とb の排他的論理和
XOR の機能を表していると考えられる。このようにプログラミング言語は論理的な手順を記述すること
ができ、論理処理以外にも一般的な演算処理や制御の手順を記述することができる。ハードウェア記
述言語 HDL はこのような目的で開発された言語で、IEEE 標準として VHDL および Verilog HDL
が世界的に利用されている。ここでは VHDL を学習する。この言語を用い、システムとしての動作の
レベル(Behavior Level)から、レジスタや ALU などの機能ブロック間でのデータの流れに着目したレ
ジスタ転送レベル RTL(Register Transfer Level) 、さらには論理ゲートの信号のレベル(Gate
Level) まで、いろいろなレベルでの記述が可能である。HDL で記述したシステムは、機能シミュレータ
により、テストデータを与えてその動作を検証することができる。またレジスタ転送レベル RTL で記述
された HDL 記述は自動論理合成システムにより、論理回路に自動変換することができる。合成され
た論理回路情報は自動配置配線システムにより、目的とするLSI デバイスのチップ設計データに変換
でき、LSI として実現できるレベルにまで自動的に設計を進めることができる。
VHDL はハードウェアの動作を記述するため、とくに次のような点に注意が必要である。
(a) 扱うデータは基本的には論理信号である
RTL での動作をわかりやすく記述するため、整数型や浮動小数点型などのデータタイプも利用でき、
また内部処理用に、論理信号としては実現されない「変数」
(variable)も利用できるが、論理信号と
しての「信号」(signal)が基本的なデータである。
(b) ハードウェアの動作は並列である
プログラム言語では、処理の手順は文ごとに順次的に処理され、それぞれのデータは計算機のメモ
リに記憶されるが、ハードウェアの動作はミクロな動作遅延を除けば、回路全体に一斉に並列的に
伝送され、フリップフロップなどの記憶要素を除けば信号自身には記憶要素はない。このため言語で
の回路動作の記述は文単位 に順次的に行われるが、ハードウェアの動作としては各文は一斉に評
価されると考える。2.2.3 および 2.3.2 で説明する。
(c) ループは回路の繰り返しを表す
FPGA-2
プログラム言語ではループは動作の繰り返しを表すが、VHDL では for、while によるループは基
本的には回路の繰り返しを表す。従って、例えば 1 ビット加算を 8 回ループさせると 8 ビットの加算
回路が生成される。乗除算など、動作の繰り返しとして記述したいときは、演算の中間結果をレジス
タに保存して動作を繰り返すよう、クロック制御による順序回路として記述する必要がある。
(d) 外の世界とのインターフェースと内部の処理を別に記述する
ハードウェアとしては入力と出力の信号が外の世界とのインターフェースであり、それを確定してお
けば、その内部処理は技術の進歩や設計の段階に応じて様々な方法で行ってよい。このためブラッ
クボックスとしての外部仕様と、内部の処理とを別に記述する方法をとる。
2.2 VHDL の概要
2.2.1 VHDL のデータタイプ
標準のデータタイプには次のようなものがある。
integer
32 ビット整数
real
浮動小数点数
bit
論理値 ‘0’、’1’
bit_vector
bit のベクトル (配列)型
boolean
論理値 TRUE、FALSE
character
ASCII 文字
string
文字列
time
時間
論理信号の値としては、基本的な値は ‘0’ と ‘1’ (データタイプは bit)であるが、いろいろな回路の状
態・動作に対応して次の 9 値を用いることが多い(データタイプは std_logic )。
std_logic 、std_logic_vector は拡張データタイプであり、下記(2)のライブラリ宣言の中の IEEE
std_logic_1164 で定義されている。
‘1’、‘0’
通常の論理値 1、0
‘H’、‘L’
弱い 1、0
‘U’
未定値・・・電源投入時の値
‘X’
不定値・・・SRFF に同時に‘1’が入ったときなど、不定の場合の値
‘W’
弱い不定値
‘Z’
ハイインピーダンス状態
‘‐’
don't care
これらの値を定数として使うときは ‘1’、‘X’ などと ‘’でくくって大文字で書く。
ビット幅を持つ信号は bit_vector 、std_logic_vector など、ベクトル (ビットの配列)として表記する。こ
の場合、std_logic_vector(7 downto 0)、bit_vector(0 to 7)などと書き、ビット配列の降順、昇順を区
別する。ベクトルの定数は “0000”、“UUUU”などと “”でくくって書く。
論理信号をアプリケーションから見たデータと考えれば、integer、real など数値として扱う方が便利で
あり、conv_integer、conv_std_logic_vector などの変換関数で相互に変換できる。
2.2.2 ライブラリ宣言
基本的な論理関数などがライブラリとして定義されており、それらを利用するときはライブラリ宣言を行
FPGA-3
う。ライブラリ宣言のスコープ(有効範囲)は一つの回路モジュールの記述(2.4 の entity とその
architectureの記述)の範囲であり、一つの VHDL 記述に複数の entity がある場合はそれぞれにつ
いて宣言が必要となる。通常使うものは以下の 5 種類で、ユーザ定義のライブラリを使うこともできる。
作業中のデータは、自動的に生成される WORK という名前のライブラリに格納される。
library IEEE
標準ライブラリの宣言として必ず必要(ビットの論理演算)
use IEEE std_logic_1164.all
std_logic を使う論理演算を行うとき
use IEEE std_logic_unsigned.all
符号ビットなしの算術演算を使うとき
use IEEE std_logic_signed.all
符号ビット付きの算術演算を使うとき
use IEEE std_logic_arith.all
符号ビットの有無が混在する算術演算を使うとき
unsigned とsigned は同時に使用できないが、その他は混在して宣言してよい。ただし定義が重複す
ることもあるので、シミュレーションを行うときは注意(後述)が必要である。
2.2.3 オブジェクトクラスと代入文
VHDL のオブジェクトクラスは次の 3 つである。
signal(信号)
:論理信号を表す。一つの VHDL 記述のどこでも参照できるグローバル変数。
variable(変数) :process 文の中だけで定義できるローカル変数。そのままでは信号にならない。
constant(定数):グローバルな定数。
代入文は次のように書く。信号と変数は相互に代入可能である。
signal
A、B;
variable C、D;
A<=B;
・・・信号を信号に代入
C:=D;
・・・変数を変数に代入
A<=C;
・・・変数を信号に代入
C:=A;
・・・信号を変数に代入
ハードウェアの並列動作を表現するということで、そのシミュレーションを行う場合、オブジェクトクラス
signal については、信号の値の計算とその信号への値の代入とは別に行われる。すなわち入力信号
が変化した場合、動作遅延などを考慮して、すべての信号値が確定するまでそれぞれの信号値は更
新されない。これに対してオブジェクトクラス variable は一般的なプログラム言語と同様、値が変化す
ればすぐにその値が更新される。次の表 1 の例で考えてみよう。
表 1 代入文の処理
(a) 信号代入
(b) 変数代入
A:=1;
B:=A+2;
A:=2;
C:=B+2;
A<=1;
B<=A+2;
A<=2;
C<=B+2;
この例では、ふつうのプログラミング言語の感覚では B=3 、C=5 となると考えられるが、ハードウェ
アの動作として B の値を計算するときには、(a)の信号代入では A の値は最終的に 2 になっているの
で、B の値は最終的に 4 となり、したがって C の値は 6 となる。(b)の変数代入では、B の値は 2 行目
FPGA-4
で確定して 3 になっているので、C の値は普通の言語と同じで C=5 となる。
上記のデータタイプはどのオブジェクトクラスにも定義できる。そのほかプログラムの制御のためのパ
ラメータ(ループ変数など)も利用できるが、これは論理回路の信号としては現れないパラメータである。
2.2.4 演算子
基本的には一般の言語と同じである。代入と論理演算は同じビット幅の信号間でのみ行える。
A( 3 downto 0 )、B( 5 downto 0 ) に対して A <= B( 4 downto 1 ) は可能。
論理演算子: not、and、or、nand、nor、xor
論理演算は、否定は優先されるが、他の演算子には順位がないので、順序をつけるためには( )が
必要である。
算術演算子: +、−、*、**、/、mod、rem、abs
bit とstd_logic(ベクトルも含む)の除算( /、mod、rem )は 2 のべき乗の演算のみ可能である。整
数型などはふつうの言語と同様。
関係演算子: =、/=、<、<=、>、>=
連接演算子: &
ビット、ビット列を連結する演算で、‘1’ & “01” は “101” になる。
2.2.5 制御文
if 文:次のような形をとる。else if は elsif と書くことに注意。
if (条件) then 順次処理文;
elsif (条件) then 順次処理文;
else 順次処理文;
end if;
case 文:次のような形をとる。
case 式 is
when 選択肢 => 順次処理文;
・・・
end case;
2.2.6 ループ文
for ループ:次のような形をとる。
for ループ変数 in 始点 to 終点 loop
順次処理文;
end loop;
while ループ:次のような形をとる。
while 条件 loop
順序処理文;
end loop;
2.2.7 コメント文
FPGA-5
--で始め、行末までがコメントとなる。
2.3 VHDL による論理回路記述
2.3.1 entity の記述
entity は回路モジュールの入出力関係の記述である。ブラックボックスとして外部とのインタフェース、
すなわちモジュールの名前と入力・出力端子名を記述する。書式は次の通り。
書式:
entity エンティティ名 is
port ( ポート名、[ポート名 ] :入出力 データタイプ
[; ポート名、[ポート名 ] :入出力 データタイプ] ) ;
end エンティティ名 ;
エンティティ名・・・この名前で部品として参照できる
入出力・・・ in:入力、 out:出力、 inout:入出力(双方向)
下記の例のように、モジュールの中はブラックボックスである。なお以下では小文字でキーワード(予約
語)を表す。
例:ハーフアダーの entity 記述
A
entity HALF_ADDER is
SUM
HALF_ADDER
port( A、B :in std_logic;
S U M 、C_OUT :out std_logic );
C_OUT
B
end HALF_ADDER;
図 1 ハーフアダーの entity
2.3.2 architecture の記述
architecture はモジュールの中身の記述である。一つの entity について、その内部はいろいろな形
で記述できる。書式は次のとおり。
書式:
architecture アーキテクチャ名 of エンティティ名 is
signal、component などの宣言
begin
・・・・・・・;
end アーキテクチャ名 ;
内部の記述の形としては、次の二種類がある。
同時処理文 Concurrent Statement
architecture の中で記述される文は、信号が並列的に伝搬するイメージを表し、文は順次的に
記述されるが、並列的に処理される。次の process 文のブロックも同時処理文の一つである。
順次処理文 Sequential Statement
一般のプログラミング言語と同様に順序だてた論理・手続きを記述する。記述に順序性があるだ
けで、回路動作としては並列的なものであることは変わりない。これは次のような process
begin・・・end process のブロックの中で記述される。
process(引数リスト)
FPGA-6
variable の宣言
begin
if 文、for 文などの順次処理文による記述
end process;
同時処理文の書き方の一つであるが、下位のentity を部品 componentとして用い、それらの接続関
係を記述することもできる。architecture の中では図 2 に示すように、信号代入文、component によ
る部品の記述、process 文がそれぞれ並列的に動作するイメージになる。
エンティティ
信号代入文
process 文
入力
ポート
出力
component 文
ポート
信号代入文
process 文
アーキテクチャ
図 2 ハードウェア記述のイメージ
以下で図 1 の half adder の entity 記述に対応するいくつかの architecture 記述例を示す。
(a) 同時処理文 1・・・関数 xor とand を用いた記述
A
architecture DATAFLOW_1 of HALF_ADDER is
SUM
B
begin
C_OUT
SUM <= A xor B;
C_OUT <= A and B;
end DATAFLOW_1;
リスト1. ハーフアダー 1
(b) 同時処理文 2・・・関数 nor とand を用いた記述
内部信号 TEMP とC_TMP を使っている。
architecture DATAFLOW_2 of HALF_ADDER is
A
signal TEMP、C_TMP :std_logic;
TEMP
B
begin
SUM
C_OUT <= C_TMP;
C_OUT
C_TMP = A and B;
C_TMP
TEMP <= A nor B;
SUM <= C_TMP nor TEMP;
end DATAFLOW_2;
リスト2. ハーフアダー 2
(c) 順序処理文 1・・・引数のない process 文
FPGA-7
キーワード transport ・・・ after で伝搬遅延時間を表すことができる。この記述は論理合成できな
いので注意。process 文では信号が変化したときに各信号の値が評価される。この記述では wait
on の記述で信号 A、B、TEMP、C_TMP が変化したときに評価される。
architecture SEQUENTIAL_1 of HALF_ADDER is
signal TEMP, C_TMP :std_logic;
begin
process begin
C_OUT <= C_TMP;
C_TMP <= transport A and B after 2 ns;
TEMP <= transport A nor B after 4 ns;
SUM <= transport C_TMP nor TEMP after 4 ns;
wait on A, B, TEMP, C_TMP;
end process;
end SEQUENTIAL_1;
リスト3. ハーフアダー 3
(d) 順序処理文 2・・・引数のある process 文
この記述は process 文の引数(信号)を指定し、その信号の値が変化したときに process 文全体の
評価を行う形である。この引数のリストを sensitivity list という。このリストにない信号については、
その値が変化しても評価が行われないので注意。
以下の例では、入力の値の組み合わせに対する出力信号値、すなわち真理値表の内容を if 文で
記述している。
architecture SEQUENTIAL_2 of HALF_ADDER is
begin
process( A、B ) begin
if ( A=‘0’ and B=‘0’ ) then
SUM <= ‘0’;
C_OUT <= ‘0’;
elsif ( A=‘0’ and B=‘1’ ) or ( A=‘1’ and B=‘0’ ) then
SUM <= ‘1’;
C_OUT <= ‘0’;
else
SUM <= ‘0’;
C_OUT <= ‘1’;
end if;
end process;
end SEQUENTIAL_2;
リスト4. ハーフアダー 4
(e) 同時処理文による構造記述
FPGA-8
この記述では、既設計の entity を部品 component として宣言し、その port の信号の対応関係を
記述することにより、部品の接続関係を記述する。2 入力 XOR、2 入力 AND を部品 component
として(a)の構成のハーフアダーを記述する例を図 3 に示す。それぞれの部品とハーフアダーの入出
力端子の対応を port map 文で書く。
HALF_ADDER の port
architecture NETLIST of HALF_ADDER is
component XOR2
port( A、B:in bit;
A
A
C:out bit );
B
end component;
component AND2
port( A、B:in bit;
A
C:out bit );
B
XOR2
C
部品 XOR2 の port
AND2
C
B
HALF_ADDER
end component;
begin
T1 :XOR2 port map( A、B、SUM );
T2:AND2 port map( A、B、C_OUT );
end NETLIST;
リスト5. ハーフアダー 5
この記述には、以下のような部品 AND2、XOR2 の記述が必要である。
library IEEE;
use IEEE.std_logic_1164.all;
entity AND2 is
port( A, B :in std_logic;
C :out std_logic );
end AND2;
architecture RTL of AND2 is
begin
C <= A and B;
end RTL;
リスト6. 2 入力 AND
library IEEE;
use IEEE.std_logic_1164.all;
entity XOR2 is
port( A, B :in std_logic;
C :out std_logic );
end XOR2;
FPGA-9
SUM
C_OUT
図 3 構造記述
architecture RTL of XOR2 is
begin
C < = A xor B;
end RTL;
リスト7. 2 入力 XOR
2.3.3 フリップフロップ(FF)の記述
上記(1)(2)では組み合わせ回路についての記述例を示した。順序回路に記述にはフリップフロップの
記述が必要であるが、VHDL には明示的に FF を記述する方法がないので、次のように記憶要素を
記述する。
(a) 暗示的な記述による方法
次のような if 文を考える。
signal SET, RESET, Q :std_logic;
if ( SET = ‘1’ ) then Q <= ‘1’;
elsif ( RESET = ‘1’ ) then Q <= ‘0’;
end if;
この例では if 文および elsif 文について、それぞれ SET = ‘0’、RESET = ‘0’ の場合が記述されて
いない。これはそれらの場合は Q が変化しない、すなわち記憶されているということを意味する。こ
のようにして暗示的にフリップフロップを記述することができる。
(b) クロックの記述による方法
クロックを記述することにより同期式に動作する FF であることを示す。4 ビットの同期式 16 進カウン
タの例をリスト8.に示す。 この記述でのポイントは、カウントの制御をクロックの立ち上がりで行って
いることである。クロック CLK に対してその属性 event が指定されているが、これは信号の変化
を表す。従って CLK’event and CLK=1 で、CLK が変化して ’1’ になる、すなわちCLK が ’0’
から ’1’ へ立ち上がることを意味する。この記述により、その制御でカウントされる信号 COUNT
がフリップフロップであることが示される。この記述では 4 ビットの COUNT がオーバフローすれ
ば ”0000” に戻るので、16 進カウンタとなる。カウントの最大値をそれ以外の値にするには、カウン
ト値が最大値になったときにカウント値を 0 に戻すようにすればよい。例えば 12 進にするには、
COUNT が ”1011” になったときに ”0000” に戻す記述を加える。
なお VHDL では port の出力信号を内部処理に利用できない規則になっており、そのためリスト8.
では出力信号 COUNT に対して内部信号 COUNT_IN を定義し、内部処理では COUNR_IN を
用いてカウントの処理を行い、それを出力信号 COUNT に代入している。リスト 2.で内部信号
C_TMP を定義し、それをC_OUT に代入しているのも同じ理由による。
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity COUNT4 is
port ( CLK,RESET :in std_logic;
FPGA-10
COUNT :out std_logic_vector( 3 downto 0 )
);
end COUNT4;
architecture RTL of COUNT4 is
signal COUNT_IN :std_logic_vector( 3 downto 0 );
begin
COUNT <= COUNT_IN;
process ( CLK,RESET )begin
if( RESET = '1' ) then
COUNT_IN <= "0000";
elsif( CLK'event and CLK = '1' ) then
COUNT_IN <= COUNT_IN + '1';
end if;
end process;
end RTL;
リスト8. 4 ビットカウンタCOUNT4
2.3.4 テストベンチの記述
テストベンチは VHDL で記述したモジュールをシミュレーションにより検証するときに必要な記述であ
る。その役割は、テストしたいモジュールに必要なテスト信号を与え、その出力を観察できるようにする
ことである。これには(2)(e)の構造記述を利用する。それぞれ ’0’ 、’1’ の値をとる信号 TA、TB を生
成し、“00”から“11”まで 4 通りの値を上記のハーフアダーに入力してシミュレーションを行うためのテ
ストベンチの記述例を次に示す。
library IEEE;
use IEEE.std_logic_1164.all;
entity TEST_HA is
end TEST_HA;
architecture TEST_DATA of TEST_HA is
component HALF_ADDER
port ( A, B :in std_logic;
SUM, C_OUT :out std_logic );
end component;
signal TA, TB, TS ,TC :std_logic;
begin
M 1 :HALF_ADDER port map ( TA, TB, TS, TC );
process begin
TA <= ‘0’;
wait for 10 ns;
TA <= ‘1’;
FPGA-11
wait for 10 ns;
end process;
process begin
TB <= ‘0’;
wait for 20 ns;
TB <= ‘1’;
wait for 20 ns;
end process;
end TEST_DATA;
リスト9. ハーフアダーのテストベンチ TEST_HA
次に上記の 4 ビットカウンタのテストベンチの例を示す。
library IEEE;
use IEEE.std_logic_1164.all;
entity TEST_COUNT4 is
end TEST_COUNT4;
architecture TEST_DATA of TEST_COUNT4 is
component COUNT4
port ( CLK, RESET :in std_logic;
COUNT :out std_logic_vector ( 3 downto 0 ) );
end component;
signal CLK, RESET :std_logic;
signal COUNT :std_logic_vector ( 3 downto 0 );
constant CLK_CYCLE :time := 20 ns;
begin
M 1 :COUNT4 port map ( CLK, RESET, COUNT );
process begin
RESET <= ‘0’;
wait for CLK_CYCLE/3;
RESET <= ‘1’;
wait for CLK_CYCLE;
RESET <= ‘0’;
wait;
end process;
process begin
CLK <= ‘0’;
wait for CLK_CYCLE/2;
CLK <= ‘1’;
FPGA-12
wait for CLK_CYCLE/2;
end process;
end TEST_DATA;
リスト10. 4 ビットカウンタのテストベンチ TEST_COUNT4
2.3.5 ピン配置の記述
チップ設計を行う場合、ポートの信号を特定の入出力ピンに割り付けたい場合が多い。VHDL でもピ
ン指定の記述ができるが、ここではチップ設計時に与えるいろいろな制約条件の一つとしてピン制約を
記述する。これは最上位のentity で指定されるport の信号を、チップの特定のピンに割り当てるため
のものである。実験用ボードではクロック信号、ボタンスイッチなどの入力信号や、LED などへの出力
信号が FPGA の特定のピンに配線されているので、設計したチップの入出力をそれらに割り当てる必
要がある。これは ucf という拡張子を持つテキストファイルで、表 2 のようにポートの信号名と FPGA
のピン番号に P をつけたものとをそれぞれ“”で囲み、それぞれ NET、LOC=で指定する。たとえば表
2 の 2 行目では、CLK というポートを 91 番ピンに割り当てることを表す。このファイルをチップ設計シ
ステム ISE に VHDL ソース記述と主に与える。
表 2 ピン制約ファイル
#PINLOCK_BEGIN
NET "CLK"
LOC = "P91";
NET "RESET"
LOC = "P84";
NET "COUNT<0>"
LOC = "P120";
NET "COUNT<1>"
LOC = "P117";
NET "COUNT<2>"
LOC = "P114";
NET "COUNT<3>"
LOC = "P112";
#PINLOCK_END
2.4 自動設計ツール
VHDL は仕様の記述としての意味も重要であるが、機能シミュレーションによる設計の検証、および
自動論理合成による論理回路の自動設計など、大規模な論理システムの自動設計の手段としての意
味が大きい。一般の LSI 設計では次の三つの自動設計ツールを使用する。
(1) 機能シミュレータ:与えられたテスト入力に従って設計した回路の出力を計算し、設計が正しいか
どうかを検証する。
(2) 自動論理合成システム:
RTL 記述から目標とする LSI デバイスにあわせた論理回路を自動生成
する。
(3) 自動配置配線システム:論理回路情報をもとに、目標とするLSI デバイスの自動配置配線を行っ
てチップ設計を行う。
チップ設計データは、一般の LSI では LSI 製造データに変換してチップ製造を行う。この実験では PC
からPLD にダウンロードし、目的の論理回路にプログラムする。
FPGA-13
この実験では機能シミュレータとして Modelsim を、自動論理合成と自動配置配線として、それらを統
合したチップ設計システム ISE を、それぞれ利用する。
2.5 PLD(Programmable Logic Device)
一般的に、LSI は半導体製造会社に依頼して作成するが、簡単に LSI が作成できるデバイスとして、
ユーザの手元でプログラムできるPLD と呼ばれる論理デバイスが注目されている。代表的な PLD に
は PLA(Programmable Logic Array)を改良した CPLD(Complex Programmable Logic Device)
と、ゲートアレイの一種である FPGA(Field Programmable Gate Array) がある。いずれも現場
(Field)で、ROM 書き込み装置のようなデバイスプログラマによりプログラムできる。この実験では
FPGA を利用する。ここで利用する FPGA は、論理回路情報を真理値表として持たせるタイプのもの
で、デバイスの設計データはこの真理値表へのビットストリームとして PC からダウンロードされる。真
理値表はスタティック RAM として実現されているので、FPGA の電源を落とすとデバイス情報は失わ
れる。その反面、動作中にこの真理値表を書き換えることで、回路を動的に再構成できるという特徴
がある。電源投入ごとに PC からデバイスのプログラムを行う必要があるのは不便であるので、ビット
ストリームのデータを EPROM に書き込み、電源投入時にその EPROM からデバイスプログラミング
を行う方法も利用される。
2.6 実験用 FPGA ボード
実験で使用するテストボードは Digilent 社の Digilab 2XL/DIO1 で、XILINX 社の SpartanⅡシリ
ーズの FPGA XC2S30-TQ144 を搭載し、50MHz の内部クロック発振器を持つ。テスト入力用に 4
個のボタンスイッチ BTN1-4 と 8 個のスライドスイッチ SW1-8、出力用に 8 個の LED LD1-8 と 4
個の 7 セグメントLED ディスプレイが利用できる。ボタンスイッチは押すと’1’、スライドスイッチは上に
倒すと’1’が入力される。FPGA のボードと入出力部は別のボードになっており、コネクタで接続されて
いるので、コネクタ部に無理な力を加えないよう注意すること。パソコンからの論理回路情報はパラレ
ルポートから入力される。クロック信号、スイッチ、LED などは FPGA の特定のピンに接続されている
ので、設計した回路の入出力信号がこれらのピンに割り当てられるよう、2.4(5)のピン制約ファイルで
その情報を与える必要がある。表 3 に実験用ボードにおけるこれらの入出力信号と FPGA の入出力
ピンの対応を示す。
7 セグメントLED の構造は図 4 のようになっており、それぞれのセグメントa∼gと表示数字の対応を
表 4 に示す。ボードでは、セグメントa∼gに対応するセグメント信号CA∼CG は各 LED に共通で、桁
選択信号 A1∼A4 により点灯させるLED を選択するようになっている。すなわちAi を’1’、セグメント
信号 Cm を’0’にすると i 桁目の LED の m 番目のセグメントが点灯する。したがって信号 CA∼CG に
は表 4 の信号の not を与える必要がある。またそれぞれの桁に別々の数字を表示するには、図 5 に
示すように A1∼A4 に順次選択信号を与え、それに同期して表示する数字に対応するセグメント選択
信号を切り替えて与える。
FPGA-14
表 3 実験用ボードのピン配置
信号
BTN0
BTN1
BTN2
BTN3
BTN4
CA
CB
CC
CD
CE
CF
CG
DP
SW1
SW2
SW3
SW4
SW5
FPGAピン
15
84
85
86
87
58
60
63
66
74
77
79
83
57
59
62
65
67
信号
SW6
SW7
SW8
A1
A2
A3
A4
CLK
LD1
LD2
LD3
LD4
LD5
LD6
LD7
LD8
LDG
表 4 セグメント対応表
FPGAピン
75
78
80
94
96
100
103
91
93
95
99
102
112
114
117
120
122
10 進数
2 進数
abcdefg
0
0000
1111110
1
0001
0110000
2
0010
1101101
3
0011
1111001
4
0100
0110011
5
0101
1011011
6
0110
1011111
7
0111
1110000
8
1000
1111111
9
1001
1111011
a
f
g
e
b
c
d
図 4 7 セグメントLED
FPGA-15
4 桁目
3 桁目
2 桁目
1 桁目
4 桁目
3 桁目
2 桁目
1 桁目
A4
A3
A2
A1
CA∼CG
図 5 4 桁 LED の表示制御
2.7 実験上の注意事項
(1) プロジェクト名の設定
(a) 機能シミュレータModelsim
最初に Modelsim を起動したときに、ファイルメニューから新規プロジェクトを作成する。プロジェクト
のロケーションと名前は次のようにする。
プロジェクトロケーション: C:¥FPGA_DESIGN
プロジェクト名:PMnn・・・M はグループ名(A∼F)、nn は班の番号(01∼07)
例: C グループ 5 班のプロジェクト名は PC05
(b) チップ設計システム ISE
Project Navigator で新しく設計を始めるごとに新しいプロジェクトを設定する。ファイルメニューか
ら新規プロジェクトを選び、プロジェクトディレクトリとプロジェクト名は次のようにする。
プロジェクトディレクトリ: C:¥FPGA_DESIGN¥PMnn ・・・Mnn は上記と同様
プロジェクト名:設計するモジュールの名前(最上位 entity の名前)。同じ entity 名で異なる
architecture を設計するときは、entity 名に番号を付加するなどして別の名前にする。
いずれの場合もディレクトリやファイルの名前は半角英数字とし、スペースは含まないようにする。
(2) ファイルの拡張子
Modelsim および ISE に与える VHDL のソースファイルの拡張子は vhd、ISE に与えるピン制約フ
ァイル(2.3.5 参照)の拡張子は ucf であり、Windows の「メモ帳」
notepad に関連づけてある。「メモ
帳」でファイルをセーブするとき、「ファイルの種類」で「すべてのファイル」を選んで上記の拡張子を付
加する。なお VHDL のソースファイルおよびピン制約ファイルはフロッピーディスクで管理する。
(3) コンパイルの手順
FPGA-16
シミュレータ、チップ設計ともそれぞれ独立のコンパイラを持つので、構文チェックも別に行われる。とく
にチップ設計は、論理合成可能な VHDL 記述しか受け付けないので、シミュレータでエラーがなくても
チップ設計でエラーとなる場合があるので注意すること。
シミュレータでは、記述する回路本体とそのテストベンチをそれぞれコンパイルし、上位モジュールであ
るテストベンチを指定してロードすればよい。component 記述で下位の記述があるときは、当然その
モジュールもコンパイルする必要がある。
チップ設計ではテストベンチは不要で、回路本体だけコンパイルする。component 記述があるときは
それらも含める必要がある。
(4) VHDL のソース記述(コメントの内部を除く)およびファイル名・フォルダ名に全角文字が入らない
よう注意すること。
(5) 実験用ボードおよび自動設計ツールについては、それぞれの資料を参照すること。とくにボードの
スイッチ類は丁寧に扱い、ジャンパピンなどには触れないように注意する。
3. 予習事項
(1) LSI の設計の流れについて調べよ。
(2) VHDL の基本を理解し、リスト6. にならって 2 入力 OR 回路とNOT 回路を記述し、それらを部
品 component として用い、リスト5. にならって 2 入力 EXOR 回路の構造記述を作成せよ。
FPGA-17
4. 実験方法
4.1 予備実験
4.1.1 ハーフアダー
(a) 機能シミュレーション
テキストのハーフアダーの VHDL 記述のうち、当日指示する二つの記述と、リスト9.のテストベンチ
とを「メモ帳」により入力し、「自動設計ツールの使い方」に従って Modelsim により機能シミュレーシ
ョンを行え。このときの波形図をPrint Screen により取り込んでレポートに添付すること。
(b) 回路の制作‐1
(a)のハーフアダーの 1 つをISE により論理合成、配置配線を行って FPGA ボードにダウンロードし、
動作を確認せよ。このとき、ピン制約ファイルとして、次の内容をテキストファイルとして作成し、拡張
子を ucf に変更して ISE に与えること。ここでは SW7、SW8 がそれぞれ入力信号 A、B に、また
LD7、LD8 がそれぞれ出力信号 SUM、C_OUT に対応している。スイッチの 4 通りの組み合わせ
に対する LED の出力を記録する。
#PINLOCK_BEGIN
NET "A"
LOC = "P78";
NET "B"
LOC = "P80";
NET "SUM"
LOC = "P93";
NET "C_OUT"
LOC = "P95";
#PINLOCK_END
リスト11. ハーフアダーのピン制約
(c)
回路の制作‐2
予習事項で作成した EXOR 回路をリスト1.のハーフアダーの xor 関数の代わりの component とし
て用い、新しいアーキテクチャDATAFLOW_3 を作成して同様の実験を行え。
4.1.2 7 セグメントLED 表示回路
4 ビットの 2 進化 10 進(BCD)符号をスイッチ SW1∼SW4 により入力し、7 セグメントLED で表示す
る回路を設計する。リスト12.に 1 個の 7 セグメントデコーダ SSEG_DEC の記述例を示す。4 ビット
BCD 入力に対し、セグメント選択信号を 7 ビットの SSEG で返している。ここでの’1’はそのセグメント
を点灯することを表すので、実際の LED を点灯させるには、信号 SSEG の not を与える必要がある
ことに注意。
リスト13.はその制御回路 SSEG_CTL で、BCD1∼BCD4 の 4 組の 4 ビットBCD 符号と、4 個の
LED を選択する 4 ビットの信号信号 DIG_SEL を入力する。
スライドスイッチ SW5∼SW8 で 4 ビットの BCD 符号を、SW1∼SW4 で 4 個の LED を選択する 4 ビ
ットの信号信号 DIG_SEL を入力して、このデコーダおよび制御回路をテストする回路 SSEG_TEST
を作成する。なお8 個の LED のテストのため、入力した BCD 符号をLD8∼LD5 で、そのnot をLD4
∼LD1 で表示する回路も付加している。この回路およびピン制約を、それぞれリスト14.、リスト15.に
示す。
FPGA-18
library IEEE;
use IEEE.std_logic_1164.all;
entity SSEG_DEC is
port (
BCD :in std_logic_vector( 3 downto 0 );
SSEG :out std_logic_vector( 6 downto 0 )
);
end SSEG_DEC;
architecture RTL of SSEG_DEC is
begin
process( BCD ) begin
case BCD is
when "0000" => SSEG <= "1111110"; -- 0
when "0001" => SSEG <= "0110000"; -- 1
when "0010" => SSEG <= "1101101"; -- 2
when "0011" => SSEG <= "1111001"; -- 3
when "0100" => SSEG <= "0110011"; -- 4
when "0110" => SSEG <= "1011111"; -- 6
when "0111" => SSEG <= "1110000"; -- 7
when "1000" => SSEG <= "1111111"; -- 8
when "1001" => SSEG <= "1111011"; -- 9
when others => SSEG <= "0001000"; -- _
end case;
end process;
end RTL;
リスト12. 7 セグメントデコーダ SSEG_DEC
library IEEE;
use IEEE.std_logic_1164.all;
entity SSEG_CTL is
port (
DIG_SEL :in std_logic_vector( 3 downto 0 );
BCD1 :in std_logic_vector( 3 downto 0 );
BCD2 :in std_logic_vector( 3 downto 0 );
BCD3 :in std_logic_vector( 3 downto 0 );
BCD4 :in std_logic_vector( 3 downto 0 );
SSEG :out std_logic_vector( 6 downto 0 )
);
FPGA-19
end SSEG_CTL;
architecture RTL of SSEG_CTL is
signal BCD :std_logic_vector( 3 downto 0 );
signal N_SSEG :std_logic_vector( 6 downto 0 );
component SSEG_DEC
port (
BCD :in std_logic_vector( 3 downto 0 );
SSEG :out std_logic_vector( 6 downto 0 )
);
end component;
begin
D1 :SSEG_DEC port map( BCD, N_SSEG );
SSEG <= not N_SSEG;
process( DIG_SEL, BCD1, BCD2, BCD3, BCD4 ) begin
if ( DIG_SEL( 0 ) = '1' ) then BCD <= BCD1;
elsif ( DIG_SEL( 1 ) = '1' ) then BCD <= BCD2;
elsif ( DIG_SEL( 2 ) = '1' ) then BCD <= BCD3;
elsif ( DIG_SEL( 3 ) = '1' ) then BCD <= BCD4;
else BCD <= "0000";
end if;
end process;
end RTL;
リスト13. 7 セグメントデコーダ制御回路 SSEG_CTL
library IEEE;
use IEEE.std_logic_1164.all;
entity SSEG_TEST is
port (
BTN :in std_logic_vector( 3 downto 0 );
DIG_SEL :in std_logic_vector( 3 downto 0 );
BCD :in std_logic_vector( 3 downto 0 );
SSEG :out std_logic_vector( 6 downto 0 );
DIG :out std_logic_vector( 3 downto 0 );
LED :out std_logic_vector( 7 downto 0 )
);
end SSEG_TEST;
architecture RTL of SSEG_TEST is
component SSEG_CTL
FPGA-20
port (
DIG_SEL :in std_logic_vector( 3 downto 0 );
BCD1 :in std_logic_vector( 3 downto 0 );
BCD2 :in std_logic_vector( 3 downto 0 );
BCD3 :in std_logic_vector( 3 downto 0 );
BCD4 :in std_logic_vector( 3 downto 0 );
SSEG :out std_logic_vector( 6 downto 0 )
);
end component;
begin
D1 :SSEG_CTL port map( DIG_SEL, BCD, BCD, BCD, BCD, SSEG );
DIG <= DIG_SEL;
LED( 7 downto 4 ) <= BTN;
LED( 3 downto 0 ) <= not BTN;
end RTL;
リスト14. 7 セグメントデコーダテスト回路 SSEG_TEST
#PINLOCK_BEGIN
NET "DIG_SEL<0>"
LOC = "P57";
NET "DIG_SEL<1>"
LOC = "P59";
NET "DIG_SEL<2>"
LOC = "P62";
NET "DIG_SEL<3>"
LOC = "P65";
NET "BCD<0>"
LOC = "P80";
NET "BCD<1>"
LOC = "P78";
NET "BCD<2>"
LOC = "P75";
NET "BCD<3>"
LOC = "P67";
NET "SSEG<0>"
LOC = "P79";
NET "SSEG<1>"
LOC = "P77";
NET "SSEG<2>"
LOC = "P74";
NET "SSEG<3>"
LOC = "P66";
NET "SSEG<4>"
LOC = "P63";
NET "SSEG<5>"
LOC = "P60";
NET "SSEG<6>"
LOC = "P58";
NET "DIG<0>"
LOC = "P94";
NET "DIG<1>"
LOC = "P96";
NET "DIG<2>"
LOC = "P100";
NET "DIG<3>"
LOC = "P103";
NET "BTN<0>"
LOC = "P84";
NET "BTN<1>"
LOC = "P85";
FPGA-21
NET "BTN<2>"
LOC = "P86";
NET "BTN<3>"
LOC = "P87";
NET "LED<0>"
LOC = "P93";
NET "LED<1>"
LOC = "P95";
NET "LED<2>"
LOC = "P99";
NET "LED<3>"
LOC = "P102";
NET "LED<4>"
LOC = "P112";
NET "LED<5>"
LOC = "P114";
NET "LED<6>"
LOC = "P117";
NET "LED<7>"
LOC = "P120";
#PINLOCK_END
リスト15. 7 セグメントデコーダのピン制約
4.1.3 16 進カウンタ
(a) 機能シミュレーション
リスト8. の 16 進カウンタおよびリスト10. のそのテストベンチの VHDL 記述をテキストエディタに
より入力し、「自動設計ツールの使い方」に従って Modelsim により機能シミュレーションを行え。上
記と同様に波形図を取り込むこと。
(b) 回路の作成
ISE により論理合成、配置配線を行って FPGA ボードにダウンロードし、動作を確認せよ。論理合
成を行うとき、クロックの 50MHz を分周してカウンタの動きが目視できるようにするため、次の記述
を加え、COUNT4 の CLK を INT_CLK に書き換えた、COUNT4X を新しく設計すること。
signal CNT_DWN :std_logic_vector( 24 downto 0 );
signal INT_CLK :std_logic;
begin
process( CLK, RESET ) begin
if( RESET = '1' ) then
CNT_DWN <= ( others => ‘0’ );
elsif( CLK'event and CLK = '1' )then
CNT_DWN <= CNT_DWN + '1';
INT_CLK <= CNT_DWN(24);
end if;
end process;
リスト16. 4 ビットカウンタの追加記述
ISE に与えるピン制約ファイルは次のようにすること。ここではボタンスイッチ BTN1 が RESET に、カ
ウント値はビットの降順に LD5∼LD8 に割り当てられる。
FPGA-22
#PINLOCK_BEGIN
NET "CLK"
LOC = "P91";
NET "RESET"
LOC = "P84";
NET "COUNT<0>"
LOC = "P120";
NET "COUNT<1>"
LOC = "P117";
NET "COUNT<2>"
LOC = "P114";
NET "COUNT<3>"
LOC = "P112";
#PINLOCK_END
リスト17. 4 ビットカウンタのピン制約
4.2 本実験
4.2.1 7 セグメントLED 表示回路 SSEG_DEC の改良
図 3 および表 3 を参照し、リスト12.の SSEG_DEC を改良して、BCD の”1010”から”1111”までの値
を 16 進で表示できる回路 SSEG_DEC2 を設計せよ。表示文字パターンはそれぞれ工夫すること(大
文字、小文字混在可)。リスト14.の SSEG_TEST を用いて表示せよ。
4.2.2 10 進表示 4 ビットカウンタの製作
(1) これまで実験した COUNT4、SSEG_DEC、SSEG_CTL をcomponent として使用し、7 セグメン
ト LED 2 個を使って予備実験(2)の 4 ビットカウンタの計数値を 10 進数でも表示する回路
COUNT_DEC を設計せよ。7 セグメントLED の 4 桁目および 2 桁目で 10 の位を、3 桁目および 1
桁目で 1 の位を表示するようにせよ。
(a) VHDL 記述
ライブラリ宣言 use IEEE std_logic_unsigned.all を追加する。
entity 記述
入力: CLK、RESET
出力: COUNT(2 進カウント値、4 ビット)、SSEG(7 セグメント選択信号、7 ビット)、DIG(桁選択信
号、4 ビット)、LED(LD1∼LD4 への出力、4 ビット)
entity COUNT_DEC is
port ( CLK, RESET : in std_logic;
COUNT : out std_logic_vector( 3 downto 0 );
SSEG : out std_logic_vector( 6 downto 0 );
DIG : out std_logic_vector( 3 downto 0 );
LED : out std_logic_vector( 3 downto 0 ) );
end COUNT_DEC;
architecture の記述
予備実験(2)で使った 23 ビットの CNT_DWN はそのまま利用する。
CNT_DWN( 19 downto 18 )を 4 桁の LED の選択信号にする:
CNT_DWN( 19 downto 18 )=”00”なら DIG_SEL=”0001”
FPGA-23
CNT_DWN( 19 downto 18 )=”01”なら DIG_SEL=”0010”
CNT_DWN( 19 downto 18 )=”10”なら DIG_SEL=”0100”
CNT_DWN( 19 downto 18 )=”11”なら DIG_SEL=”1000”
この DIG_SEL を SSEG_CTL に与え、また SSEG_DEC の出力として DIG に代入する。
4 ビットカウントは COUNT_IN で計数し、これを10 進表示するため
COUNT_IN が ”1010” より小さければ
BCD1 <= COUNT_IN;
BCD2 <= ‘0’;
そうでなければ
BCD1 <= COUNT_IN ‐”1010”;
BCD2 <= ‘1’;
これらの値をそれぞれ BCD3、BCD4 にも代入する。また COUNT_IN の値をLED に代入する。
(b) ピン制約
ISE に与えるピン制約ファイルを次のようにする。
#PINLOCK_BEGIN
NET "CLK"
LOC = "P91";
NET "RESET"
LOC = "P84";
NET "COUNT<0>"
LOC = "P102";
NET "COUNT<1>"
LOC = "P99";
NET "COUNT<2>"
LOC = "P95";
NET "COUNT<3>"
LOC = "P93";
NET "LED<0>"
LOC = "P120";
NET "LED<1>"
LOC = "P117";
NET "LED<2>"
LOC = "P114";
NET "LED<3>"
LOC = "P112";
NET "SSEG<0>"
LOC = "P79";
NET "SSEG<1>"
LOC = "P77";
NET "SSEG<2>"
LOC = "P74";
NET "SSEG<3>"
LOC = "P66";
NET "SSEG<4>"
LOC = "P63";
NET "SSEG<5>"
LOC = "P60";
NET "SSEG<6>"
LOC = "P58";
NET "DIG<0>"
LOC = "P103";
NET "DIG<1>"
LOC = "P100";
NET "DIG<2>"
LOC = "P96";
NET "DIG<3>"
LOC = "P94";
#PINLOCK_END
リスト18. 10 進表示カウンタのピン制約
FPGA-24
(2) 当日与えられる指示により、カウンタの仕様を変更して同様に動作確認を行え。
4.2.3 除算回路の製作
(1) 除算方式
VHDL では 2 のベキ乗の割り算しかできないので、4 ビットの割り算回路DIV4 を作る。いわゆる引き
戻し法により、
Q=X÷Y 余りR
の計算を以下のような流れで実行する回路を設計する。
X、Y、Q、R は、std_logic_vector( 3 downto 0 )で宣言する。
TMP、I を variable で宣言する。初期値として TMP:=”00000000”、I:=0 とする。
TMP の下位 4 ビットに X を代入する: TMP( 3 downto 0 ):=X
TMP を 1 ビット左シフトする: TMP( 7 downto 0 ):= TMP( 6 downto 0 )&’0’
TMP の上位 4 ビットTMP( 7 downto 4 )とY を比較し、
TMP( 7 downto 4 ) < Y であれば Q( 2 downto 0 ) & ’0’
そうでなければ TMP( 7 downto 4 ):= TMP( 7 downto 4 )−Y を行い、
Q( 2 downto 0 )&’1’ とする。
TMP の左 1 ビットシフト以降をクロックの立ち上がりで 4 回繰り返すようなループを作り、最後に R<=
TMP( 7 downto 4 ) とする。
TMP( 7 downto 4 )
TMP( 3 downto 0 )
X
‐)
0
Q
0 or 1
Y
図 6 除算方式
4 ビットの数の除算の例として、 10 進数で 10÷3=3 余り1、すなわち2 進数で
1010÷0011=0011 余り0001 の計算を考える。
初期化:8 ビットの TMP をまずオール 0( “00000000” )とし、その下位4 ビットに被除数X=”1010”を
セットする。
ループ:TMP を 1 ビット左にシフトし、TMP の上位 4 ビットと除数 Y=”0011”を比較する。
Y の方が小さければ TMP の上位 4 ビットからY を引き、4 ビットの商 Q の右から’1’をシフトする。
Y の方が大きければ TMP の上位はそのままにし、Q の右から’0’をシフトする。
ループを 4 回繰り返し、終わった時点での Q が商、TMP の上位 4 ビットが余りとなる。
TMP=”00001010”
初期化
TMP=”00010100”
ループ 1 回目
Y=
“0011”
Y が大きいので
Q=
’0’
FPGA-25
TMP=”00101000”
Y=
“0011”
Y が大きいので
TMP=”01010000”
Y=
“0011”
ループ 2 回目
Q=
”00”
ループ 3 回目
Y が小さいので
Q = ”001”
引き算をして
TMP=”00100000”
TMP=”01000000”
Y=
“0011”
ループ 4 回目
Y が小さいので
Q= ”0011”
引き算をして
TMP=”00010000”
余り
“0001”
(2) 除算回路の記述
DIV4 ? entity ? ? ? ? ? ? ? ? ?
use IEEE.std_logic_unsigned.all;
? ? ? ? ? ? ? ? ? ? ?
entity DIV4 is
port ( X : in std_logic_vector( 3 downto 0 );
Y : in std_logic_vector( 3 downto 0 );
C L K : in std_logic;
Q , R : out std_logic_vector( 3 downto 0 )
);
end DIV4;
(3) 除算回路のシミュレーション
リスト19.のテストベンチを用いてシミュレーションを行う。X、Y の値は「自動設計ツールの使い方」の 5
ページにある、Force による手入力により与えよ。
library IEEE;
use IEEE. std_logic_1164.all;
use IEEE. std_logic_unsigned.all;
entity TEST_DIV4 is
end TEST_DIV4;
architecture TEST of TEST_DIV4 is
component DIV4
port ( X : in std_logic_vector( 3 downto 0 );
Y : in std_logic_vector( 3 downto 0 );
C L K : in std_logic;
FPGA-26
Q , R : out std_logic_vector( 3 downto 0 )
);
end component;
constant CLK_CYCLE : time : = 20 ns;
signal X :
std_logic_vector( 3 downto 0 );
signal Y :
std_logic_vector( 3 downto 0 );
signal CLK : std_logic;
signal Q :
std_logic_vector( 3 downto 0 );
signal R :
std_logic_vector( 3 downto 0 );
begin
U 0 : DIV4 port map ( X, Y, CLK, Q, R );
process begin
C L K < = ' 1';
wait for CLK_CYCLE/2;
CLK <= '0';
wait for CLK_CYCLE/2;
end process;
end TEST;
リスト19. 4 ビット除算回路のテストベンチ
(4) 除算回路の製作
上記の記述を用いて回路を試作する。スライドスイッチ SW1∼SW4 で被除数を、SW5∼SW8 で除数
を与え、LD1∼LD4 に商、LD5∼LD8 に余りを表示するよう、表 2 にしたがってピン制約を作成する。
スライドスイッチによりいろいろな値を与えて動作を確認せよ。
4.2.4 ステートマシンの製作: 自動販売機の制御回路
(1) ステートマシン
ステートマシンは厳密には Finite State Machine といい、オートマトンの理論にある Finite
Automaton のことである。ステートマシンはその名の通り有限個の内部状態(ステート)を持ち、その
現在の状態と入力とにより出力と次の状態が決定される。論理回路の種類としては順序回路になる
が、カウンタやレジスタのような単純な機能ではなく、複雑な機能を持ち、ステートマシンの動作につい
て、その状態ごとにそれぞれ決められた機能を行い、かつ多数の状態の間で複雑な状態の遷移が行
われる点に特徴がある。ステートマシンの設計には状態の割り当てという作業が必要であるが、これ
は VHDL による設計では状態に名前をつけて扱うことができるので、ステートマシンの詳細な知識が
なくても設計ができるようになっている。このテーマでは自動販売機の制御回路をステートマシンとして
設計し、製作する。
(2) 自販機の仕様
(a) コイン
10 円のみとし、ボタンスイッチ BTN1 を1 回押すと、1 ビット入力により1 個のコインが投入されるも
FPGA-27
のとする。投入金額の合計は 7 桁の LED ディスプレイ LD2∼LD8 により1 円単位で 2 進表示す
る。
(b) 商品
23 円の一種類とし、30 円入金されると商品1 個が販売されるものとする。販売商品はその個数を3
桁の LED ディスプレイ LD2∼LD4 で表示する。合計金額は残額 7 円とする。
(c) 釣り銭
商品が販売されると釣り銭が5 円と1 円で返却されるものとする。コインの数が最小になるようにし、
それぞれの個数を LED ディスプレイ LD2∼LD4、LD5∼LD8 により表示する。
(d) ボタンスイッチ BTN4 をリセットスイッチとし、どの状態にいてもリセットにより待機状態に戻る。
(e) 入出力
入力:クロックCLK、リセットRESET、コインボタンCOIN_BTN10(以上各 1 ビット)、表示切り替え
DISP_SEL(2 ビット)
出 力 :合 計 金 額 SUM 、商 品 数 GOODS 、釣 銭 CHANGE_5 および CHANGE_1 などを
DISP_SEL で切り替えて、LED(8 ビット)で出力
(3) 内部データ
合計金額 SUM は符号なしの 8 ビット、販売商品の数は 4 ビット、釣銭コインの個数はそれぞれ 4 ビッ
トで表す。
(a) ステート
出力に対応し、図 7 および表 5 に示すように、次の 6 つのステートをおく。
① WAIT_STATE
コイン入力ボタンスイッチの入力を受け付ける待機状態
② COIN10
コインボタンが押され、合計金額 10 円を出力する状態
③ COIN20
コインボタンが押され、合計金額 20 円を出力する状態
④ COIN30
コインボタンが押され、合計金額 30 円を出力する状態
⑤ SELL
商品を販売し、商品数 1 と残額 7 円を出力する状態
⑥ CHANGE_OUT
釣り銭を出力する状態
(b) 状態遷移図
上記の状態は次のように遷移する。内側に入力、外側に出力を10 進数で示す。
FPGA-28
SUM=10
COIN10
COIN20
COIN_BTN=1
電源投入
COIN_BTN=1
RESET=1
COIN_BTN=1
SUM=20
COIN30
WAIT_STATE
CHANGE5=1
SUM=30
CHANGE1=2
CHANGE_OUT
GOODS=1
SELL
SUM=7
図 7 状態遷移
表 5 状態遷移表
現在の状態
WAIT_STATE
COIN10
COIN20
COIN30
入力
COIN_BTN=1
COIN_BTN=1
COIN_BTN=1
なし
SELL
なし
CHANGE_OUT
なし
すべての状態
なし
出力
不変
SUM=10
SUM=20
SUM=30
GOODS=1
SUM=7
CHANGE5=1
CHANGE1=2
SUM=7
リセットされたとき
SUM=0
GOODS=0
CHANGE5=0
CHANGE1=0
(c) 記述の骨格
以下にステートマシンのアーキテクチャの骨格を示す。
ライブラリ宣言
entity FSM0 is
port ( CLK, RESET
: in std_logic;
COIN_BTN10
: in std_logic;
DISP_SEL
:in std_logic_vector ( 1 downto 0 );
LED
: out std_logic_vector ( 7 downto 0 )
);
end FSM0;
アーキテクチャ宣言
attribute clock_buffer: string;
attribute clock_buffer of COIN_BTN10: signal is "ibuf";
FPGA-29
次の状態
COIN10
COIN20
COIN30
SELL
CHANGE_OUT
WAIT_STATE
WAIT_STATE
attribute clock_buffer of RESET: signal is "ibuf";
スイッチ類の入力信
attribute clock_buffer of DISP_SEL: signal is "ibuf";
号の属性の宣言
各種の信号の宣言
状態 STATE のタイプ宣言:
type STATE is ( WAIT_STATE, COIN10, COIN20, COIN30, SELL, CHANGE_OUT );
signal CURRENT_STATE, NEXT_STATE : STATE ;
process( CLK, RESET ) begin
クロック信号の生成
if ( RESET = '1' ) then
S_CLK で状態を遷移させる
C_COUNT <= ( others => '0' ) ;
elsif ( CLK'event and CLK = '1' ) then
C_COUNT <= C_COUNT + '1' ;
--
回路を作るときはこちら
S_CLK <= C_COUNT( 25 );
S_CLK <= C_COUNT( 4 );
シミュレーションのときはこちら
end if;
end process;
process( COIN_BTN10, S_CLK ) begin
if rising_edge( COIN_BTN10 ) then
COIN_BTN <= '1';
BTN1 の信号(COIN_BTN10)か
end if;
ら内部処理用のCOIN_BTN信号
if ( S_CLK = '0' ) then
を作る
COIN_BTN <= '0';
end if;
end process;
状態遷移の記述 1:初期化と遷移の記述
RESET が’1’ならCURRENT_STATE を WAIT_STATE にする
そうでなければ S_CLK の立ち上がりで CURRENT_STATE に NEXT_STATE を代入
状態遷移の記述 2:各状態での処理と次の状態の設定
case CURRENT_STATE is
when 状態 =>
その状態での処理
NEXT_STATE <= 次の状態
表示出力
DISP_SEL に無関係に LED(7)=S_CLK
DISP_SEL=”00”のとき
LED(6)∼LED(0)で SUM の下位 7 ビットを表示
FPGA-30
DISP_SEL=”01”のとき
LED(6)∼LED(4)で GOODS(2)∼GOODS(0)を表示、LED(3)∼LED(0)は 0 とする
DISP_SEL=”10”のとき
LED(6)∼LED(4)で CHANGE5(2)∼CHANGE5(0)を、
LED(3)∼LED(0)で CHANGE1(3)∼CHANGE1(0)を、それぞれ表示
その他のとき
LED(6)で COIN_BTN10、LED(5)で COIN_BTN、LED(4)で RESET、LED(3)は 0
LED(2)∼LED(0)で CURRENT_STATE が
WAIT_STATE なら”000”
COIN10 なら”001”
COIN20 なら”010”
COIN30 なら”011”
SELL なら”100”
CHANGE_OUT なら”101”
その他なら”111”
を、それぞれ表示
(3) 自販機制御回路の製作
(a) architecture の記述とシミュレーション
上記(g)を参考にして VHDL 記述を作成し、シミュレーションを行って動作を確認せよ。シミュレーシ
ョンのときと、回路を作るときとで S_CLK の記述が違うことに注意。リスト20.のテストベンチを入力
して利用せよ。
シミュレーションでのボタン入力は、シミュレータの使い方の説明における Force を使うこと。
library IEEE;
use IEEE. std_logic_1164.all;
use IEEE. std_logic_unsigned.all;
entity TEST_FSM0 is
end TEST_FSM0;
architecture TEST of TEST_FSM0 is
component FSM0
port ( CLK,RESET
: in std_logic;
COIN_BTN10
: in std_logic;
DISP_SEL
: in std_logic_vector ( 1 downto 0 );
LED
: out std_logic_vector ( 7 downto 0 )
);
end component;
FPGA-31
constant CLK_CYCLE : time := 10 ns;
signal CLK, RESET, COIN_BTN10
: std_logic;
signal DISP_SEL
: std_logic_vector ( 1 downto 0 );
signal LED
: std_logic_vector ( 7 downto 0 );
begin
U0 : FSM0 port map ( CLK, RESET, COIN_BTN10, DISP_SEL, LED );
process begin
RESET <= '0' ;
wait for CLK_CYCLE/3;
RESET <= '1' ;
wait for CLK_CYCLE;
RESET <= '0' ;
wait;
end process;
process begin
CLK <= '0' ;
wait for CLK_CYCLE/2;
CLK <= '1' ;
wait for CLK_CYCLE/2;
end process;
process begin
C O I N _ B T N 10 <= '0';
wait for CLK_CYCLE * 20;
COIN_BTN10 <= '1';
wait for CLK_CYCLE * 10;
COIN_BTN10 <= '0';
wait for CLK_CYCLE * 20;
COIN_BTN10 <= '1';
wait for CLK_CYCLE * 10;
COIN_BTN10 <= '0';
wait for CLK_CYCLE * 25;
COIN_BTN10 <= '1';
wait for CLK_CYCLE * 10;
COIN_BTN10 <= '0';
wait;
FPGA-32
end process;
end TEST;
リスト20. 自販機 FSM0 のテストベンチ
(b) 回路の制作
シミュレーションで確認した VHDL 記述を論理合成・配置配線を経てFPGA にダウンロードし、動作
実験を行え。
(c) バリエーション
(i) 釣銭計算を除算回路で行う
テキストにある4 ビット除算回路をもとに、8 ビットの除算回路 DIV8 の VHDL 記述を作成し、シミ
ュレーションを行って動作を確認した後、自販機の回路にcomponent として組み込んで、釣銭の計
算を行うようにする。
(ii) 出力の表示を 7 セグメントLED を用いて行うように改造する。
(iii) その他各グループで工夫してバリエーションを創作する。
4.2.5 電卓の製作
(1) 電卓の仕様
スライドスイッチ SW1∼SW4 とSW5∼SW8 で各 4 ビットの符号なしの整数を入力し、プッシュボタン
スイッチ BTN1、BTN2、BTN3、BTN4 を押すとそれぞれ加算、減算、乗算、除算を行い、結果を次
のように 8 ビットの LED ディスプレイ LD1∼LD8 で表示する:
加算: 桁上げも含めて LD4∼LD8 の 5 ビットで表示する。LD1∼LD3 は”000”とする。
減算: LD5∼LD8 の 4 ビットで表示する。LD1∼LD4 は”0000”とする。
乗算: LD1∼LD8 の 8 ビットで表示する。
除算: LD1∼LD4 で商を、LD5∼LD8 で余りを表示する。
どのボタンも押されていないときは、
LD1∼LD4 で被演算数 X を、LD5∼LD8 で演算数 Y を表示す
る。
(2) 基本演算
加減算は VHDL の加減算を用いてよい。除算は 4.2.3 で製作したものを用い、乗算は以下を参考に
して作成する。4 ビットの乗算の結果が 8 ビットになることに注意。
(a) 乗算回路の設計
シフトと加算によりP=X ×Y の計算を次のような流れで実行する回路 MULT4 を設計する。X、Y は、
4 ビットの std_logic_vector、P は 8 ビットの std_logic_vector で宣言する。
TMP、P_IN を 8 ビットの std_logic_vector で宣言する。I を 0 から4 までの整数変数(初期値 0)
で宣言する: variable I:integer range 0 to 4:=0
I=0 のとき
TMP の下位 4 ビットに X をはめ込む(上位 4 ビットは"0000" )
TMP:="0000"&X
I が 4 未満であれば
FPGA-33
クロックの立ち上がりで
Y(I)=1 ならTMP を P_IN に加える。
TMP を 1 ビット左シフトする。
TMP:=TMP( 6 downto 0) & '0'
I=I+1 とする。
そうでなければ P=IN を P に代入して I='0' とする。
X="1010"、Y="0101"の例では
I=0
P_IN=”00000000”
初期化
TMP="00001010"
Y(0)='1'なので
ループ 1 回目
P_IN="00001010"
ループ 2 回目
Y(1)='0'なので
0000
1010
0000
P_IN="00001010"
0110010
TMP="00101000"
I=2
×)0101
1010
TMP="00010100"
I=1
1010
ループ 3 回目
Y(2)='1'なので
P_IN="00110010"
TMP="01010000"
I=3
ループ 4 回目
Y(3)='0'なので
P_IN="00110010"
答
TMP="10100000"
(b) 乗算回路の記述
MULT4 ? entity ? ? ? ? ? ? ? ? ?
use IEEE.std_logic_unsigned.all;
? ? ? ? ? ? ? ? ? ? ?
entity MULT4 is
port ( X : in std_logic_vector( 3 downto 0 );
Y : in std_logic_vector( 3 downto 0 );
C L K : in std_logic;
P : out std_logic_vector( 3 downto 0 )
);
end MULT4;
(c) 乗算回路のシミュレーション
リスト21.のテストベンチを用いてシミュレーションを行う。X、Y の値は「自動設計ツールの使い方」
の 5 ページにある、Force による手入力により与えよ。
FPGA-34
library IEEE;
use IEEE. std_logic_1164.all;
use IEEE. std_logic_unsigned.all;
entity TEST_MULT4 is
end TEST_MULT4;
architecture TEST of TEST_MULT4 is
component MULT4
port ( X : in std_logic_vector( 3 downto 0 );
Y : in std_logic_vector( 3 downto 0 );
C L K : in std_logic;
P : out std_logic_vector( 3 downto 0 )
);
end component;
constant CLK_CYCLE : time : = 20 ns;
signal X :
std_logic_vector( 3 downto 0 );
signal Y :
std_logic_vector( 3 downto 0 );
signal CLK : std_logic;
signal P :
std_logic_vector( 3 downto 0 );
begin
U0 :
MULT4 port map ( X, Y, CLK, P );
process begin
CLK <= '1';
wait for CLK_CYCLE/2;
CLK <= '0';
wait for CLK_CYCLE/2;
end process;
end TEST;
リスト21. 4 ビット乗算回路のテストベンチ
(d) 乗算回路の製作
上記の記述を用いて回路を試作する。スライドスイッチ SW1∼SW4 で被乗数を、SW5∼SW8 で乗
数を与え、LD1∼LD4 に積を表示するよう、表 2 にしたがってピン制約を作成する。スライドスイッチ
によりいろいろな値を与えて動作を確認せよ。
(3) 記述の骨格
ライブラリ宣言
entity CALC4_0 is
port ( CLK, RESET
: in std_logic;
FPGA-35
OP_BTN
: in std_logic_vector ( 3 downto 0 );
X, Y
: in std_logic_vector ( 3 downto 0 );
LED
: out std_logic_vector ( 7 downto 0 )
);
end CALC4_0;
アーキテクチャ宣言
attribute clock_buffer: string;
attribute clock_buffer of OP_BTN: signal is "ibuf";
スイッチ類の入力信
attribute clock_buffer of RESET: signal is "ibuf";
号の属性の宣言
内部信号の宣言
コンポーネント宣言
begin
port map 文による component の組み込み
process 文による演算の記述
OP_BTN="0000"ならLED で X とY を表示する
OP_BTN="1000"なら X+Y を行い、結果をLED( 4 downto 0 )に代入する。残りは 0
OP_BTN="0100"なら X‐Y を行い、結果をLED( 3 downto 0 )に代入する。残りは 0
OP_BTN="0010"なら X*Y を行い、結果をLED( 7 downto 0 )に代入する。
OP_BTN="0001"なら X/Y を行い、LED( 7 downto 4 )に商を、LED( 3 downto 0 )に余りを
代入する。
(4) 電卓の制作
(a) architecture の記述とシミュレーション
上記(3)を参考にして記述する。乗除算回路は component として利用する。リスト22.のテストベン
チによりシミュレーションを行って動作を確認する。入力の数値および演算の種類は、シミュレータ
の使い方の説明における Force を使うこと。
library IEEE;
use IEEE. std_logic_1164.all;
use IEEE. std_logic_unsigned.all;
entity TEST_CALC4_0 is
end TEST_CALC4_0;
architecture TEST of TEST_CALC4_0 is
component CALC4_0
port ( CLK,RESET : in std_logic;
OP_BTN
: in std_logic_vector ( 3 downto 0 );
X, Y
: in std_logic_vector ( 3 downto 0 );
FPGA-36
LED
: out std_logic_vector ( 7 downto 0 )
);
end component;
constant CLK_CYCLE : time := 10 ns;
signal CLK, RESET
: std_logic;
signal OP_BTN
: std_logic_vector ( 3 downto 0 );
signal X, Y
: std_logic_vector ( 3 downto 0 );
signal LED
: std_logic_vector ( 7 downto 0 );
begin
U0 : CALC4_0 port map ( CLK, RESET, OP_BTN, X, Y );
process begin
RESET <= '0' ;
wait for CLK_CYCLE/3;
RESET <= '1' ;
wait for CLK_CYCLE;
RESET <= '0' ;
wait;
end process;
process begin
CLK <= '0' ;
wait for CLK_CYCLE/2;
CLK <= '1' ;
wait for CLK_CYCLE/2;
end process;
end TEST;
リスト22. 電卓 CALC4_0 のテストベンチ
(b) 回路の制作
プッシュボタンスイッチ BTN1∼BTN4 を OP_BTN(0)∼OP_BTN(3)、スライドスイッチ SW1 を
RESET に、LD1∼LD8 を LED(7)∼LED(0)に、それぞれ対応させる。ピン制約を記述し、論理合
成・配置配線を行って FPGA にダウンロードし、動作実験を行え。
(c) バリエーション
(i) 4 ビットの加減算をハーフアダーの組合せで設計して使用する。
(ii) 入力および出力の値を 7 セグメントディスプレイなどを利用して表示する。
(iii) 演算の結果の値にさらに続けて演算できるように工夫する。
(iv) その他各グループで工夫してバリエーションを創作する。
FPGA-37
5. 検討事項
(1) 4.1.1(1)(a)の二つのシミュレーション結果について検討せよ。
6. 調査事項
(1) 二つのステートマシンのタイプについて調査せよ。
(2) 論理回路の動作遅延について調査せよ。
(3) 乗除算方式について調査せよ。
7. 参考文献
(1) 坂巻佳寿美:見てわかる VHDL;工業調査会 2002
(2) 仲野 巧:VHDL によるマイクロプロセッサ設計入門;
CQ 出版社 2002
(3) ザイリンクス社ホームページ http://www.xilinx.co.jp/
(4) Digilent 社ホームページ
http://www.digilentinc.com/
FPGA-38
付録 1.
自動設計ツールの使い方
1. 機能シミュレータModelSim
ModelSim とは、VHDL 言語で記述されたハードウェアのシミュレーションを行うプログラムである。
(1) Modelsim の起動
デスクトップ上の
アイコンをダブルクリック、または
スタートメニューから「プログラム」→「Modelsim XE Ⅱ」(Xilinx 版)→Modelsim
(2) シミュレーションの手順
(a) コンパイルとエラーチェック
ModelSim を起動させると図 1 の Main ウィンドウが表示される。その中の図 2 の「Compile」メニュ
ーから「Compile」を選ぶと、図 3 のコンパイルするファイルを選ぶウィンドウが表示されるので、ファイ
ル(作成したプログラムとテストベンチ)を指定して「
Compile」をクリックする。
図 1 Main ウィンドウ
図 2 Compile メニュー
FPGA-39
図 3 ファイル選択
エラーが出たら図 4 の Source ウィンドウまたは、テキストエディタでデバックし、もう一度コンパイルし
直す。Main ウィンドウの中の赤いエラーメッセージをダブルクリックすると、Source ウィンドウの中のエ
ラー行がハイライトされる。複数のライブラリを使うときは、P6 の(6)を参照のこと。
図 4 Source ウィンドウ
(b) デザインのロード
図 5 のように、Main ウィンドウの「
Simulate」メニューから「Simulate」を選ぶと、図 6 のロードするモ
ジュールを選ぶウィンドウが表示されるので、リストのトップにある「work」を開いてコンパイルしたテス
トベンチのモジュールを選び、「Load」をクリックする。
FPGA-40
図 5 Simulate メニュー
図 6 モジュールの選択
(3) 表示ウィンドウ
図 7 のように、Main ウィンドウの「
View」メニューから[All Windows]を選び、すべてのウィンドウを表
示する。図 8 のように、Main ウィンドウの Name の中からシミュレーションを行うentity を選ぶと、そ
の信号名が図 9 のように signals ウィンドウに表示されるので、それをwave ウィンドウにドラグ&ドロ
ップする。[Signal]と[wave]だけ選択して表示してもよい。
(4) シミュレーションの実行
Main ウィンドウの「
Simulate」メニューから「Simulation Options」を選び、「Default Run 」を
100ns にする。次いで「
Simulate」メニューから「Run」→「Run 100ns」を選んで実行させる。テストベ
FPGA-41
ンチにすべてのシミュレーション条件が記述されている場合には、上記のように 100ns ずつ実行して
wave ウィンドウの波形を観察する。「Run All」を選んで必要なだけ実行し、「Break」で止めてもよ
い。
図 7 全ウィンドウ表示
図 8 entity 選択
FPGA-42
図 9 signals とwave ウィンドウ
(5) port への入力信号の指定
手動で入力を与えることもできる。図 9 の signals ウィンドウで信号を選択し、図 10 のように「
Edit」メ
ニューから「Force」を選ぶと、図 11 のように「
Force Selected Signal」ウィンドウが表示されるので、そ
の「Value」に 0、1 の値をセットする。
図 10 Edit メニュー
図 11
FPGA-43
Force Selected Signal ウィンドウ
(6) その他の注意事項
複数のライブラリを使うとき、定義が曖昧になるというエラーメッセージがでることがある。このときは図
3 の「Default Options」で図 12 のように「
Compiler Options」ウィンドウを開き、「Use explicit
declarations only」にチェックを入れる。
図 12 Compiler Options の選択
2. チップ設計システム ISE
ISE は論理合成と配置配線を統合した設計ツールである。VHDL で記述されたハードウェアをFPGA
の設計データに変換し、チップの書き込みまでを行うことができる。機能シミュレータとは別のコンパイ
ラを持ち、論理合成可能な記述しか受け付けないので注意が必要である。
ISE によるチップ設計は論理合成 Synthesize、配置配線 Implement Design、FPGA データ作成
Generate Programming File の三つの段階で行われる。機能シミュレーションでエラーが取れてい
れば、直接第 3 段階の Generate Programming File を指定することで、チップ設計全体の処理を
行うことができる。
(1) SpartanⅡおよび CPLD を使うチップ設計の手順
(a) ISE の起動
デスクトップ上の
アイコンをダブルクリック、または
スタートメニューから「プログラム」→「I S E 5 日本語版」→「Project Navigator」(日本語版、Full
Version) をクリックする。
(b) プロジェクトの設定
ISE を起動すると図 13 のウィンドウが表示される。「ファイル」メニューから「新規プロジェクト」または
「プロジェクトを開く」を指定する。
FPGA-44
図 13 ISE の起動画面
「新規プロジェクト」: 「新規プロジェクト」を選ぶと図 14 のプロジェクト設定画面が表示されるので、次
のように設定する。
図 14 プロジェクトの設定
FPGA-45
「プロジェクト名」:作成する回路ごとに名前を付ける
「プロジェクト ディレクトリ」: C:¥FPGADESIGN¥P###・・・###は班名 とする
「値」: 各欄をクリックするとプルダウンメニューが表示されるので、図 14 のように設定
する。
「プロジェクトを開く」: 「プロジェクトを開く」を選ぶとファイルの場所を指定するウィンドウが開くので、
設定してある「ファイルの場所」の「ファイル名」を指定し、その中の NNN.npl (NNN は設定したプロ
ジェクト名 )ファイルを指定して開く。
(c) ソースファイルの入力
プロジェクトを設定したら、必要なソースファイルを指定する。図 15 のように、「プロジェクト」メニューか
ら 「ソースの追加」を選ぶと、ファイルの場所を指定するウィンドウが開くので、作成するチップに必要
なすべての VHDL ソースファイルと、後述のピン制約ファイルを指定して入力する。必要なモジュール
が不足している場合は、図 16 のようにそのモジュール名が?マークつきで表示されるので、追加す
る。
図 15 ソースプログラムの入力
FPGA-46
図 16 ソースプログラムと適用可能なプロセス
図 16 プロセスの実行
(d) プロセスの実行
ソースプログラムを入力すると、図 16 のように 「選択したソースのプロセス」ウィンドウに入力したソー
スプログラムに適用できるプロセスが表示されるので、まずは Generate Programming File を指定
して、「プロセス」メニューから「実行」を選んで実行させる。正常に終了したプロセスには緑のチェック
が、エラーの発生したプロセスには赤のクロスがつくので、下のログウィンドウで原因を調べる。
(e) チップの書き込み
(c)までエラーなく終了した場合は、チップの書き込みを行う。このとき
ボードの電源が入っていること
ボードがパラレルケーブルで PC のパラレルポートに接続されていること
が必要である。
書き込みには 「選択したソースのプロセス」ウィンドウの中の Generate Programming File を開き、
図 17 の Configure Device を選んで 「プロセス」メニューの 「実行」を選択して行う。(c)の段階で直
接この Configure Device を実行してもよい。これを実行すると、図 18 のような iMPACT ウィンドウが
表示され、書き込みについていくつかの選択肢を問われるが、順にデフォールトの Configure
Device、Boundary-Scan Mode 、Automatically Connect・・・・を選べばよい。警告が出ることがあ
FPGA-47
るが、無視してよい。最後に図 19 の書き込みファイルの選択ウィンドウが表示されるので、プロジェクト
名のフォルダの中の nnnn.bit(nnnn は最上位モジュールの entity 名)というファイルを選ぶ。
書き込み準備が終了すると、図 18 のようにチップの画像が表示されるので、それを右クリックして
Program を選ぶと書き込みが開始される。書き込みが成功するとチップは動作状態になる。
図 17 チップの書き込み準備
図 18 チップの書き込み
iMPACT ウィンドウは一つしか開けないので、別のファイルのデータを書き込むときには、前の書き込
みを行った iMPACT ウィンドウを閉じる必要がある。
FPGA-48
図 19 書き込みファイルの選択
(2) 設計結果の確認
以下のようにして、完成したチップの論理回路図やチップの配置配線図を表示することができる。
(a) 論理回路図の表示
「選択したソースのプロセス」ウィンドウの中の Synthesize を開き、 「View RTL Schematic」を選
んで「プロセス」メニューから「実行」すると、RTL の図面が表示される。表示されているブロックをクリッ
クすることで、全体から詳細な構成まで、いろいろなレベルで論理図が表示できる。
(b) チップの配置配線図の表示
「選択したソースのプロセス」ウィンドウの中の ImplementDesign を開き、 「Place & Route」の中
の「View/Edit Placed Design(FloorPlanner) 」を選んで「プロセス」メニューから「実行」すると、チッ
プの配置図面が表示される。同様に「
View/Edit Routed Design(FPGAEditor) 」を実行すると、配
線の図面が表示できる。
FPGA-49
付録 2.
実験用ボード
D2XL/DIO1 ボード
このボードは Xilinx 社の SpartanⅡシリーズの FPGA XC2S30 を搭載した 2XL ボードと、スイッチ
や LED などの入出力を持つ DIO1 ボードを組み合わせた構造になっている。主な仕様は次の通りで
ある。
FPGA:
XC2S30-TQ144(30k ゲート、144 ピン)
クロック:
50MHz
入出力:
プッシュボタン
BTN1∼BTN4
スライドスイッチ
SW1∼SW8
LED
LD1∼LD8
7 セグメントLED
A1∼A4(桁選択)、CA∼CG(セグメント選択)
ボードの入出力部の概観を図 1 に示す。
7 セグメントLED
左からA1∼A4
LED
左からLD1∼LD8
スライドスイッチ
左からSW1∼SW8
プッシュボタンスイッチ
左からBTN1∼BTN4
図 1 入出力ボード
プッシュボタンスイッチは押すと信号’1’が、離すと信号’0’が、それぞれ入力される。スライドスイッチは
上げると信号’0’が、下げると信号’1’が、それぞれ入力されるので、’1’を入力したいときは SWi の信号
の not をとる必要がある。入出力ボードのスイッチ類の扱いは丁寧に行い、FPGA を搭載した 2XL ボ
ードのスイッチ類には手をふれないこと。とくにスライドスイッチは PROG 側にしておくこと。
LED は LDi に信号’1’を与えると i 番目の LED が点灯する。7 セグメントLED の構造は図 2 のよう
になっており、それぞれのセグメントa∼gと表示数字の対応を表 1 に示す。ボードでは、セグメントa∼
gに対応するセグメント信号 CA∼CG は各 LED に共通で、桁選択信号 A1∼A4 により点灯させる
LED を選択するようになっている。すなわちAi を’1’、セグメント信号 Cm を’0’にすると i 桁目の LED
FPGA-50
の m 番目のセグメントが点灯する。したがって信号CA∼CG には表 1 の信号の not を与える必要が
ある。またそれぞれの桁に別々の数字を表示するには、図 3 に示すように A1∼A4 に順次選択信号を
与え、それに同期して表示する数字に対応するセグメント選択信号を切り替えて与える。
表 1 セグメント対応表
a
10 進数
f
g
e
b
c
d
図 2 7 セグメントLED
4 桁目
3 桁目
2 桁目
2 進数
abcdefg
0
0000
1111110
1
0001
0110000
2
0010
1101101
3
0011
1111001
4
0100
0110011
5
0101
1011011
6
0110
1011111
7
0111
1110000
8
1000
1111111
9
1001
1111011
1 桁目
A4
A3
A2
A1
CA∼CG
4 桁目
3 桁目
2 桁目
図 3 4 桁 LED の表示制御
FPGA のピンとこれらの入出力信号との対応を表 2 に示す。
FPGA-51
1 桁目
表 2 2XL/DIO1 ボードのピン配置
信号
BTN0
BTN1
BTN2
BTN3
BTN4
CA
CB
CC
CD
CE
CF
CG
DP
SW1
SW2
SW3
SW4
SW5
FPGAピン
15
84
85
86
87
58
60
63
66
74
77
79
83
57
59
62
65
67
FPGA-52
信号
SW6
SW7
SW8
A1
A2
A3
A4
CLK
LD1
LD2
LD3
LD4
LD5
LD6
LD7
LD8
LDG
FPGAピン
75
78
80
94
96
100
103
91
93
95
99
102
112
114
117
120
122
Fly UP