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

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



[第122回]


●CPLDロジアナ(12)50MHzでテスト

これまでの経過について簡単に整理しておきます。
[第118回]でCPLDロジアナに搭載する予定の62256型RAMのデータシートを確認したところそのアクセスタイムが20MHzのサンプリングクロックには適合しないことがわかりました。
しかし実際には20MHzでも特にデータエラーらしきものは発生せず正常に動作しています。
それはたまたまRAMのアクセスタイムに余裕があって20MHzでも動作するのか、このRAM(AS6C62256)はその程度の余裕があると考えてもよいのか、確実なところはわかりません。
そこのところを確かめたいと思い、もしもそれよりもさらに高い周波数、たとえば25MHzでも正常に動作するならば20MHzでの動作の確実性が高まるのではないかと考えました。
そこで多分無理かもしれないと半分は疑いながら[第119回][第120回]でさらなる動作確認をしてみたところ、まさかの25MHzでも正常動作することが確認できました。
こうなると欲が出てきます。
前回はさらにクロックアップして33MHzでも動作確認をしてみました。
その結果は一部に怪しいところもありましたが全体としては33MHzでも大体は正常に動作するという驚きの結果となりました。
一体どこまで動作してくれるのでしょうか。
疑い半分、期待半分でもう少しクロックアップしてみたらどういう結果になるのか、試してみたくなります。
そこで今回はとうとう50MHzに挑戦してみることにしました。

50MHzの場合は下の波形図のようになります。

50MHzの1周期はなんとたったの20nsです。
もとの100MHzクロックを2分周したcntrL(0)をそのままMEMWR信号として使います。
そのパルス幅はL期間が10nsでH期間も10nsです。
MEMWRのサイクルタイムは20nsということになります。
いやいやいや。
さすがにこれはどう見ても無理でしょう。
AS6C62256のカタログ値はWRITEパルスのL期間の最小値が45ns、サイクルタイムは55nsです([第118回])からその半分にも満たない値です。
サイクルタイムはカタログ値の36%、WRITEパルス幅にいたってはなんとたったの22%です。
さすがにこれは試してみるまでもないと思いました。
でもまあ乗りかかった船です(乗ったとたんに沈没か?)。

下はMEMWR信号部分のVHDLプログラムです。

--MEMWR
--
        MWR<=cntrL(0) or r_w or cntrH(15); 
--

下はcntrLについて記述しているプログラム部分です。

process(clkwk2,res_clr)
begin
        if res_clr='0' then
                cntrL<="000";
        elsif clkwk2'event and clkwk2='0' then
                        cntrL<=cntrL+"001";
        end if;
end process;

これまでと違ってcntrLはただのバイナリカウンタになりますからその部分のプログラムは上の通りシンプルなものになります。

下はサンプリングクロック50MHzでのCPLDからの出力波形をカメレオンロジアナで観測した波形です。

PROBE00はCPLDから出力されるメモリアドレスA0です。
サンプリングロックが50MHzですから20nsごとにH、Lを繰り返します。
カメレオンロジアナはサンプリングクロック100MHzですから10nsごとにサンプリングします。
ですから10nsのズレ(誤差)が出ます。
CPLDロジアナの50MHzも100MHzから作り出しています。
Lが10ns、Hが30nsの波形になっていますが、これはおそらく両方の100MHzのタイミングが少しずれているためではないかと思われます。
そうなのかあるいはCPLDが異常動作しているのかどうかはわかりませんが、PROBE03のWRITEパルスはきれいに周期が20nsのパルスになっていますから多分異常動作などではないと思います。
PROBE01はCPLDロジアナのPROBE0でラッチされたデータ(4MHz)です。
H、Lが125nsの入力データを20nsごとにラッチしたデータです。
6回ラッチするごとに5nsのずれが出ます
PROBE02はCPLDロジアナのPROBE1でラッチされたデータ(2MHz)です。
H、Lが250nsのデータです。
これも20nsでは割り切れません。
PROBE03は上に書いたようにMEMWRです。
Lが10ns、Hが10ns、周期が20nsの波形になっています。
PROBE04はクロック発生回路基板の4MHz出力信号です。
CPLDロジアナのPROBE0でラッチされる前の信号です。
PROBE04を20nsのサンプリングクロックでラッチした信号がPROBE01です。
理屈としては最大で20nsの遅れが発生します。
PROBE05はクロック発生回路基板の2MHz出力信号です。
CPLDロジアナのPROBE1でラッチされる前の信号です。
PROBE05を20nsのサンプリングクロックでラッチした信号がPROBE02です。
こちらも最大で20nsの遅れが発生します。
PROBE01、PROBE02には一部にヒゲが見えます。
これだけを見るとCPLDロジアナが入力データをラッチしたときに(ノイスなどで)誤ってラッチしているように思えますが、PROBE04でも同じようなヒゲが見えます。
こちらはCPLDロジアナに入力する前の信号ですからカメレオンロジアナのラッチデータです。
このことからすると多分ともにカメレオンロジアナがノイズなどで誤ってラッチしたものと考えてもよいかと思います。

