Skip to content
Kunihiko Ohnaka edited this page Jul 2, 2021 · 21 revisions

DE0-CV版 FPGA X68000 (F68k) を動かすまでの手順書

機材の準備

  • Windows PC (64bit OSが必要です。32bitだと Quartus Primeが動作しません)
  • DE0-CV
  • PS/2キーボード
  • VGAケーブルとVGAディスプレイ (HDMIを接続するには工作が必要なのでまだ試せていない)
  • micro SDカード (2GB以下の古いもの)
  • Human68kなどの起動ディスクイメージ(.d88形式)

最低限これだけあれば動作はさせられます。追加であると便利なものは以下のとおりです。

  • X68000実機
  • FDX68 (ラズパイFDDエミュレータ)
  • FDD DRIVE SWAPPER+ (FDX68をX68000の実機に接続し、ドライブ番号やモード切り替えをスイッチ一つでできるようにするためのアダプタ基板)
  • F68k用 I/O基板 (@kunichiko製作中)
    • 回路図及び基板データは別リポジトリ(FPGA-X68k-DE0CV-IO)で公開しています。

準備編

Quartus Prime のインストール

今回は Quartus Prime ライト・エディション 18.1 (64bit Windows版)を使用しました。

インテルの公式サイトから Quartus Prime ライト・エディションをダウンロードしてインストールしてください。

プロジェクト一式の準備

F68kのプロジェクト一式を準備します。

  • 方法1: プー氏のWebサイトからF68kの QARファイル(アーカイブファイル)をダウンロードする方法
  • 方法2: 本Gitリポジトリをチェックアウトする方法(上記プロジェクトの中身を私が整理したものです)
  • 方法3: 本Gitリポジトリのリリース版をZIPでダウンロードする方法

の3つの方法があります。

プー氏のWebサイトから QAR を取ってくる方法

プー氏のWebサイトからF68kの QARファイル(アーカイブファイル)をダウンロードしたら、QARファイルを今後作業するディレクトリに移動しておきます。

Quartus Prime (今日時点で 18.1を使用) で QARファイルを開くと(QARファイルをダブルクリックしてもOK)、どのフォルダに展開するか聞かれるので、適当なカークディレクトリを指定します。すると、Quartusが QARを解凍して展開してくれます。

本リポジトリをチェックアウトする方法

Gitの操作に慣れている方は、本リポジトリで「Clone or download」ボタンを押してリポジトリURLをコピーし、お使いの Gitクライアントソフト、あるいは git コマンドを使ってチェックアウトします。ブランチは以下の3つを用意しています。

  • original
    • オリジナルプロジェクト
    • プー氏のQARファイルを展開したものを、なるべく素の状態で保存したものです
  • master
    • 安定版
    • originalブランチの内容を元に、私の環境でビルドできるように調整したものが入っています
  • develop
    • 開発版
    • masterになる前の開発途中のものが入っています

よくわからない場合はひとまず master ブランチを選んでください。

ZIPでダウンロードする方法

本リポジトリのreleaseページを開き、各リリースバージョンのzipアイコンをクリックしてダウンロードします。

Quartus Primeで QPF(Quartus Project File)ファイルを開き、プロジェクトを展開する

展開されたプロジェクトにあるQPFファイル(F68k_DE0.qpf)を開くとプロジェクトが開きます。

プー氏オリジナルの状態だと、Quartus Primeのバージョンが 18.1よりも古いためか、IPコアのアップグレードをするように要求されることがあります。最低限赤くなっているものだけアップグレードする(あまりやりすぎるとうまく動かなくなる)。先の「方法2」や「方法3」でプロジェクトを用意された場合はそのまま開けるはずです。

オリジナル版のIPコアを更新する方法

手動で行う場合の手順です。私は以下のIPコアだけ更新しました。

  • asmicontの「ALTASMI_PARALLEL」

該当行をダブルクリックするか、行を選択した状態で「Upgrade in Editor」を押すとアップグレードが実行できます。2019/9/29版でうまくいったときの様子は以下のとおりです。

うまくいった状態

その後2020/2/22版で同じように SLTASMI_PARALLELをアップグレードしたところ以下のように赤ばかりになってしまいました。しかし、このまま無視してビルドすると普通に起動できていますので、これで大丈夫なようです(詳細不明)。赤色に騙されて他のIPコアのアップグレードをしてしまったら起動できなかったので、やはり SLTASMI_PARALLELのアップグレードだけに留めておいたほうがよさそうです。 うまくいった状態_200222版

CGROM.hexの用意

プロジェクトには、著作権の問題から CGROM (Character Graphics ROM、漢字や平仮名などのフォントが格納されたROM) のデータが含まれていません。Windows用のソフトウェアエミュレータなどもCGROMはバンドルされておらず、ご自身で実機から吸い出すか、別の著作権的に問題のないフォントから生成するなどの手順が必要ですが、それと同じような手順が必要となります。。

