ラベル CPLD の投稿を表示しています。 すべての投稿を表示
ラベル CPLD の投稿を表示しています。 すべての投稿を表示

2024年3月23日土曜日

ついにNew City Heroが実機で遊べた

前回のNew City Hero @ j80/macの続き。

エミュレータで動作確認してから実機で〜という事で奮闘しておりました。

まずは搭載メモリの確認からです。

そしてM.K WorkshopさんのPSA基板を利用してボードを作成しようと思ったのですが……上のスレッドでも書いているように、どうにも世の中は半導体不足。表面実装の74ロジックICが思うように手配できません。指定ではLSになっている部品もやむを得ずHCを使う事に……そしておそらくこれが敗因。HCだと出力弱いからファンアウト大きくできないし遠くに飛ばすには不向きってあたりが怪しいのかな、と。

ハンダ周りを見直して気になるとこは盛り直したり、色々とチェックしてみたんだけど改善せず。タイミング周りを調査するのは手間だし、頑張ってもあまり得るものも無い気がしたので、元々の最終ゴールだった完全自作へと踏み出します。 

基本はPSAベースなのでI/O 1981年6月号の記事を読み解いていきますが、論理はCPLDに全部収める方針。また、NCHが3chサウンド対応なので、その部分の拡張も取り込んでいきます。またこのPSAではPCG-8100同様に文字コードの半分の128キャラ分を任意パターンに置き換えられるようになっていますが、256キャラ全部を置き換える拡張にも対応させました。

この辺りの回路も同期回路で置き換え。Verilogで100行ちょっとくらいの論理です。Z80からのI/Oを受けて、かつキャラクタージェネレータ側のアドレスバスとデータバスに繋げる必要がありピン数は70くらいは必要。またピン数多い=レベル変換したくないので5Vトレラントなデバイスが良い……という事で現行チップから候補を見つけるのは難しく、骨董品のMAX7000(7128STC100)

ミキサーとアンプはM.K.Workshopさんの回路を追ってこんなもんかなーって書き起こした回路図を眺めて、増幅回路の教科書的なものと見比べて怪しいと思ったところを手直し。たぶん回路を追いそびれたり読み間違えたりしてる。

そして届いたのがこれ。

表面実装のコンデンサは綺麗につけるの難しいし、確実に線が繋がってるかの自信が持ちにくい。ただでさえ回路に自信がないから不確定要素を減らすために工場で実装してもらっちゃってます。CPLDとかSRAM、ボリュームなんかはあちらで手に入らないものだから自分の方で実装。

最初のテストはこんな感じでCPLDの書き込みをして、次はZ80とキャラクターROMだけ載せた状態でCPLDには信号をほぼほぼパスするーするだけの本体基板相当の回路を書き込んで通常モードの動作を確認します。ここまで動けば基板の方は問題ないからCPLD側の論理のデバッグに集中できる。

んでまぁ、ここでCPLDの論理も一通り出来てたんだけど、検証してからじゃないと本体壊しても嫌だし……と2週間くらい渋るわけですが(笑)とりあえず最低限のテストをして最終動作確認へ。この辺り、趣味でやろうとすると大した環境がなくて辛い。仕事でやってた頃はQuestaでOVM使ってSystemVerilogで書いたテストをぶん回してたんですが、手頃にCI回せる選択肢となるとiverilogになってしまう。でも環境についてはVS Codeで新たにいくつか拡張を導入して試してみました。Verilog-HDL/SystemVerilog/Bluespec SystemVerilogとかWaveTraceとか。後者はライセンス購入しないと8chまでしか信号見れないので購入しちゃった。gtkwaveと比べて何が良いって全てCodeで片付くってだけではあるんだけど、まぁ高くはないし。

という事で出来た成果物はここに置いてあります。実はサイズを図って作ったにも関わらず、Z80とキャラROMの位置が少しずれてて、幅が2.5ピン分くらい狭くなってしまっています。何かしら不具合あるだろうし、この基板で確認できるとこだけでも確認しよう……とソケットの下駄を履かせ、ピンが少し外側に出るように折り曲げて2.5ピン分を補正してます(汗)もしこれを参考に自作する際には、基板は作り直してくださいませ。あとSRAMもこれはもう秋月に売ってないので別のやつに差し替えるなり。そもそもMAX7000ありますか?って話でもありますけど。

こんな感じでばっちり動作、安定してます。NCHクリアまで遊び倒したいと思います。ちなみに実装スペース的には下に一段下駄を入れて上下ちょうど収まる感じですね。下駄がないと下側で他のチップとぶつかるかもしれないし、上もこの状態でキーボード基板に接触しないスレスレでした。接触してもショートしそうな部分がないのは安心ですが、放熱的に少し心配ではありますね。Z80やROMはそれなりに熱くなりますし。

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の理解として軽くメモ書きを残しました。

2020年2月11日火曜日

XC9536の開発環境

