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

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



[第68回]


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

今回からはいよいよCPLDトレーニングボードを使ったVHDLサンプルプログラムと、QuartusU13.0の使い方についてなどを書いていきます。
まずは82C55(8255)のVHDLプログラムです。
82C55のVHDLプログラムでは実際の82C55と動作が異なっているところがあります。
82C55(以下8255でも同じ)はよくできたLSIなのですが、使う上で1つだけ不満に思っていることがあります。
82C55には8ビットのI/OポートA、B、Cがあっていずれも初期設定によって入力か出力に設定することができます。
AポートとBポートは8ビット全部を入力にするか出力にするかを設定しますが、Cポートについては上位4ビットと下位4ビットを分けて別々に入力または出力に設定することができます。
またCポートについては出力に設定したビットについて、他のビットの出力の状態を変化させずに特定の1ビットのみに0または1を出力することができます。

そこまでは40年も前のLSIとしてはとても良くできたLSIだと思います。
不満といいますのは。
82C55のポートを出力に設定すると、その出力は全ビットとも’0’になってしまうという点です。
これは82C55を利用した回路を考える場合にしばしば障害となります。
たとえばあるポートを出力に設定してなんらかの出力を維持している状態で、他のポートの向きだけを再設定したいと思っても、向きを変更しないポートの出力まで0クリアされてしまいます。
たとえばA、B、Cを全部出力に設定して、Aに12、Bに34、Cに56を出力している状態で、Bだけを入力に再設定したとします。
Bは入力に設定されますから、その出力が失われても仕方がないかなとも思いますか、関係のないAもCも00になってしまいます(向きの設定は3ポート同時にするしかなく、もともと出力だったポートを出力に設定してもそれは出力に再設定したことになってしまいます)。
このことはずっと不満に思っていましたので、今回作成したVHDLプログラムではそこのところは独自機能にしました。
上の例でA、Cの出力に変化がないのは勿論のこと、Bも再び出力に再設定した場合それ以前の出力の状態(34)がそのまま出力されます。

●82C55の使い方

82C55の使い方についてはND80Z3.5やND8080の附属説明書で説明をしています。
82C55のVHDLプログラムについての説明を理解していただくためには、その前に82C55の使い方が理解できていることが前提になります。
ですので上記の説明書には書いてあることですけれど、VHDLプログラムの説明に入る前に、簡単に82C55についてまとめておくことにします。
まとめるといっても、手っ取り早く上記説明書からコピーしてちょいとアレンジしただけです。
手抜きです。

[1]82C55のアドレス
82C55には向きを入力、出力どちらにでも指定できる8ビットのI/Oポートが3組あります。
これらはAポート、Bポート、Cポートとよんでおり、それぞれ異なったアドレスによって選択されます。
82C55VHDLプログラムではF0H〜F3Hのアドレスにしてあります。

  F0 Aポート
  F1 Bポート
  F2 Cポート
  F3 コントロールワード

コントロールワードは、各ポートの向き(入力か出力か)を設定したり、Cポートからビット出力をするときに使います。

[2]82C55の各ポートの入出力指定の仕方
82C55のポートはコントロールワードの設定によって入力か出力のいずれかに設定することができます。
電源投入後にはまず各ポートの向き(入力か出力か)を設定しなければなりません。
向きの設定はコントロールワードアドレスに必要なデータを送ることによって行われます(下図参照)。



入出力の指定はコントロールワードを、OUT命令でコントロールワードアドレス(F3)に送ることで行われます。
たとえばAポートとCポートを出力に、Bポートを入力に設定するには、I/OアドレスF3にコントロールワード82を出力します。
3E82  MVI A,82
D3F3  OUT F3

同じことをND80Z3.5やND8080ではND80Zモニタの機能を使って簡単に行なうことができます。
[F][3][ADRSSET]
[8][2][*I/O][OUT]

[3]各ポートに対するデータ入出力の方法
コントロールワードによって入力、出力の指定が行われたあとは、どのような時点でもその指定にしたがってデータの入出力ができます(入力ポートならIN命令、出力ポートならOUT命令を使います)。

(1)データの出力
AレジスタのデータがOUT命令によって、指定したポートから出力されます。
命令は下のようにコーディングします。
D3F0  OUT F0  ………Aレジスタの内容をAポートから出力する

出力に設定されたポートから外部に出力されるデータはラッチされています。
したがって新たに別のデータをそのポートから出力するまではもとのデータの出力が維持されます。

[注記]向きが入力に設定されているポートにOUT命令を実行しても無視されます。

(2)データの入力
IN命令によって、指定したポートからのデータがAレジスタに入ります。
命令は下のようにコーディングします。

DBF1  IN F1  ………Bポートに入力されたデータがAレジスタに入る。

[注記]向きが出力に設定されているポートに対してIN命令を実行すると、出力されている値が読み込まれます。

[4]ビット出力(Cポートのみ)
Cポートも前記[3]の使い方でデータ入出力ができますが、Cポートに限ってビット出力をすることもできです。
AポートやBポートの出力(およびCポートの通常出力)は8ビット全部が同時に出力されます。
これに対してCポートでは下図のコントロールワードを、コントロールワードアドレス(Cポートアドレスではありません)に出力することで、任意の1ビットだけ出力を変化させることができます。



例えばPC5 から0を出力したければ、00001010つまり0AをF3(F2ではありません)に出力します。
3E0A  MVI A,0A
D3F3  OUT F3

ND80Zモニタなら下記操作をします。
[F][3][ADRSSET]
[0][A][*I/O][OUT]

〔注意〕この動作は出力に設定されているビットのみに当てはまります。
Cポートは上位4ビットと下位4ビットで入出力を別個に設定できますが、例えば上位が出力で下位が入力に設定されている場合は、上の動作は上位4ビットに対しては有効ですが、下位4ビットに対しては無視されます。

説明が長くなってしまいました。
今回はここまでにいたします。

CPLD入門![第68回]
2019.6.15upload

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