沼津高専 電子制御工学科

MIRSMG3D アドレスデコーダ仕様書

MIRSMG3D-FPGA-0002

改訂記録

版数

作成日

作成者

承認

改訂内容

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を加えることができる。改良する時はこのようにプログラムを変更すること。

 

関連文書