例えば、XM6 などであれば、XM6Util.exeを使うとWindowsのフォントを使って CGROMもどき(以下、CGROM.tmpと言います)を生成することが可能ですが、F68kでもエミュレータが生成したCGROM.tmpが使えます。

実機をお持ちの場合は、デバッガ db.x を起動して、以下のコマンドを実行することで CGROM.DAT を保存できます。

> db
-w CGROM.DAT,f00000 fbffff

さて、用意したCGROM.tmp あるいは CGROM.DAT をFPGA上で利用するためには、FPGAのコンフィギュレーションROMの中にそのデータを書き込む必要があります。F68kでは、IPLROMとCGROMをコンフィギュレーションフラッシュメモリの空き領域に保存し、それをFPGA起動時に読み込むアーキテクチャになっています。コンフィギュレーションフラッシュメモリに書き込むファイル(.pofファイル)にそれらのROMイメージを一緒に組み込めばよいのですが、そのためにはバイナリをインテルHEX形式に変換しておく必要があります。

CGROM.tmpを CGROM.HEX (インテルHEX形式)に変換する方法(例)

Windows環境での例です:

  • CGROMのバイナリデータを CGROM.tmp として保存 (実機がある場合は、実機から吸い出してください)
  • http://elm-chan.org/fsw.html から「汎用HEXファイル変換ツール」をダウンロード
  • 上記ツールを適当なフォルダに展開
  • 同じフォルダに CGROM.tmp を転送
  • 以下のコマンドを実施
> bin2hex CGROM.tmp -fi > CGROM.hex

出来上がった CGROM.hex をQuartusのプロジェクトディレクトリ内にある BIOS フォルダの下に移動してください。(IPLROM.hexがあるフォルダです)

ビルド編

コンパイル

QuartusでStart Compilationをクリック

POF(Programmer Object File)ファイルの生成

DE0-CVは Intel(Altera)の Cyclone VというFPGAを搭載しています。FPGAの回路構成はFPGAに外付けされているフラッシュメモリに書き込まれていて、電源起動時にそれが読み出される仕組みになっています。このフラッシュメモリは コンフィギュレーションROM と呼ばれていて、そこに書き込むためのイメージファイルが POFファイルです。

今回、F68kを構成するためには、POFファイルに以下の3つが含まれている必要があります。

  • FPGAの回路構成(コンパイル結果のSOF)
  • IPLROMイメージ
  • CGROMイメージ

この3つを合体させて1つのPOFファイルを作る必要があります。

コンフィギュレーションROM の容量は8Mバイトありますが、その内訳を以下の図に表しました。

コンフィギュレーションROMのメモリマップ

先頭7MバイトはFPGAの回路情報の格納用にし(実際にはそんなに大きくないです)、最後の1MバイトをIPLROMとCGROMの格納領域にしています。実はよく見るとこの最後の1Mの領域の構成は、X68000の実機のメモリ空間の最後の1Mバイト(0xF00000〜0xFFFFF番地)と同じ構成になっています。

手順1 .cof (Conversion Setup File) を確認

この3つをどのように合成するかを設定するかを決める設定ファイルが .cof ファイルです。プーさんの readmeによると、X68k_DE0CV.cof を使うように指示がありますが、中身を見ると、F68kには関係のない(と思われる) PC8801や PC9801関連のイメージについての設定も含まれています。

私の方では、最低限必要と思われる3つのファイルだけに絞った、以下のような .cof ファイルを用意しました。こちらも、先の「方法2」や「方法3」でプロジェクトを用意された方は既に入っています。その場合は、X68k_DE0CVDEMU.cofを使っていただければOKです。

<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
<cof>
	<eprom_name>EPCS64</eprom_name>
	<output_filename>X68k_DE0CVDEMU2.pof</output_filename>
	<n_pages>1</n_pages>
	<width>1</width>
	<mode>7</mode>
	<hex_block>
		<hex_filename>BIOS/IPLROM.hex</hex_filename>
		<hex_addressing>relative</hex_addressing>
		<hex_offset>8257536</hex_offset>
		<hex_little_endian>0</hex_little_endian>
	</hex_block>
	<hex_block>
		<hex_filename>BIOS/CGROM.hex</hex_filename>
		<hex_addressing>relative</hex_addressing>
		<hex_offset>7340032</hex_offset>
		<hex_little_endian>0</hex_little_endian>
	</hex_block>
	<sof_data>
		<start_address>00000000</start_address>
		<user_name>Page_0</user_name>
		<page_flags>1</page_flags>
		<bit0>
			<sof_filename>release-F68K_DE0CV_DEMU.sof</sof_filename> 
		</bit0>
	</sof_data>
	<version>10</version>
	<create_cvp_file>0</create_cvp_file>
	<create_hps_iocsr>0</create_hps_iocsr>
	<auto_create_rpd>0</auto_create_rpd>
	<rpd_little_endian>1</rpd_little_endian>
	<options>
		<map_file>1</map_file>
	</options>
	<advanced_options>
		<ignore_epcs_id_check>2</ignore_epcs_id_check>
		<ignore_condone_check>2</ignore_condone_check>
		<plc_adjustment>0</plc_adjustment>
		<post_chain_bitstream_pad_bytes>-1</post_chain_bitstream_pad_bytes>
		<post_device_bitstream_pad_bytes>-1</post_device_bitstream_pad_bytes>
		<bitslice_pre_padding>1</bitslice_pre_padding>
	</advanced_options>
