プログラムカウンタの最下位4ビット:Q0~Q3はうまい具合にCPLD基板上のLEDモニタに接続されているのでクロックを1Hzくらいまで落としてカウント値の遷移を目視で観察してみました。
すると
0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F-1-2-3-4-5-・・・
という具合でFまで行って桁上げするとき0を経由せずいきなり1になってしまっていてこれではアドレス0x10にあるコードがスキップされてしまうわけです。はじめはVHDLによるバイナリカウンタの記述に問題があるのかと疑いましたが、ここは教科書的な記述通りで問題を含みようがなく、ふと思いついてクロック源を自身のMC14500ボードからCPLD基板上にあるテストクロックに差し替えたらなんと正常にカウントします。
両者は何が違うのか・・
まず.MC14500ボード自前のクロックです。クロックに割れがあるのではないかと立上りエッジを拡大していますが立ち上がりに約200nsかかっていることがわかります
一方、CPLD基板上の米粒PICによるテストクロック源です。時間軸が異なりますが立ち上がりが約9ns、実に20倍以上の速度です。
どうもこれはMC14500ボード上で発生した立上り時間がかかりすぎるクロックを入力されたCPLDのカウンタが誤動作しているようです。
この自前クロックはMC14500チップ上にあるCR発振器用のインバータを介して出力されます。このインバータはアナログ的な動作をするためバッファを持たないUBタイプでゲインが低く、しかも元々が古い低速CMOSロジックの4000/4500シリーズ、遅いのはしかたがありません。
これを受けるロジック側では立上り立下りがゆっくりだと閾値を通過する時間が長くノイズでバタついたり、中途半端なレベルでCMOS出力のハイサイドとローサイド両方のFETがONしてしまうと貫通電流で電源電圧まで変動させてしまうおそれがあるらしいです。今回、特にF→0とか同時に多数のビットが変化するときに影響が出たのかもしれません。
MAX7000Sの規格を見てみると実際、立上り立下り時間とも40ns以下と明記されていました。
安易に古いロジックと新しいロジックを混在させるのは危ないってことですね。