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

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



[第15回]


●VHDLプログラム(回路の記述2)

今回は前回書きましたVHDLプログラムの訂正についての説明も兼ねて、回路プログラムについて説明をします。
今回は74HC174の部分です。


74HC174は6ビットのD−FFです。
上の回路ではそのうちの4ビットしか使っていません。
下はその部分の記述です。
たったこれだけです。

    process(s98out,Dinout,rcwk)
    begin
                if s98out'event and s98out= '1' then
                        rcwk<=Dinout(3 downto 0);
                else
                        rcwk<=rcwk;
                end if;
    end process;
全体のプログラムリストは[第10回]でお見せしています。
この回路はデータラッチです。
74HC174はCKの立ち上がりでD入力をラッチします。
s98out’eventのように信号名’eventという記述は信号の変化(立ち上がりか立ち下がりか)を示します。
それだけでは立ち上がりなのか立ち下がりなのかがわかりませんからそのあとにand以下の記述をつけてそれを示します。
event(状態の変化があった)直後の信号の状態が’1’なら立ち上がりです。
実は修正前はここが’0’になっていました。
昨日は実際に動作テストをしたところ動作しなかったためにちょっとあせってしまって、それに加えて落ち着いて記事を書いているだけの時間がなかったので、前回は「プログラムが間違っていました」と書いてしまいましたが、この回路の動作に限って言えば、ここは立ち上がりでも立ち下がりでも間違いではありませんでした。
ただ74HC174の動作を忠実にプログラム化するということならば、ここは立ち上がりでのラッチ動作になります。
74HC174のデータシートです。

[出典]Texas Instrument 74HC174Datasheet

うーん。
このFANCTION TABLEはちょっと悩ましい表現です。
CLKの↑でラッチすることと、CLK=Lでそれを保持するとありますが、CLK=Hならどうなのか?
ちょっと悩んでしまいますが、ラッチ動作なのでCLK=Hのときは当然ラッチしたデータを維持すると解釈すべきでありましょう。
ま。
そういうことなので、74HC174の動作としては、
CLK’event and CLK=’1’
ということになります。

ところでこの回路はZ80のOUT命令で出力されたデータのD2〜D0をラッチして、それをPIC18F14K50のRC7〜RC5に出力するとともに、D3をラッチしてその出力を74HC173の出力イネーブルに使っています。
S98OUTという信号はZ80から出力されたアドレスバス信号のA7〜A2とIORQとWRを合成したものです。
そこでZ80の各信号のタイミングを見てみますと。

[出典]ZILOG Z80CPU User’s Manual

上の図は簡単な図ですがCLKを基準にして見る限りではIORQとWRの↓から↑までの間はアドレスもデータも固定していますから、今回の回路の動作としては、上に書いたように立ち上がりラッチでも立ち下がりラッチでも正しいということになります。

以前にCPLDはハードなのかソフトなのかということを書いたことがあるように思います。
VHDLは間違いなくソフトなので、その意味ではCPLDを扱うということはソフトウェアの範疇だといえます。
ところでVHDLで今回のようなプログラムを書いて、それをコンパイルすると沢山の警告メッセージが出されます。
今回の回路は上のタイミングチャートを確認することで、入力されるデータは確実にラッチされることがわかりますが、そんなことはコンパイラにはわかりませんから想定される場合によっては出力信号が期待通りにならない可能性があることを警告してくれるわけです。
もちろん信号の変化するタイミングなどについて全く考慮しないでプログラムを書いたりすれば、警告の通りになってしまいます。
そのように考えれば、VHDLはソフトウェアではありますが、ハードウェアの知識経験がなければ正しいプログラムを書くことは難しい、と言えるでしょう。

データラッチプログラムには続きがあります。
もう一度先ほどのプログラムに戻ります。

    process(s98out,Dinout,rcwk)
    begin
                if s98out'event and s98out= '1' then
                        rcwk<=Dinout(3 downto 0);
                else
                        rcwk<=rcwk;
                end if;
    end process;
データラッチの動作はCLKによって入力データをラッチして出力することと、ラッチするタイミング以外のときは出力データを維持するという2つの働きがあります。
その後者を示しているのが
else rcwk<=rcwk;
です。
データラッチについては、こういう定型的な書き方をする、と覚えてしまうとプログラミングが楽になります。

定型といえば、上のリスト中、
rcwk<=Dinout(3 downto 0);
というところがありますが、
左辺のrcwkはrcwk(3 downto 0)なのですが、その4ビットの全てを対象にしているため、ここでは(3 downto 0)を省略することができます。
その一方で右辺のDinoutは(6 downto 0)の7ビットのうちの下位4ビットが対象であるため、(3 downto 0)を省略することはできません。

本日はもう少し続けて書くつもりだったのですが、時間がなくなってしまいました。
次回に続きます

CPLD入門![第15回]
2019.3.1upload

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