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

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



[第55回]


●hblnkwk2の怪

前回お見せしたVHDLプログラムではhblnkのところで、1箇所elsifをコメント行にしています。
その部分を下に再掲します。

--hblnk,hsync
process(cntr2)
begin
--hblnkwk               
                if cntr2="0000000" then
                        hblnkwk<='1';
                --elsif cntr2="0000001" then see note 5/6
                        hblnkwk2<='1';
                elsif cntr2="1010000" then
                        hblnkwk<='0';
                elsif cntr2="1010001" then
                        hblnkwk2<='0';
--hsynkwk               
      elsif cntr2="1010011" then
                        hsyncwk<='0';
                elsif cntr2="1011111" then
                        hsyncwk<='1';
                end if;
end process;

このコメント行については[第50回]にも書いています。
hblnkwk2は1文字の表示の遅れを調整するための信号です([第48回]参照)。
だとするとこのelsif文は必要な文のはずですが…。
[第50回]に書いていますように、このelsif文をコメント文ではなくすると、おかしな動作になります。
水平方向は80字表示のはずなのに、左端の1文字しか表示されなくなってしまいます。
オシロで確認してみますと、hblnkwk2が立ち上がってからすぐに落ちてしまうことがわかりました。
上側(CH1)がhblnkwk2で下側(CH2)がhblnkwkです。


水平軸を10倍にしてみました。

確かにおかしいです。
hblnkwk2がhblnkwkに1文字分遅れて立ち上がっているところはプログラム通りなのですが、そのあと1文字表示期間後にすぐに落ちてしまっています。

そこでさきほどのelsif文をコメント文にすると、まともな信号になります。


なぜこのようなおかしなことになってしまうのか、その時点では全く見当もつきませんでした。
これには悩みました。
とにかくelsif文をコメント文にすれば、正常に表示するようになるのですが、そのままでは一番左に表示されている「ゴミ」が消えてくれません。
仕方がないので水平同期信号を1文字分ずらしたところ、左側のゴミ表示の1文字分が画面の左端に隠れて見えなくなりました。
まあ、ごまかしですが、この時点ではその方法しか思いつかなかったので、そういうことにしました。

今回のCRTIF用のVHDLプログラムでも全く同じ状態だったのですが、このままにしておくのはどうにも気が進みません。
こんなばかなことはないはず、ということであれこれ試行錯誤を重ねました。
同じようなことを繰り返し試しておよそ3日ほどを費やしてしまったと思います。
これは長い間の経験から得たほとんど確信のようなものなのですが。
繰り返し試しても良い結果が得られず、もう諦めてしまおう、と思ってもそこで投げてしまってはいけません。
もう駄目だ、と思ったときにこそ、もう一回トライしてみると、意外にもそれまで目の前に立ちはだかっていたどうにもならない壁が瓦解してあっけなく解決してしまいます。
今回もそういうことでした。

前回書きましたCRTIF用のプログラムがその解決策でした。
複数の別々の信号があって、それらはそれぞれ別々のタイミングで動作するけれど、いずれの信号も同じ1つの信号によって動作するような場合に、私はそういう信号は1つのPROCESS文にまとめて記述してしまってもよい、と考えていました。
たとえば今回のhblnkwk、hblnkwk2、hsyncwkはいずれもcntr2によって動作します。
そういうケースです。
ところがそれではまずい場合があるようです。
同じ1つの信号によって動作する信号回路でも、それぞれ別個のPROCESS文で記述しないと誤動作につながる場合があるようです。

回路図の場合には当然のこととして、同じ1つの信号をもとにして、そこに複数の回路をつなげたりします。
VHDLプログラムの場合に1つのPROCESS文で複数の信号の動作を記述すると、なんでしょうかよくわかりませんが、一種の寄生回路のようなものが生成されてしまって、それが思わぬ誤動作を引き起こしてしまうことがあるようです。
このことがMAX7000Sに固有のクセのようなものなのか、あるいは一般的にVHDLで記述する場合の暗黙のタブーなのかはよくわかりません。
インターネットでざっと調べてみたのですが、そういうことを明示しているところには行き当たりませんでした。

とにかく。
どうやらそういうことらしい、という結論が得られましたので、前回お見せしましたように、CRTIF用のVHDLプログラムではそのように書くことで正しい結果が得られました。
その結果を受けて、VGAIF用のVHDLプログラムも同じように、hblnkwk、hblnkwk2、hsyncwkをそれぞれ別のPROCESS文に分けて記述したところ、elsif文をコメント行にすることなく正常に表示されるようになりました。
これにてようやく一件落着です。

CPLD入門![第55回]
2019.6.2upload

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