tranZPUter
前書き
tranZPUter と tranZPUter SW は活発に開発が続けられており、変更はこのドキュメントに定期的に反映されます。
tranZPUter v1.0 のテスト中、および CP/M を搭載した RFS v2.0 アップグレードの登場に伴い、tranZPUter を更新して Z80 に追加メモリを与え、より高いクロック周波数で動作させる必要があることが明らかになりました。また、制御 IO プロセッサ(FPGA ファブリック上の ZPU Evo または K64F)に依存せずに独立して動作できるようにする必要もありました。
tranZPUter の v1.0 には設計上の制約があり、率直に言ってプロジェクトの完成を大幅に困難にしていました。例えば、BGA(Ball Grid Array)IC のはんだ付け経験が不足していたため、次善策として FPGA が既にはんだ付けされたプリファブ FPGA ボード CYC1000 を選択しました。このデバイスおよび同サイズ・同 FPGA ALM 要件の他の選択肢はすべて汎用 I/O ピン数が不足していました。そのため、トライステート・レジスタラッチを用いたマルチプレクシングが必要となりました。KISS(Keep It Simple Stupid:シンプルに保て!)という原則が頭に浮かびます。そこで、コンセプトと設計をさらに進めるため、一歩引いて CP/M 要件を実現するための Z80 側のニーズと、制御 IO プロセッサ側のニーズを見直しました。その後、元の tranZPUter に戻る前に tranZPUter SW サブプロジェクトでコンセプトと設計を発展させ、設計の v2.0 を再開しました。
tranZPUter v1.0 のテスト中、および CP/M を搭載した RFS v2.0 アップグレードの登場に伴い、tranZPUter を更新して Z80 に追加メモリを与え、より高いクロック周波数で動作させる必要があることが明らかになりました。また、制御 IO プロセッサ(FPGA ファブリック上の ZPU Evo または K64F)に依存せずに独立して動作できるようにする必要もありました。
tranZPUter の v1.0 には設計上の制約があり、率直に言ってプロジェクトの完成を大幅に困難にしていました。例えば、BGA(Ball Grid Array)IC のはんだ付け経験が不足していたため、次善策として FPGA が既にはんだ付けされたプリファブ FPGA ボード CYC1000 を選択しました。このデバイスおよび同サイズ・同 FPGA ALM 要件の他の選択肢はすべて汎用 I/O ピン数が不足していました。そのため、トライステート・レジスタラッチを用いたマルチプレクシングが必要となりました。KISS(Keep It Simple Stupid:シンプルに保て!)という原則が頭に浮かびます。そこで、コンセプトと設計をさらに進めるため、一歩引いて CP/M 要件を実現するための Z80 側のニーズと、制御 IO プロセッサ側のニーズを見直しました。その後、元の tranZPUter に戻る前に tranZPUter SW サブプロジェクトでコンセプトと設計を発展させ、設計の v2.0 を再開しました。
概要
Sharp MZ80A は 2MHz で動作する Z80 CPU をベースとしています。ヴィンテージであり、現代のコンピュータ(あるいは Raspberry Pi)と比べると非力です。歴史の一部であるとともに、時折役立つソフトウェア資産を持ち、今でも愛好家がいます。ソフトウェア・エミュレータを作成してソフトウェアの使用期間を延ばすことも可能ですが、オリジナルハードウェアを使用することには特別な意味があります。これは、マシンをオリジナルのままに保ちながら、複数の異なる CPU(FPGA 上の ZPU、68000 など)や 128MHz まで動作する Z80 でマシンをパワーアップするアップグレードを提供する代替手段です。これはバスマスタリングによって実現され、元の CPU をトライステートにして FPGA がバスを制御します。
より強力で代替となる CPU とメモリを提供するだけでなく、FPGA は接続された SD カードを使用してフロッピードライブやハードドライブなどとして動作し、呼び出し時にビデオメモリをオーバーレイすることでメニューシステムを提供することもできます。
この設計はまだ開発中です。私は当初、しばらく後回しにしていた ZPU Evo SDRAM コントローラーを進めるために開発を停止しました。SDRAM は重要です。CYC1000 上の Cyclone 10LP は限られた BRAM しか持っておらず、キャッシュと IOCP ブートローダー用にしか十分ではありません。多くの機能がテストされ、回路図/PCB が作成されましたが、SDRAM コントローラーが動作するようになった今、VHDL をさらに進めてメニュー/SD サービスを提供する C/C++ コードを開発するだけです(ZPU コードベースでは既に完了済み)。
FPGA ソリューションとして CYC1000 を選択しました。BGA デバイスのはんだ付けに自信がなく、また US$30 という価格で費用対効果が高いためです。ソフトウェア指向の方には、CYC1000 の代わりに Pi Zero W や類似品(tranZPUter-SW サブプロジェクトでは Cortex-M4 ARM ベースの K64F を使用)を使用することは難しくありません。PCB とインターフェース回路の再設計が必要なだけです。
この設計は Z80 をその場で置き換えるため、MZ80A に限定されず、適切なソフトウェアがあれば任意の Z80 ベースのコンピュータに使用できます。
より強力で代替となる CPU とメモリを提供するだけでなく、FPGA は接続された SD カードを使用してフロッピードライブやハードドライブなどとして動作し、呼び出し時にビデオメモリをオーバーレイすることでメニューシステムを提供することもできます。
この設計はまだ開発中です。私は当初、しばらく後回しにしていた ZPU Evo SDRAM コントローラーを進めるために開発を停止しました。SDRAM は重要です。CYC1000 上の Cyclone 10LP は限られた BRAM しか持っておらず、キャッシュと IOCP ブートローダー用にしか十分ではありません。多くの機能がテストされ、回路図/PCB が作成されましたが、SDRAM コントローラーが動作するようになった今、VHDL をさらに進めてメニュー/SD サービスを提供する C/C++ コードを開発するだけです(ZPU コードベースでは既に完了済み)。
FPGA ソリューションとして CYC1000 を選択しました。BGA デバイスのはんだ付けに自信がなく、また US$30 という価格で費用対効果が高いためです。ソフトウェア指向の方には、CYC1000 の代わりに Pi Zero W や類似品(tranZPUter-SW サブプロジェクトでは Cortex-M4 ARM ベースの K64F を使用)を使用することは難しくありません。PCB とインターフェース回路の再設計が必要なだけです。
この設計は Z80 をその場で置き換えるため、MZ80A に限定されず、適切なソフトウェアがあれば任意の Z80 ベースのコンピュータに使用できます。
tranZPUter について
tranZPUter という名前は、FPGA 内のベース CPU が ZPU Evo となることから「TRANsformable ZPU compuTER(変換可能な ZPU コンピュータ)」に由来しています。ZPU Evo は、元の Z80 をトライステートにして MZ80A のメモリとペリフェラルに ZPU デバイスとしてアクセスすることで、Sharp MZ80A にメニュー、SD、ビデオオーバーレイサービスを提供します。
異なる CPU を提供するには、VHDL でソフトコア CPU シグナルをこの設計のインターフェースを通じて MZ80A バスにマッピングするだけです。プログラムメモリは MZ80A 上のものでも、より高速な SDRAM でも構いません。つまり、ソフトコア CPU を使用する場合、MZ80A のメモリを使用する実際の必要はありません。私の SharpMZ エミュレータでは、FPGA BRAM を使用して 112MHz で Z80 を実行していますが、テストでは少なくとも 128MHz が維持可能であることが示されています。したがって、128MHz で動作する FPGA BRAM を持つソフトコア Z80 CPU は MZ80A ペリフェラルアクセス時のみ低下しますが、CP/M やデータベース用途ではプログラム実行が 64 倍向上するため、非常に望ましいと言えます。
ギャラリーには現在の設計の写真があり、Gitea にアップロードされたファイルは比較的安定しています。WIP ファイルは常に変化するためアップロードしません。
異なる CPU を提供するには、VHDL でソフトコア CPU シグナルをこの設計のインターフェースを通じて MZ80A バスにマッピングするだけです。プログラムメモリは MZ80A 上のものでも、より高速な SDRAM でも構いません。つまり、ソフトコア CPU を使用する場合、MZ80A のメモリを使用する実際の必要はありません。私の SharpMZ エミュレータでは、FPGA BRAM を使用して 112MHz で Z80 を実行していますが、テストでは少なくとも 128MHz が維持可能であることが示されています。したがって、128MHz で動作する FPGA BRAM を持つソフトコア Z80 CPU は MZ80A ペリフェラルアクセス時のみ低下しますが、CP/M やデータベース用途ではプログラム実行が 64 倍向上するため、非常に望ましいと言えます。
ギャラリーには現在の設計の写真があり、Gitea にアップロードされたファイルは比較的安定しています。WIP ファイルは常に変化するためアップロードしません。
v1.0 ハードウェア
この設計の基本は Z80 バスマスタリング、つまり Z80 を回路から切り離してコンピュータを必要に応じて制御できる機能にあります。バスマスタリングは、I/O デバイスからメモリへ、またはビデオ/グラフィックスなどのアプリケーションでメモリ間の高速データ転送を行う DMA などのデバイスで一般的に使用されていました。Z80 バスを制御するデバイスは、プログラムを実行する Z80 よりもはるかに高速にデータを転送できるため、この方式に利点があります。
この設計では、バスマスタリングは同様の目的で使用されており、Z80 バスを制御してメインメモリと SD カード間、または I/O プロセッサとビデオ表示バッファ間でメニュー表示のためにデータを転送します。また、ソフトプロセッサが物理的な Z80 を完全にアイドル状態にしてメイン CPU として機能する場合にも使用されます。つまり、ソフト T-80 ZPU CPU を使用することで、ローカルメモリ内の 128MHz でアプリケーションを処理しながら、ホストマシンの I/O とビデオバッファへのアクセス時のみ速度を落とすことができます。
設計の中心は、元の Z80 を娘カードに持ち上げ、必要に応じて制御できるようにいくつかの信号を再配線することです。設計のコアは FPGA で、Trenz Electronics 製のミニ開発ボード上の Altera Cyclone 10LP です。これは Raspberry Pi や Teensy 3.6 に簡単に置き換えられますが、このプロジェクトの目的は VHDL を使用して FPGA で電子ハードウェアを設計し、別プロジェクトで開発してきた ZPU プロセッサを活用することです。
Trenz Electronic 開発ボードの選択により設計にいくつかの制約が生じました。それは I/O 機能が限られているという点で、同じサイズと機能を持つ他のプリビルド FPGA 開発ボードの選択肢はそれほど多くなく、プロジェクト開始から FPGA を直接設計に組み込むことは、BGA(Ball Grid Array)パッケージのはんだ付け経験がほぼゼロ(既存のチップをリボールしたことはありますが、それらは動作する設計でした!)だったため、リスクが高すぎると判断しました。
I/O 機能が限られていたため、1:1 モードではなくアドレスモードで 2 つの 16 ビットトライステートバッファラッチを使用せざるを得ませんでした。つまり、FPGA から出力される Z80 データ、アドレス、および制御ラインは、一度に 1 ワードずつ「セット」する必要があります。データをラッチに書き込み、アドレスをラッチに書き込み、制御信号をラッチに書き込むといった手順が必要です。これにより FPGA が Z80 ホストを制御できる速度が低下し(100MHz の FPGA は 50 回の操作を実行しても 2MHz の元のバス速度に合わせることができますが)、VHDL の FSM が必要になるためロジックが複雑になります。
ラッチを制御する信号自体も、FPGA ボードの I/O 機能不足のため、直接ではなくアドレスモードで書き込む必要があり、さらに複雑になっています。上記の回路図では IC U6 と U8 が共通の 16 ビットデータバス(ラッチと共有)を介して書き込まれ、FPGA からの単一出力信号でクロックされることがわかります。遅延ラインが使用されており、CYC_CTL/RST がハイになるとラッチへの書き込みが行われます。これはマスターリセットに接続された同じ信号がハイになってから約 8ns 後にラッチに到達し、データをクロックインします。CYC_CTL/RST がローになるとラッチはリセットされ、これで 16 ビットラッチ U5 と U9 を制御するのに十分です。16 ビットワードを U5 に書き込む手順は次のとおりです:
この設計では、バスマスタリングは同様の目的で使用されており、Z80 バスを制御してメインメモリと SD カード間、または I/O プロセッサとビデオ表示バッファ間でメニュー表示のためにデータを転送します。また、ソフトプロセッサが物理的な Z80 を完全にアイドル状態にしてメイン CPU として機能する場合にも使用されます。つまり、ソフト T-80 ZPU CPU を使用することで、ローカルメモリ内の 128MHz でアプリケーションを処理しながら、ホストマシンの I/O とビデオバッファへのアクセス時のみ速度を落とすことができます。
設計の中心は、元の Z80 を娘カードに持ち上げ、必要に応じて制御できるようにいくつかの信号を再配線することです。設計のコアは FPGA で、Trenz Electronics 製のミニ開発ボード上の Altera Cyclone 10LP です。これは Raspberry Pi や Teensy 3.6 に簡単に置き換えられますが、このプロジェクトの目的は VHDL を使用して FPGA で電子ハードウェアを設計し、別プロジェクトで開発してきた ZPU プロセッサを活用することです。
Trenz Electronic 開発ボードの選択により設計にいくつかの制約が生じました。それは I/O 機能が限られているという点で、同じサイズと機能を持つ他のプリビルド FPGA 開発ボードの選択肢はそれほど多くなく、プロジェクト開始から FPGA を直接設計に組み込むことは、BGA(Ball Grid Array)パッケージのはんだ付け経験がほぼゼロ(既存のチップをリボールしたことはありますが、それらは動作する設計でした!)だったため、リスクが高すぎると判断しました。
I/O 機能が限られていたため、1:1 モードではなくアドレスモードで 2 つの 16 ビットトライステートバッファラッチを使用せざるを得ませんでした。つまり、FPGA から出力される Z80 データ、アドレス、および制御ラインは、一度に 1 ワードずつ「セット」する必要があります。データをラッチに書き込み、アドレスをラッチに書き込み、制御信号をラッチに書き込むといった手順が必要です。これにより FPGA が Z80 ホストを制御できる速度が低下し(100MHz の FPGA は 50 回の操作を実行しても 2MHz の元のバス速度に合わせることができますが)、VHDL の FSM が必要になるためロジックが複雑になります。
ラッチを制御する信号自体も、FPGA ボードの I/O 機能不足のため、直接ではなくアドレスモードで書き込む必要があり、さらに複雑になっています。上記の回路図では IC U6 と U8 が共通の 16 ビットデータバス(ラッチと共有)を介して書き込まれ、FPGA からの単一出力信号でクロックされることがわかります。遅延ラインが使用されており、CYC_CTL/RST がハイになるとラッチへの書き込みが行われます。これはマスターリセットに接続された同じ信号がハイになってから約 8ns 後にラッチに到達し、データをクロックインします。CYC_CTL/RST がローになるとラッチはリセットされ、これで 16 ビットラッチ U5 と U9 を制御するのに十分です。16 ビットワードを U5 に書き込む手順は次のとおりです:
CYC_CTL/RST をローに設定
CYC_D0:7 を 0x02 に設定(ADDR_LE アクティブ、ロー)
CYC_CTL/RST をハイに設定、CYC_D0:7 のデータが U6/U8 にラッチされ、ADDR_LE がアクティブになり
CYC_D0:15 のデータが U5 レジスタに転送される(ADDR_LE の立ち上がりエッジでラッチ)
Z80 BUS に渡される CYC_D0:15 に必要なデータを設定
CYC_CTL/RST をローに設定、ADDR_LE が非アクティブ(ハイ)になり、CYC_D0:15 のデータが U5 にラッチされる
v1.0 回路図

