2023年2月6日月曜日

CPLDでシリアル扱うの難しいね、という話

この件について、反省文ですw 

もともとやろうとしてたのは、シリアル伝送の18bit PCMデータをI2Sに変換すること。んで、想定してた元PCMの周波数が8MHzのクロックが入ってるので分周して半端なサンプリングレートだろうと思っていた。そうなるとなるべく高い周波数で非同期で変換してやるしかないかな、という事で96kHzのI2Sで読み出すことを考えていた。

この際、ハードで実装するならFF打つ回数を限界まで減らさないと無理だと思っていたので、内部には18bit x 2chの36個のFFを用意して、元の信号で順次更新、I2Sで非同期に読みだし。元信号がMSBから出てくるし、倍速以上で読み出せば誤差はLPF通せばほぼ消えると思ってた。

この時の間違ってた想定は「MSBから更新してけば、どのタイミングで読み出しても更新中の値は更新前と更新後の値の間にあるだろう」で、これは完全な誤り。例えば16bitで考えると、0から-1へ更新が入る時は、MSBが入った瞬間に-32768へ値が飛び、徐々に大きなビットが落ちて-1へ近づく。なので、たまに大きなノイズが入る。

もう1つの誤算は元の信号が半端な周波数ではなかった事。きっちり48kHzで出ていたので96kHzで読み出すと、ノイズの載る位置が固定化されて、クロックドリフトでゆっくりノイズの載るビットがズレていく。これがTweetで見ていた現象でした。

最初はメタステーブルかと思って、入力側のクロックを一桁速い出力側のクロックで取り込んで2段くらいFF打ってから使ってみたんだけど関係なかった。

で、これを真面目に対処しようとすると、18bitのシフトレジスタで更新していって値が確定時に別の18bit FFに取り込み。で、これをI2Sから直接出すと、やっぱり出力中に値が変わっちゃうことがあるので、I2Sもフレームの最初のタイミングで18bit FFに丸々コピーして、そこから読み出し。結局3段のバッファが必要なんですね。ステレオだからバッファだけでFFが108個かな?EPM3064だとFFは64個しか無いので、一気に3倍になったFFを実装するのは無理で、結局2枚のチップに分けて入れました。I2Sの出力に6bitカウンタが必要だし、他にもタイミング作るのにいくつかFFが必要なので、分けてもギリギリでした。はぁ……材料不足つらいですね。

それと、Qiitaに雑なI2Sの理解として軽くメモ書きを残しました。

2023年1月30日月曜日

X68000 修理にて復活!

はじめに

X68Z ハッカーズエディションを試せる事になったので、それに先立ってずっと故障したままだったX68k EXPERTの修理をし、無事元気になったのでその報告です。

壊れた経緯は例にもれず電源です。ただ大学のサークルの部室に置き去りにしてたのが、煙を吹いて動かなくなったという連絡があって。それを回収してそのまま20年近く放置してたのかな?それ以来、ハードディスクも火を入れずにずっとしまい込んでた。

ちなみに他にcompact XVIというかredzoneも所有していて、あとはサンデーネットが閉じる時にもらったXVIを所有してますが、両方とも電源が理由で死んでました。XVIも電源修理であっさり直ってますが、特に新しい話題はないのでEXPERTの修理の話を発掘しやすいようにまとめとこうと思います。

まずは電源から

という事で、まずは電源交換の本スレがこちら。

BEEPさんで購入した、同人サークルさんがセットで用意してくれたPico PSU換装キット。今回は日和ってまずは確実に動く状態にしようと安全側に倒しました。キットがなくても12V、5V、-12Vを拝借できれば良いので、この手のがなくなっても最悪どうにでもなるのかな、と思いました。今なら修理方法も世の中に出回ってるし、ヤフオクで交換部品のセットを安くまとめてくれてる人もいるので、そういうのを利用すれば数千円くらいで直せるんじゃないかな?Pico PSUだと5Vの供給が足りないかもアドバイスもあったので、Phantomで強力なラズパイを使うとか、拡張ボードを挿してるなんて場合は電源を修理した方が良いのでしょうね。

エラーが発生しました。リセットして下さい。

電源は入ったものの最初みたメッセージはこれ。やっぱり何か壊れてる?

って事で、この時点で一番怪しいのはSRAMのデータが飛んでる事態。まぁ、長年放置してたわけで、当然バックアップの電池は死んでますね。SRAMの内容が壊れてるとブートデバイスの情報も消えてるので、結果としてさっきの画面に飛ぶのかな。なのでOpt.1を押してFDから強制起動を試すことで先に進めます。まぁ、普通はここでFDDが死んでて起動できない気もしますが。しまい込んでたと言っても、ずっとマンション内で空調の効いた仕事部屋に安置されてたので状態は良かったようです。

