沼津高専 電子制御工学科 |
||||||
|
||||||
改訂記録 |
||||||
版数 |
作成日 |
作成者 |
承認 |
改訂内容 |
||
A01 |
2009.3.19 |
伊藤 |
大庭 |
初版 |
目次
1.はじめに
2.アドレスデコーダとは
3.内部構造の説明
4.改良する場合について
1.はじめに
本ドキュメントは、FPGA回路におけるアドレスデコーダ(ADD_DEC)について解説したものである。アドレスデコーダを理解する時や改良する時の参考にして欲しい。
2.アドレスデコーダとは
アドレスデコーダは、CPUが動作させたいFPGA内のモジュールを選択する際に使用する回路であり、VHDL(VHSIC
Hardware Description Language)により記述されている。MG3標準機では信号処理モジュールしか選択しないが、赤外線コード判別モジュールなどのその他のモジュールを動作させる時にはアドレスデコーダが必要となる。
図1.
CPUとIOセンサーの信号経路
3.内部構造の説明
アドレスデコーダはVHDLにより記述されており以下のようなプログラムになっている。
LIBRARY ieee; ----------------------【ライブラリ宣言】
USE
ieee.std_logic_1164.all;
ENTITY ADD_DEC IS ----------------------【エンティティ宣言】
①PORT
(
SA :
IN STD_LOGIC_VECTOR(19
DOWNTO 1);
B_AEN :
IN STD_LOGIC;
TIP_ADD0,TIP_ADD1 : OUT STD_LOGIC;
);
END ADD_DEC;
ARCHITECTURE DATAFLOW
OF ADD_DEC IS-------------【アーキテクチャ宣言】
②signal
add : std_logic_vector(19 downto
0);
BEGIN
add <= SA &
B_AEN;
PROCESS (SA,B_AEN)
BEGIN
③CASE
add IS
WHEN "00000000000100000000"
"0000000000010000000"=>TIP_ADD0<='0';
TIP_ADD1 <= '0';
WHEN
"00000000001100010000" =>TIP_ADD0 <= '1';
TIP_ADD1 <= '0';
WHEN
"00000000000101000010"=>TIP_ADD0<= '0';
TIP_ADD1<= '1';
WHEN OTHERS =>TIP_ADD0<= '0';
TIP_ADD1<= '0';
END CASE;
END PROCESS;
END DATAFLOW;
①ポート定義
エンティティ宣言後のこの部分で入力/出力ピンを設定する。MG3標準機ではアドレスバス(SA)の1~19とB_AENの20bitを入力とし、TIP_ADD0とTIP_ADD1を出力としている。
一つのピンを定義するためにはSTD_LOGICと記述すれば良いが、バスのように、同じ名前で番号だけ違う(B_SA[1]~B_SA[19])複数のピンを定義する場合には、STD_LOGIC_VECTOR(19
DOWNTO 1)のように定義すると一行で定義が済むので便利である。
②アーキテクチャ宣言
入力されるbit数を定義する。
signal add : std_logic_vector(19 downto 0);
の部分で0~19bitの20bit分の入力部を定義した。さらに
add <= SA & B_AEN;
の記述により、定義した部分の19~1bit目はSAの信号が(エンティティ宣言の部分でSAは19bitと定義したから)、0bit目にはB_AENの信号が入力される。
③ケース文
この部分でCPUからの信号に対するアドレスデコーダ内の動作を設定する。
WHEN"000000・・・"
の部分はCPUからの16進数の信号を2進数で示しており、それに対する動作が
=>TIP_ADD0 <= '○';
TIP_ADD1 <= '○';
で示されている。従ってCPUからのアドレスとアドレスデコーダ内で設定されたアドレスが一致した時に、対応した動作を行う。MG3標準機での対応する動作は、TIP_ADD0とTIP_ADD1の信号をHIGH(“1”)かLOW(“0”)にすることであり、これにより信号処理モジュールの動作を選択する。
例)CPUからの信号が[31016]の場合
[31016]は[000000000011000100002]であるのでTIP_ADD0が”1”になり、TIP_ADD1が”0”になる。
例)CPUからの信号がアドレスデコーダで指定していないアドレスの場合
WHEN
OTHERSで指定しているようにTIP_ADD0もTIP_ADD1も”0”になる。
4.改良する場合について
アドレスデコーダに新たな動作を追加する場合、OUTのピンとケース文のみ変更すればよい。(アドレスバスのbit数は、同一のFPGAボードを使用している限り変更はない為、INのピンを変更する必要はない)
例)赤外線コード判別機能(IRS_CODE)を加えたい場合
まずはOUTのピンを付け加える
PORT
(
SA :
IN STD_LOGIC_VECTOR(19
DOWNTO 1);
B_AEN :
IN STD_LOGIC;
TIP_ADD0,TIP_ADD1 : OUT STD_LOGIC;
IRS_CODE :
OUT STD_LOGIC;
);
これにより、IRS_CODEのOUTピンが追加される。
次にケース文を書き換える。(例としてIRS_CODEのアドレスを32016にする)
CASE add IS
WHEN "00000000000100000000"
"00000000000100000010"=>TIP_ADD0<='0';
TIP_ADD1<= '0';
IRS_CODE<= '0';
WHEN
"00000000001100010000" =>TIP_ADD0<= '1';
TIP_ADD1<= '0';
IRS_CODE<= '0';
WHEN
"00000000000101000010"=>TIP_ADD0<= '0';
TIP_ADD1<= '1';
IRS_CODE<= '0';
WHEN "00000000001100100000"=>TIP_ADD0<=
'0';
TIP_ADD1<= '0';
IRS_CODE<= '1';
WHEN OTHERS =>TIP_ADD0<= '0';
TIP_ADD1<= '0';
IRS_CODE<= '0';
これにより新しくIRS_CODEを加えることができる。改良する時はこのようにプログラムを変更すること。