FPGA FSM が微調整されると、Z80 バスへの実際の書き込みと読み取りは透明になりますが、Trenz 開発ボードの I/O 不足のため、前述のとおり過度に複雑になっています。
後書き
FPGA ベースの tranZPUter v1.0 の作業を2つの理由で中断しました:
1. CP/M やその他のソフトウェアをサポートするために Z80 回路の機能強化が必要だった、
2. Trenz CYC1000 の使用は限られた I/O リソースのために設計を過度に複雑にする悪い選択だった。
tranZPUter の作業は tranZPUter SW(ソフトウェア)として継続されており、設計ノウハウは意図された tranZPUter の v2.0 にフィードバックされる予定です。
v2.0 ハードウェア
tranZPUter SW の試行錯誤から得た知識を活かして、tranZPUter の作業を再開しました。tranZPUter は依然として Z80 ベースシステム(そしていずれは 6502 ベースの BBC Model B)のアップグレードとしての私の最終目標であり、再プログラム可能な FPGA テクノロジーを使用してソフト I/O プロセッサと一般的な Sharp MZ80A 使用のためのヘルパーハードウェアをインスタンス化し、FPGA を要求に応じて必要なハードウェアに再構成します。例えば 68008 ベースの Sharp MZ80A を実現できます。
この目的のために、コスト削減のため最新世代ではない高性能 FPGA(110K ロジックエレメントと 500KB 超の BRAM を提供)を調達し、ZPU Evo、tranZPUter SW、および FPGA ベースビデオモジュールの作成で得た知識をもとに設計を開始しました。
このセクションではまだ進行中の設計の概要を説明します。
この目的のために、コスト削減のため最新世代ではない高性能 FPGA(110K ロジックエレメントと 500KB 超の BRAM を提供)を調達し、ZPU Evo、tranZPUter SW、および FPGA ベースビデオモジュールの作成で得た知識をもとに設計を開始しました。
このセクションではまだ進行中の設計の概要を説明します。
v2.0 Z80 アップグレード回路図