CPLDロジアナのサンプリングクロック50MHzの波形です。

PROBE0がクロック発生回路基板から出力された4MHzの波形です。
H、Lの125nsを20nsでラッチしていますから波形に短いところと長いところが出来ています。
しかし確認してみると1000nsの間にちょうど4周期が収まっています(250×4=1000)から50MHzでも(!)正しく機能していると考えられます。
PROBE1からPROBE3もきれいな波形で乱れはありません。
PROBE4からPROBE7は1周期の一部しか見えていませんが右にスライドしていけば1周期の全体を見ることができるはずです。
PROBE4はちょうどL区間が見えています。
右端の立ち上がったところは1920nsと読めます。
左端の立ち下がったところは−80nsと読めますからL区間はちょうど2000nsです。
PROBE4は250KHzですからその1周期は4μs(4000ns)です。
その半波は2000nsですから計算通りです。

右にスライドしました。

PROBE4のH区間が見えています。
立ち下りは3920nsです。
立ち上がりは1920nsですからH区間も2000nsです。
PROBE5も3920nsで立ち上がっています。
立ち下がりは−80nsでしたからPROBE5のL区間は4000nsです。
PROBE5は125KHzですから1周期は8000ns、その半波は4000nsです。
ちょうど計算通りです。

右にスライドしました。

PROBE5が7920nsのところで立ち下がっています。
立ち上がりは3920nsでしたからH区間も4000nsです。
7920nsのところではPROBE6が立ち上がっています。
PROBE6は−60nsのところで立ち下がっていました。
L区間は7980nsです。
PROBE6は62.5KHzですから1周期は16000ns、その半波は8000nsです。
計算とは20nsの差がありますがサンプリングクロックが20nsですから20nsの差は許容できます。
するとPROBE6のL区間も計算通りです。

さらに右にスライドしました。

PROBE6が15940nsで立ち下がっています。
さきほどは7920nsで立ち上がっていますからH区間は8020nsです。
計算上のH区間は8000nsですが20nsの差は許容できますからH区間も計算通りです。
PROBE7も15940nsで立ち下がっています。
PROBE7は−60nsで立ち上がっていますからH区間は16000nsです。
PROBE7は31.25KHzですから1周期は32000ns、その半波は16000nsです。
ちょうど計算通りです。

さらに右にスライドしました。

PROBE7が31940nsで立ち上がっています。
さきほどは15940nsで立ち下がっていましたからL区間も16000nsです。
こちらもちょうど計算通りです。

最後までスライドしました。

データエンドは654600nsです。
654600/20=32730になります。
RAMには32768個のデータが書き込まれますがプログラムの都合で実際にそれを読み出して波形として表示するのは32735個です。
最初の画面で先頭の0nsの前に5バイト分の表示データがあるのでそれを加算すると32735バイトになります。
ちょうど計算通りです。
PROBE0に1箇所波形の乱れが見えます。
ノイズなのかアクセスタイムが速すぎるための書き込みエラーなのか判断できません。
これがもしも書き込みエラーだったとしても、全体を通してみればエラー率はほとんど0%です。
やってみるまでもないと思いながら試してみたのでしたが、文字通り「驚異的」な結果が得られました。

CPLD入門![第122回]
2022.1.16upload

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