2019.6.17
前へ
次へ
ホームページトップへ戻る

[新連載]CPLD入門!
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使うことになるだろうと思ってはいたのですが。
何を今頃になって、というようなものですが。
ようやく本気で、CPLDと四つに取り組みます。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜



[第70回]


●VHDLサンプルプログラム1 82C55(3)

前回に続いて82C55VHDLプログラムの説明です。

●architecture

architectureからが実質的な回路の記述部分になります。
archtecture rtl of ファイル名 is
で始まってプログラムの最終行の
end rtl;
で終ります。
ファイル名は、このVHDLプログラムファイルそのもののファイル名です。
それではその前にあるrtlとは何か?ということについて。

ネットで調べるとRegister Transfar Levelの略なのだそうですが、それじゃあさっぱりわけがわかりません。
どうやらVHDLプログラムの回路記述本体を示す略語のようなのですが。
じつはrtlの代わりに何を記述してもよいらしく、ここと最終行にnanjamonjaと記述してもコンパイルエラーにはなりません。
ですからここは何でもよいのですけれど、プログラムの識別はすでにファイル名で行なっているので、rtlの代わりに何でもよいから自由に書け、と言われてもかえって困ってしまいます。
ここは慣習でrtlと書くことが多いのだそうですから、おとなしくrtlと書いておくことにします。

architecture rtl of trngio1d is

        signal ainout:std_logic;
        signal binout:std_logic;
        signal clinout:std_logic;
        signal chinout:std_logic;
        signal paout:std_logic_vector(7 downto 0);
        signal pbout:std_logic_vector(7 downto 0);
        signal pclout:std_logic_vector(3 downto 0);
        signal pchout:std_logic_vector(3 downto 0);
--
begin

architecture rtl of ファイル名 is
の次のところには、さらにその次から始まる回路記述本体で使う作業用(一時的ワーク)の信号名を記述します。
最初にsignalと書いて、その後ろに信号名を書きます。
その後ろに:(コロン)を置いて、最後にstd_logic;を書きます。
複数ビットのカウンタなどのようにまとまった信号をひとつの信号名で記述する場合にはstd_logic(7 downto 0);のように記述します。
ここで定義する信号は回路の中で中間的に使用する信号なので、前回の信号端子名のようにin、outの区別はありません。
信号名の記述が終ったら
begin
と書いて、その次から回路の記述を開始します。

●ポートの初期設定

ここからは回路の記述です。
まずはAポート、Bポート、Cポートの入力、出力の向きの決定です。

--82c55 address F0,F1,F2,F3
-- in out set
process(IOW)
begin
        if IOW='0' then
                if ADRSIN="11110011" and DINOUT(7 downto 5)="100" and DINOUT(2)='0' then
                        clinout<=DINOUT(0);-- '0' out,'1' in
                        binout<=DINOUT(1);
                        chinout<=DINOUT(3);
                        ainout<=DINOUT(4);
                end if;
        end if;
end process;

82C55回路はND80Z3.5やND8080などの増設用I/Oバスコネクタに接続することを想定しています。
82C55はI/Oアドレスの下位2ビットの値によってAポート、Bポート、Cポートかコントロールワードアドレスが選択されます。
この82C55VHDLプログラムでは82C55回路にアクセスするI/OアドレスとしてF0〜F3を割り当てています。
アドレスF3のときコントロールワードアドレスとなります。
CPUボードからのOUT命令はアドレスバス下位8ビットにI/Oアドレスが出力され、データバスに必要なデータが出力され、それを確定するための信号としてIOW信号がアクティブ(=’0’)になります。

process文の()の中に記述した信号に変化があったときだけ、begin から end process;までの間に記述した文が実行されます。
()内に記述する信号のことをセンシビリティリストというのだそうです。
上のprocess文では()の中にIOWを記述しています。
まずは大枠としてIOW信号がアクティブになったとき以外にはポートの初期設定が行なわれないというように考えます。

ポートの初期設定はIOWが’0’でI/OアドレスがF3のときに行なわれますから
if IOW=’0’で、さらにif ADRSIN=”11110011” ですが、それだけではまだ足りません。
データのうちビット7〜5が”100”でビット2が’0’であることも必要な条件です(前回参照)。
ですからif ADRSIN=”11110011” and DINOUT(7 downto 5)=”100” and DINOUT(2)=’0’ thenと書くことになります。
ここでADRSINはアドレスバス下位8ビットに接続される入力端子でDINOUTはデータバスに接続される入出力端子です。
clinout、binout、chinout、ainoutはコントロールワードの各ポートの入出力を規定するビットの値を維持するワーク信号です。

1ビットの値を示す定数はその数を’ ’ではさんで示します。
2ビット以上の値を示すときは” ”ではさんで示します。
DINOUT(7 downto 5)はDINOUTの第7ビットから第5ビットを示しています。
またDINOUT(2)はDINOUTのビット2を示します。

ifとend if;の間に、そのIF文の条件が成立したときに実行される文を書きます。
clinout<=DINOUT(0);の<=は大小比較ではなくて、左側の信号に右側の信号の値が代入されることを示す記号です。
clinoutにDINOUT(0)の値が入れられます。
clinout<=DINOUT(0);からainout<=DINOUT(4);までの式はIOW=’0’でADRSIN=”11110011”でDINOUT(7 downto 5)=”100”でDINOUT(2)=’0’のとき以外は実行されません。
ということは各信号は次に同じ条件が発生するときまでラッチされることになります。

こうやって細かく説明を書いていくのはなかなかに疲れます。
説明が小刻みになりますけれど、今回はここまでにします。

CPLD入門![第70回]
2019.6.17upload

前へ
次へ
ホームページトップへ戻る