バージョン 2.0 は tranZPUterSW 設計から試行錯誤した Z80 アップグレード回路を使用しています。
v2.0 FPGA 回路図

バージョン 2.0 は v1.0 から大きく飛躍し、CYC1000 ボードにある Cyclone 10 LP の代わりに、はるかに大型の BGA FPGA を使用しています。この Cyclone IV CGX75 デバイスは 110K ロジックエレメントと 500KB 超の BRAM を提供し、多くの可能性を実現します。
v2.0 FPGA RAM 回路図

バージョン 2.0 では ZPU Evo 設計を利用し、zOS とそのアプリケーションの利用可能なメモリについて K64F と同等のレベルを維持するために追加メモリが必要です。選択されたメモリは 10ns スタティック RAM で、L2 キャッシュなしで ZPU を実行できます。
v2.0 電源および デカップリング回路図


より大きな FPGA を使用することで電源への要求が高まります。特にデカップリングは重要であり、そのため多くのデカップリングコンデンサが必要です。これは Cyclone IV 向けの Altera PDN Design Tool v1.1 に準拠しています。
v2.0 PCB
PCB のバージョン 2.0 は tranZPUterSW の開発を基に、設計をかなりコンパクトにしています。
以下のボードは設計中の PCB の Kicad 画像です。このボードはまだ完成していません。作業中に新しいアイデアが浮かび、v2.1 の設計を先行して進め始めたためです。v2.0 を完成させて製造するかどうかは v2.1 の設計次第です。これは主に tranZPUter プロジェクトの開発段階の参考として掲載しています。