5V動作で安く入手できるCPLDって事で、基板を日常的に起こすようになると一定の需要がある。もともとは大昔に買い溜めてたXCR3032あたりを使ってたんだけど入手性が悪くなってるので……まぁXC9536も趣味を超えて使うには厳しい感じですが。

開発に関してはISE14.7最終版にもサポートが残ってるので問題は少なめ。ただ書き込みに少々難ありで。自分はUSB環境だとPlatform Cable USB/II互換を謳う中華品を使っていたんですが、どうにもiMPACTでも動作が怪しい。XCR3032ではうまく動作してたんだけど、XC9536に関してはJTAGでデバイス検出まではできるもののProgramしてもVerifyで失敗、Blank CheckするとOKが返って来てしまう。Get Device Checksumでも不一致エラーで、そもそも特定の操作順を守った時のみAvailable Operationsに操作が表示されるという変な状況でした。

で、エラー情報で色々と調べてみたらDIGILENTのフォーラムで似たような話が。そう言えば今まで見落としてたけど、この中華装置はDigilent JTAG-HS2として認識されていたのでした。という事で、このケーブルでは9500シリーズは未対応らしい。Platform Cable USB/IIの人はたぶん大丈夫?

そうなると家にあるのは15年以上前にSpartan3 Starter Kitで使っていたパラレルポート用のダウンロードケーブルのみ。幸い以前必要になった事があって自宅サーバーになってるキューブ気にはパラレルポート拡張用のPCIボードが刺さってたりISEがインストールされてたり。という事で試そうと思ったんだけど、ドライバーのwindrvr6がloadできない。以前使ってた時から何度もUbuntuのinplace upgradeをしてるのでそりゃそうかっていう。という事で、

% cd /opt/Xilinx/14.7
% cd ISE_DS/common/bin/lin64/install_script/install_drivers
% ./install_drivers
って感じでインストールしようとしたら……
linux_common.h:29:4: error: #error "This kernel is too recent: not supported by this file"
 #  error "This kernel is too recent: not supported by this file"
    ^
linux_common.h:51:2: error: #error "unsupported linux kernel version"
 #error "unsupported linux kernel version"
あぁ……。ソースみたらKernel 2.2, 2.4, 2.6しか対応してない。確かにそんな時代の産物でした。これしか選択肢がなければドライバいじりを始めたんだと思うけど、僕にはこんな時のためにレガシーCAD用のVMがある!(あるいはVivadoの配布パッケージから最新版のドライバだけ抜き出すこともできたかも)

という事でVirtualBoxにプリンタポートを直接見せることができないかテスト。ちなみにGUIからは設定できないので面倒。
% vboxmanage modifyvm CentOS5 --lptmode1 /dev/parport1
% vboxmanage modifyvm CentOS5 --lpt1 0x378 7
そう、CentOS5の環境がまだ生き残っているのです。このままだと通常の環境だとVM起動時に/dev/parport1が開けなくて怒られるはず。これはlpがデバイスを専有してるため。なので、マニュアルで一時的に外すなら
% rmmod lp
が必要。あとパーミッションも0666にしてあげる必要あり。 このあたり、永続化させたいなら/etc/modulesからlpをコメントアウトすればOK……と思ってたんだけど、これだけじゃ今どきは駄目っぽい。おそらくcupsが起動時になんかやってるのかなーってinit.dをみたらinsmodしてたので、こいつを外す必要あり。で/etc/defaults/cupsを見たら、この辺りの設定は/etc/modules-load.d/cups-filters.confに移行した、とあるので見たらここにもlpが居たのでコメントアウト。たぶんこれでOKかな?パーミッションはudevでよしなに。

ちなみにCentOS5の環境を維持するのは難易度高めです。なにせシステムで使ってるTLSが世の中からbanされた太古のバージョンなので、そのままでは通信が軒並み動かない。セキュリティー系のチェインを一通りソースからbuildして、その上でgitやらなんやらの開発環境を作り直す必要がありました(これは結構前の作業で詳細はマシンのログにしか残してない)。

それと番外編的な話題として、9536のリビジョンが2じゃないと更に苦労があるようです。このあたりはFramさんのCPLD(XC9536無印)の書き込み環境を構築するまでの紆余曲折に書いてありました。9536使おうとすると一度は目に入って怖気づく or やる気がでる記事。

ちなみに、パラレルのケーブル刺そうとした時にマシンの電源コネクタが抜けてサーバ落ちて「ギニヤー」ってなりました。その後VMWare Playerとどっちが楽だっけなぁ……と一瞬起動したのちにVirtualBoxを起動したらネットワークが繋がらなくて、VMWareのドライバとコンフリクトしたかなぁ……と調査したりもしてたんですが、実はパラレルのケーブル刺す時にLANケーブルも抜けかけてブリッジネットワークに使ってたNICがdownしてただけでした。

作ったやつはこれ。


以前作ったこいつを1 chipで置き換えようかと思ってたんだけど、I/Oがpullupをサポートしていないタイプのシリーズだったと気づきボツに。SMD network register使った基板を作り直しますorz