[新連載]CPLD入門!
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使うことになるだろうと思ってはいたのですが。
何を今頃になって、というようなものですが。
ようやく本気で、CPLDと四つに取り組みます。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第63回]
●”0111000”の写真です
前回の終わりにお見せした写真は、−−cntr2 の40字表示のところ(elsif SW80_40=’0’ and cntr2=”0110111” then のところ)でのcntr2の波形です。
それだけでは、プログラムの記述が”0110111”でよいのか、”0111000”にすべきではないのか、というあたりの判別ができないことに気がつきましたので、elsif SW80_40=’0’ and cntr2=”0111000” then にして、cntr2の出力をオシロで観測してみました。
下はその写真です。
上(CH1)がcntr2(5)で下(CH2)がcntr2(3)です。
cntr2のビット5〜ビット3が”000”から”110”までカウントアップして、”111”になってから”000”になる様子が確認できます。
[第61回]に書きましたように、”111”であることが確認できるのは”111”になってから1クロック後です。
そのためプログラムのelsifの記述を”0111000”にすると、そのことが確認できるのは実際には”0111001”のときなので、上の写真のように1クロック遅れてcntr2がクリアされます。
写真ではcntr2(3)に幅の狭いパルスが見えます。
その後でcntr2(5)がLになっています。
CNTR2(5)〜(3)が”111”になったあと1クロック後にcntr2がクリアされたことが推測できます。
たった1文字分の遅れなのですが、それ以後の回路の動作に影響してしまうため、まともな表示にはなりません(下の写真)。
以上のことから、プログラムの記述は”0111000”ではなくて、それよりも1クロック前の”0110111”にしなければならないことが確認できました。
ぴったり理屈通りですので、納得です。
●そのほかの修正箇所(2)
前回に続いて直していただいたそのほかの修正箇所です。
−−ramadrs のところなのですが、ここは何回も書いていますように、考え方がちょっと複雑で、そのためVHDLプログラムの記述もちょっと複雑な書き方になっています。
ですからここに手を入れるのはちょっと難しいなあと思っていました。
下は修正前のプログラムです。
--ramadrs process(cntr1,cntr2,cntr3,vblnkwk) begin if vblnkwk='0' then ramadrswk<="0000000"; ramadrswk0<="0000000"; elsif cntr3(2 downto 0)="111" and hblnkwk = '0' then ramadrswk0 <= ramadrswk; elsif SW80_40='1' and cntr2="1010000" and cntr1(0)='1' then ramadrswk <= ramadrswk0; elsif SW80_40='0' and cntr2="0101000" and cntr1(0)='1' then ramadrswk <= ramadrswk0; elsif cntr2(3)'event and cntr2(3)='0' and hblnkwk='1' then ramadrswk<=ramadrswk+"0000001"; end if; end process; |
そして下がメールでお送りいただいた修正後の、その部分です。
今までと同じ考え方で、event文のなかに、そのほかの文が含められています。
--ramadrs process(cntr2) begin if cntr2(3)'event and cntr2(3)='0' then if hblnkwk='1' then --(A) if vblnkwk='0' then ramadrswk<="0000000"; ramadrswk0<="0000000"; elsif cntr3(2 downto 0)="111" and hblnkwk = '0' then --(B) ramadrswk0 <= ramadrswk; elsif SW80_40='1' and cntr2="1010000" and cntr1(0)='1' then --(C) ramadrswk <= ramadrswk0; elsif SW80_40='0' and cntr2="0101000" and cntr1(0)='1' then --(D) ramadrswk <= ramadrswk0; else ramadrswk<=ramadrswk+"0000001"; end if; end if; end if; end process; |
--ramadrs process(cntr1_2) begin if cntr1_2'event and cntr1_2='0' then if vblnkwk='0' then ramadrswk<="00000000"; ramadrswk0<="00000000"; elsif cntr3(2 downto 0)="111" and hblnkwk = '0' then ramadrswk0 <= ramadrswk; elsif SW80_40='1' and cntr2="1010000" then ramadrswk <= ramadrswk0; elsif SW80_40='0' and cntr2="0101000" then ramadrswk <= ramadrswk0; elsif cntr2(2 downto 0)="111" and hblnkwk='1' then --(E) ramadrswk<=ramadrswk+"00000001"; end if; end if; end process; |