クレジット
第三者の設計を使用またはベースにした場合は、元の著者の著作権表示を含めています。私の知る限り調査した範囲では、すべての第三者ソフトウェアはオープンソースで自由に使用可能です。ライセンス制限のあるコンポーネントが見つかった場合は、このリポジトリから削除し、適切なリンク/設定を提供します。
ライセンス
このデザイン(ハードウェアおよびソフトウェア)は GNU Public Licence v3 の下でライセンスされています。
GNU Public License v3
このプロジェクトで GPL v3 とマークされているソースおよびバイナリファイルはフリーソフトウェアです。Free Software Foundation が発行した GNU 一般公衆利用許諾書バージョン 3、またはそれ以降のバージョンの条件のもとで再配布および変更することができます。
ソースファイルは有用であることを期待して配布されていますが、いかなる保証もありません。商品性や特定の目的への適合性の黙示的な保証さえも提供しません。詳細は GNU 一般公衆利用許諾書を参照してください。
このプログラムとともに GNU 一般公衆利用許諾書のコピーを受け取っているはずです。受け取っていない場合は http://www.gnu.org/licenses/ を参照してください。
ソースファイルは有用であることを期待して配布されていますが、いかなる保証もありません。商品性や特定の目的への適合性の黙示的な保証さえも提供しません。詳細は GNU 一般公衆利用許諾書を参照してください。
このプログラムとともに GNU 一般公衆利用許諾書のコピーを受け取っているはずです。受け取っていない場合は http://www.gnu.org/licenses/ を参照してください。