</cof>

手順2 変換の実行

Quartus Primeの「File」-「Convert Programming File」を開きます。

開いたダイアログで「Open Conversion Setup Data...」をクリックし、手順1で用意した .cof ファイルを開きます。すると、以下のような状態になるかと思います。

ダイアログの詳細

上記画像は「Advanced..」ボタンを押した状態です。このダイアログで「Disable EPCS/EPCQ ID Check」が黒くなっているのを確認してください。

確認したら親ダイアログで「Generate」ボタンを押せば .pof ファイルが生成されます。

実機への書き込み編

.pofファイルの書き込み

DE0-CVの左側にあるスイッチを Run から Prog に変更して電源を入れます(電源を入れ直します)。すると、基板が書き込みモードになります。

DE0-CVに付属のUSBケーブルを接続して Windowsに接続すると、USB-BlasterというUSB機器が認識されます。(初めて使用する場合はUSBドライバを入れる必要があるかも?)

本来、Intel(Altera)のFPGAやコンフィギュレーションフラッシュROMを扱うためには、純正の USB-Blasterという何万円もするケーブルが必要です。しかし、DE0-CVは基板上に USB-Blaster相当の回路を最初から持っているため、USBケーブルで接続するだけでFPGAやフラッシュROMの読み書きができてしまいます(便利!)。

準備ができたら、Quartus Primeの「Tools」-「Programmer」メニューから Programmerを起動し、以下の準備を行います。

  • Programmerの「Hardware Setup...」を押して、USB-Blasterを選択します。
    • USB-Blasterが選択肢に出てこない場合は、DE0-CVを認識していません。DE0-CVのスイッチが Progになっているか、電源が入っているか、USBケーブルがきちんと接続されているか、USB-Blasterのデバイスドライバがきちんとロードされているかなどを確認してください。
  • Programmerの「Mode」を「JTAG」から「Active Serial Programming」に変更します
    • 変更すると、今設定されているデバイス一覧を全て消すか?と聞かれます。これは画面上に出ている構成を作り直すという話なのでOKします。
  • Programmerの中身が空になっているので、「Add File...」を押して、先ほど作成した .pof ファイルを選択します。
  • 「Program/Configure」の列にあるチェックボックスを全てONにして「Start」ボタンを押します。
  • 数分で書き込みが終わります

Programmer

動作確認編

Programmerの書き込みが 100%になったら書き込み終了です。DE0-CVの電源を切り、スイッチを「Prog」から「Run」にもどし、VGA端子にモニタを繋ぎ、PS/2ポートにキーボードを接続して電源を入れます。うまくいけば「エラーが発生しました」という X68000の表示が出てくるはずです。

仮想FDDの接続

「エラーが発生しました」と出てしまうのは、このX68000にFDDが接続されていないためです。X68000のIPLは2台のFDDが接続されていないとエラーになって起動できないのです。

今回ビルドしたのは「ディスクエミュレーション」機能のついたF68kですので。これを使って仮想ドライブを接続してみます。DE0-CVの手前に10個並んだスライドスイッチのうち、右から2つ目を奥にスライドすると、VGAの画面が切り替わって、「SD CARD DISK EMULATION UTILITY」が表示されます。こちらはキーボード で操作できます。

これを利用するためには、2GB以下の容量のmicro SDカードが必要です。micro SDは WindowsなどでFAT(32)フォーマットしてください。用意できたら.d88形式に変換したディスクイメージをSDカードに書き込み、再度 DE0-CVの電源を入れ直します。

僕はあらかじめFDX68を使って.FDX形式として取り込んでおいたディスクイメージを使い、ラズパイ上で、

> fdxconv -i Human68k-System.fdx -o Human68k-System.d88

として d88形式に変換しました。こちらの一連のツイートもご参照ください。

Human68kの起動

DE0-CVの電源を入れたらスイッチを切り替えて、SD CARD DISK EMULATION UTILITYにします。

  • FDD 0 に Human68k-System.d88
  • FDD 1 に NEWで作ったブランクディスク

をセットしましょう。

画面の下に黄色いバーが出てきて、1-2分ほどするとディスクイメージの読み込みが終わります。(ディスクエミュレーションは事前に変換を行うので、ロードにちょっと時間がかかるそうです)

読み終わったらカーソルを一番下に持っていって「SAVE」しておけば、次回電源投入時も同じ構成で起動させることができます。

DE0-CVのスライドスイッチを元に戻し、基板右下のリセットボタンを押すと X68000が再起動し Human68kが起動すると思います。