電池交換

続けて電池交換はこちら。EXPERTだと+側の2端子のうち1つはN/Cなので、パターンを見て繋がってるほうにハンダしてあげて下さい。使ったのはCR2450だけど3Vならなんでも良いのかな?

電池が入ればOpt.1でHumanなりを起動してswitch.xで設定してやればエラーは出なくなります。

テキストVRAMの交換

何事もなければこれで修理完了だったんでしょうけど、残念ながら他にも壊れてました。

こんな感じで画面の上の方に点線が現れます。これだけなら少しノイズがあるだけで我慢できますが、テキスト面で画面上方となると、スクロール等で画面中にコピーされまくります。特にテキストはピクセル単位じゃなくプレーン方式なので、特定のプレーンだけゴミが撒き散らされて。用途によってはパレットをうまく使ってマスク用プレーンにしてたりするんで文字がまったく見えなくなっちゃったりします。

という事で奮闘開始したのがこのスレ。

まずはメモリーテストでテキストVRAMでエラーするのを確認。M51C262相当品は新品入手は難しそうだったのでAliExpressでリサイクル品を探して発注。HM53461ZPを見つけて購入しました。ワードアクセスと平行してシフトしながらビット読み出しもできる感じのマルチポートなのかな?こういうタイプのメモリは初めてだったので、変換ボード組んで載せ替えるとかは避けました。

メモリが届いてからは実際に壊れてるチップの特定作業。XVIとかはサービスマニュアルが公式から公開されてるけどEXPERTにはないんですよね。ただまぁ、そこまで変わってる部分じゃないだろうって事でXVIの回路図は確認しました。それでテキストVRAMはこの4bitのチップを4つ並べて16bitにし、各チップのメモリ空間がちょうど1プレーン分ある事がわかります。なので、それをx4で4プレーン分載せて合計16枚でテキストVRAMを構成してる。シルクで書かれてるIC番号は当然XVIとは違うけど、まぁ同じような順番だよねっていう想像もできるので、若い番号からプレーンごとに並んでるんだろうな、という予想もできます。

実際に壊れた箇所は自分でテストプログラムを書いて詳細に調べました。$00e60e00 - $00e60fff にかけてbit 10-11の2bitがhighにならなくなってたので、最終プレーンでbit 8-11を担当してるチップを交換すれば良い事になります。プレーン内の並びは回路図の信号名で当たりをつけてLSB側から並んでると判断。という事で、16個中の15番目のメモリが怪しい。

VICONから配線を追うことができればEnableがどこに繋がってるかで並びは確定できるんですが、拡張スロットの下にあって調べられませんでした。拡張スロットって外せるんですかね?

そんなわけでメモリ交換はシュッ太郎の出番。ただ電源ピンはかなり苦戦します。昔は原因理解してなかったんだけど、これって当時の基板はthermal reliefとか考えてなかったからですよね。ベタで繋がってるんで熱が逃げちゃうから基板全体を温めるか火力を上げるか、みたいな。この辺はベテランの人のノウハウを知りたいところなんですが、自分はわりと細いドリルで掘りがち。今回もチップは抜けたけどGNDの穴は再び塞がっちゃって。グリグリやって穴を確保しました。

という事で、EXPERTは左からplane 1の3:0、7:4、11:8、15:12、plane 2の同じく、plane 3、4って順に並んでるので、もしテキストVRAMが壊れて交換が必要って人がいましたら参考まで。

ハードディスク

SxSIでSCSI読めてたはずなんですが、どうもsusieで認識しない。ハードディスクも怪しいし、68も怪しいし、加えてPhantomを載せてたから問題の切り分けが難しい。という事で、ハードディスクはXVIを直してそっちで救出しました。SCSIボードも持ってたはずなんだけど、誰かにあげた記憶もあって見つからず。本体にSCSIついてるXVIで面倒だけど確実にチェックする方法を選びました。

ハードディスクのサルベージに関してはPhantomさんが本当にスグレモノで。SDカード上に仮想ディスクを作ってくれるので、ハードディスクが無事認識したらmintで仮想ディスクに全部コピーしました。奇跡的にも全部読めたんですよ、もうびっくりです。吸い上げたディスクイメージはクラウドとバックアップストレージに入ったので、たぶんもう僕の命より堅牢。

吸い出し後はPhantomを今回修理した長年の相棒でもあるEXPERTに戻し本格的に再運用を開始しました。

SxSIはおそらく自作で追加したパリティ回路の74が壊れてるんじゃないかと予想。バスリセットとかは飛んでディスクは反応してるんですよね。パリティエラーでネゴれてない印象でした。