[新連載]CPLD入門!
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使うことになるだろうと思ってはいたのですが。
何を今頃になって、というようなものですが。
ようやく本気で、CPLDと四つに取り組みます。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第132回]
●CPLDロジアナ(21)VHDLプログラム(5)
このところCPLDロジアナのVHDLプログラムについて少しずつ区切りながら説明してきましたが今回がその最後のところの説明になります。
下はその最後の部分です。
-- -- cntrH up for MEMORY ADDRESS -- process(cntrs,res_clr) begin if res_clr='0' then cntrH<="0000000000000000"; elsif cntrs'event and cntrs='1' and cntrH(15)='0' then cntrH<=cntrH+"0000000000000001"; end if; end process; -- -- PBIN latch -- process(cntrs) begin if cntrs'event and cntrs='0' then pbinL<=PBIN(7 downto 0); end if; end process; -- --data out to pic -- RC<=MDINOUT when IORD='0' else "ZZZZZZZZ"; -- --PBDATA to RAM -- MDINOUT<=pbinL when r_w='0' else "ZZZZZZZZ"; -- P41<=not cntrH(15);--end mark -- --MEMWR -- MWR<=cntrs or r_w or cntrH(15);--MWR_=cntrs='0' and r_w='0' -- MAOUT<=cntrH(14 downto 0); -- end rtl; |
プログラムの流れと説明の順序が違ってしまいますが説明の都合で順序を違えて説明することにします。
最初のcntrH upのところは後回しにしてその次のところから説明します。
PBIN latchのところで前回サンプリングクロックとして作成したCNTRSによってクロックの立ち下りエッジごとにプローブ入力PBINから入力される信号がラッチされます。
そこでラッチされたデータは8ビットの入力データpbinLとして保持され、それはひとつ飛ばして次のPBDATA to RAMのところでRAMに書き込むデータとしてMDINOUTに出力されます。
MDINOUTは8ビットの入出力端子でRAMのデータラインとつながっています。
この部分は双方向の信号ラインで測定期間中(r_w=’0’)はプローブからの入力データをRAMに書き込む方向になりますが、記録したデータをRAMから読み出すとき(r_w=’1’のとき)にも同じ端子が使われるため、そのときはRAMからの出力データとぶつからないようにMDINOUTからの「出力」をハイインピーダンス(”ZZZZZZZZ”)にします。
そのように測定期間中(r_w=’0’)はMDINOUTから測定データがRAMに出力されますが、同時にそれをRAMに書きこむための信号(MWR)としてもCNTRSが使われます。
次のMEMWRのところです。
そこまで説明したところで最初の部分に戻って説明します。
今回のプログラムの最初のところではCNTRSがcntrHのカウントアップにも使われています。
cntrHは16ビットのカウンタでプログラムの終わりのところでそのうちの下位15ビットがメモリアドレス(MAOUT)として出力されます。
RAMは32KBなのでメモリアドレスは15ビットですがその上のビットをコントロール信号として利用するためにここでは16ビット長のカウンタにしています。
その最上位ビットcntrH(15)が’1’になるとカウンタは停止します。
cntrH(15)は測定が完了したことを示す信号としてP41出力端子からPICに出力されます(PBDATA to RAMのところに記述しています)。
PICはこの信号を見ていることで測定が完了してCPLDが停止したことを知ることができます。
この情報はUSBを経由してWindows側のプログラムに送られます。
それを受けてWindows側のプログラムはUSB、PICを介してCPLDにリセット信号と今度はRAMからのデータの読み出しを命令するコードを送ります。
その部分のVHDLプログラムは[第128回]の「最初のPROCESS文」のところで説明をしました。
コード06でres_clr=’0’になってカウンタがクリアされ、コード07でデータ読み出しモード(r_w=’1’)が設定されます。
実は前回のCNTRS信号の説明のところで「サンプリング期間のみアクティブにする」と書きましたが説明が足りませんでした。
CNTRSはデータ読み出しモードのときもRAMアドレスをインクリメントするための信号として使われます。
それを可能にするためにRAMにデータを書き込むときにはCNTRSWKをCNTRSとして使い、逆にRAMからデータを読み出すときにはIORD信号をCNTRSとして使います(前回はそこのところを書いていませんでした)。
IORDはPICがデータを1バイトずつ読み込むための信号として出力します。
data out to picのところでIORDがLの期間中RAMからMDINOUTに読み出したデータがPIC側に出力されます。
このときPICにはRC端子からデータが出力されますが、このRC端子は8ビットの入出力端子です。
PICからは同じRC端子を使ってコマンドも受け取りますからIORD=’0’のときのみデータ出力をアクティブにして、それ以外のときには出力をハイインピーダンス(”ZZZZZZZZ”)にします。
今回は説明が前後してちょっとわかりにくかったかもしれません。
本当はプログラムを説明の流れに合わせて書き換えるともう少しわかり易くなったかもしれません。
いつものことですがプログラムが先にできて後から説明することになってしまうのでそういうことになってしまいます。
VHDLプログラムは全体としては同時実行されますからなおさら順序に無頓着なプログラムの書き方になってしまいます。
結果として悪いプログラムの見本になってしまいますが多忙な中での作業ですので悪しからずご了承いただきますようお願いいたします。
CPLD入門![第132回]
2022.2.18upload
前へ
次へ
ホームページトップへ戻る