技術情報

VHDLソース

mz700.vhd
各サブモジュール間の接続と、こまごました回路を含むトップモジュールです。
T80s.vhd
T80.vhd
T80_ALU.vhd
T80_MCode.vhd
T80_Pack.vhd
T80_Reg.vhd
OPENCORES で公開されているZ80互換IPコア、T80です。同期用ラッパーT80sを使っています。データバスの入出力が分かれており、このモジュールの外で双方向制御をしなくてすむのが楽でいいです。
8255.vhd
インテル 8255 互換のモジュールです。周辺回路が決まっているため入出力方向設定など一部の機能を実装していません。
keymatrix.vhd
PS/2キーボードからのキーコードをMZ-700のキーマトリクス状に並べたフリップフロップのON/OFFに変換します。AVRが処理するユーザI/F用に一部のキー入力を横取りしています。
ps2kb.vhd
  PS/2キーボードからキーコードを受信するモジュールです。全く凝ってませんので、LEDの点灯とか一切やってません。Spartan-3時代のものとほとんど変わってません。
8253.vhd
counter0.vhd
counter1.vhd
counter2.vhd
インテル8253互換のモジュールです。本物はあまりにモードが多くて実装がたいへんだったので、使用するモードのみに絞って実装しています。そのため、もしかするとうまく動かないプログラムがあるかもしれません。
memsel.vhd
バンクメモリ制御レジスタと各メモリへのチップセレクト信号を生成するブロックです。
ls367.vhd
音楽再生のためのテンポ用クロック生成と、トーンジェネレータ(8253)動作制御を司るブロックです。水平ブランキング信号が必要な場合はここに追加することになります。
sdram.vhd








1chipMSXに搭載されている32MBの容量を持つSDRAMのコントロールを行います。SDRAMをアクセスするモジュールはこのモジュールを経由する必要があります。Z80などのプロセッサのアクセス速度に比べて桁違いに高速なので、複数のアクセスを調停してあたかもデュアルポートRAMのように振る舞えるようにしています。実際にはZ80とAVR-coreと画面出力モジュールとHAL研互換PCGモジュールがSDRAMを共有しており、コントローラもクアドラプル(4)ポートRAMとして動作します。どのポートもウェイトは必要ない設計になっています。
SDRAMは次の用途で使用されています。
・Z80のメインRAM
・モニタROM
・CG-ROM
・HAL研互換PCG
・キャラクタVRAM
・MZ-1500互換PCG/グラフィックRAM
・AVR-coreの外部RAM(ワーク用)
psio.vhd
avr_core.vhd
AVR_Core_CompPack.vhd
SynthCtrlPack.vhd
AVRuCPackage.vhd
alu_avr.vhd
bit_processor.vhd
io_adr_dec.vhd
io_reg_file.vhd
pm_fetch_dec.vhd
reg_file.vhd
avrrom.vhd
dpram8k.vhd
dpram4k.vhd
rom.vhd
MZ-700単体では処理できないI/Oや周辺機器の模擬をするモジュールです。サブCPUとしてAVR-Coreを埋め込んで、SDカードアクセスとファイルシステムへのアクセス、コンフィグレーションPROMのアクセス、ユーザI/Fを担当させています。1chipMSXでの実装の要とも言えるモジュールになっているわけです。
AVR-coreはT80同様OPENCORESの成果物で、ATmega103相当のAVRとなっています。ここでは通常のAVRチップに含まれる周辺機能をほぼ全て取り去り、リセットでROMがすげ替わったりと好き放題してます。回路規模もコンパイル後のオブジェクトサイズも他のマイコンに比べてコンパクトであるというのが採用の理由です。
vgaout.vhd
dpram05k.vhd








MZのVRAMからデータを拾って画面に表示するモジュールです。
まず出力できる画面は、1chipMSXの元々の仕様を踏襲する形で、15kHz規格のRGBディスプレイとコンポジット/Sビデオモニタに出力できるようにしました。切り替えは裏面のディップスイッチで行います。ディップスイッチの詳細はこちらを参照してください。
VRAMをSDRAMに設ける構造になっています。ついでに、いずれやる予定だったMZ-1500仕様のPCGやパレットも実装しています。実装のポイントは、一つのタイミングで取得すべきひとつの座標に割り当てられたデータを一度に取り出すことができるようVRAMなどをインターリーブ配置し、SDRAMからは2アドレスのデータを連続で出力させて最小限の時間でデータを揃えるようにしたところです。例えばひとつの座標にはVRAM1(MZ-700互換の文字コードを指す)、VRAM2(PCGのコードの一部)、アトリビュート1(MZ-700互換の色の割り付け)、アトリビュート2(PCGコードの残りとPCG表示許可など)があるのですが、これを連続した4アドレスに配置して、16bit×2データを取り出せば後の加工が楽になります。PCGも3プレーン分ありますので同様に並べて一度に取得します。CGROMのデータはPCGと同じ並びに置きますがPCGと同じアドレスではアクセスできないので別にアクセスします。とにかく、本来は別のメモリにあるものでも同じアドレスを指定してデータを取得するものはまとめられるというわけです。
SDRAMに3回アクセスしてようやく表示できるデータが揃うのですが、VGA表示での1文字(8ドット)分の時間では全く間に合わないので、バッファを用意してラインメモリとして使用するようにしています。このため、本物ではキャラクタ・PCG・背景色がプライオリティ設定に基づいて選択されながら出力しているところが、あらかじめバッファにプライオリティ込みで演算済みのデータを用意してしまうため、単純にデータを送り出すだけになっています。
vencode.vhd
1chipMSX由来のコンポジットビデオエンコーダモジュールです。表示するドットの構成とエンコードアーキテクチャが合っていないので、解像度がかなり低くなっています。
pll25.vhd
MegaWizardで作成したPLLモジュールです。21.47727MHzから25MHz(画面出力用)と85.9MHz(SDRAM用)を生成します。
ckgen.vhd
21.47727MHzから3.58MHzを生成します。
pcg.vhd
HAL研互換PCG機能をサポートするモジュールです。

(C) Nibbles Lab. 2007