アダルト・ヴァイオリン May the force be with you..

2009年2月28日

8bit 小型CPU

Filed under: Weblog — い~ぐる @ 8:28 AM

SFLの演習例題として、8bitの小型CPU m8を作ってみた。

XilinxのFPGAにマッピングすると、CPUだけなら、100スライス程度で実現できる。

命令数12個と、機能は最小限に絞り込んだが、アドレッシングモードに特徴を持たせて、おもしろい使い方ができる。用意したアドレッシンッグモードは↓の5つ。

1 即値 OPコードに続く1バイトをデータとして演算
2 PC プログラムカウンタをデータとして演算
3 ACC Accをデータとして演算
4 zero 値0をデータとして演算
5 メモリ OPコードに続く1バイトをアドレスとするメモリ内容をデータとして演算

命令は、OPコードの上位4ビットで区分けして、↓の12個となる。

0:ADD add
1:SUB subtract
2:AND logical and
3:OR logical or
4:XOR logical xor
5:NOT not
6:SLT set less than
7:MOV move to acc
8:BEQ branch when acc==0
9:JMP jump
A:LOD load from memory
B:STO store to memory

サブルーチン呼び出し命令はないれど、アドレッシングモードを組み合わせると、メモリ上に作ったスタックエリアにPCを格納した上で、サブルーチン呼び出しができる。(もちろん、スタックでなく、固定番地に戻りアドレスを格納するならもっと簡単な手順にできる)

lod #stack
sub #1
sto #stack ; スタックポインタ -1

mov pc
add #4
sto $stack
jmp foo ; fooを呼び出し

サブルーチンリターンは、

lod $stack
jmp acc

でいい。(もちろん、これで戻ると、戻り先で、スタックの調整が必要なのは、言うまでもない)

こんな小さな、CPUでサブルーチンができても仕方ないだろうという突っ込みどころ満載であるが、それはそれとして… 🙂

2009年2月27日

迷惑コメント

ブログには、時々、アダルトサイトなどへの誘導を目的とした迷惑コメントが付くことがある。夕べ、バイオリンのブログにこの手のコメントが付いていたので、
1) 接続ホスト情報
2) 接続時刻
3) コメント内容
を、ホストを管理するプロバイダに連絡しておいた。
今日になって、下記のメールのように、コメントを付けた奴の回線をNTTから切ってもらったということだ。
もぐら叩きではあるが、こうやって、一人一人が地道に対策していくのが、結果的には、早いのではないかと思っている。

ご連絡頂きましてありがとうございました。
不正書き込みでご迷惑をお掛け致しました事、心よりお詫び申し上げます。
また、ご返事まで時間が掛かりました事を重ねてお詫び申し上げます。
早速ご連絡いただきました情報から調査致しました結果、該当者は
弊社とローミング契約をしたISPの関係者である事が判明致しました。
この場合、弊社にはISPの関係者情報がなく該当者の特定ができません
ので、当該ISPに対して早急に対応するよう 要請を致しました。
要請の結果、当該ISPから「アカウント停止措置」を行なったとの回答を
受けておりました。
しかしながら、当該関係者がログインを中止しないため、NTT局に対し
「回線の切断」を依頼しておりましたが、NTTから回線の切断が完了
したとの報告がございました。

2009年2月24日

i8086のコンパイラ

Filed under: Weblog — い~ぐる @ 3:14 PM

デモ用の記述を整理している時に、i8086のコンパイラを探したが、オープンソースのコンパイラでは、i8086向けのものはあまりない。いくつかのサイトを見ていると、旧ボーランドが、古いソフトをパーソナルユース向けに無償でダウンロードできるようにしているらしい。

Turbo C 2.01

がとりあえず目についたが、ふと、サイトを散策すると、

Turbo Pascal 1.0

なんてのも見つかる。おお!懐しい!。

実は、Turbo Pascalのこの初期のころのバージョンは私は大好きだったのだ。
あっという間に完了するコンパイル、エティタと統合された開発環境、値段の安さ等、当時のコンパイラの常識を引っくり返した優れものだった。
これには、いくらか秘密があり、高速コンパイルの一番の理由は、固定番地のライブラリルーチンにあったと思う。(もちろん、Pascalの言語仕様も貢献しているが…)

独立したツールを作ることを考えると、固定されたライブラリ(10kBくらいだったか?)が、当時の小さなフロッピー容量を圧迫したが、それにも代えがたいありがたいツールであった。

おそらく、世界中のPascalユーザ数増加に大きな役割を果したと思う、このソフト、今でも、簡単なプログラム練習用には、充分通用するのでは?

追記:

さて、i8086命令互換CPUのバスタイミングを整理して、BIUをきれいにしたので、シリアルコントローラやRAMを接続して、FPGAに載せてみようと作業をしてみた。

が、手持ちのボードには、若干入らなかった(;-p)。

レジスタファイルや演算回りを整理すれば、まだかなり論理を圧縮できそうだけれど、i8086としては、2000スライスで実現できているのは、小さい方かも?
論理を削る作業は棚上げして、他のボードを調達するか…

Device utilization summary:
---------------------------
Selected Device : 3s200ft256-5
Number of Slices:                     2008  out of   1920   104% (*)
Number of Slice Flip Flops:            614  out of   3840    15%
Number of 4 input LUTs:               3882  out of   3840   101% (*)
Number of IOs:                          42
Number of bonded IOBs:                  37  out of    173    21%
Number of BRAMs:                         8  out of     12    66%
Number of GCLKs:                         1  out of      8    12%
Number of DCMs:                          1  out of      4    25%

ちなみに、HD-LAB社の商用IP8086コアで、2300スライスなので、大きさ的には、こんなものかもしれない。今回、ISEが報告した周波数が非常に低い(10MHz)ので、長いパスを見直して、周波数アップを図った方がよさそうだが、そこまでやるか…?
10MHzでも、充分使い道はあるので、悩み所。

わが家の緑たち

Filed under: 日記 — い~ぐる @ 7:24 AM

ちっとも葉の増えない、色白ポトス君に加えて、昨夜、もう一つ緑が増えた。青々と元気に育ってくれるかな?R0010405.JPG

2009年2月22日

レジスタの初期値

Filed under: Weblog — い~ぐる @ 11:15 AM

以前、SFLの話をある人にした時に、
「SFLでは、レジスタの初期値を自由に設定できますか?」
と聞かれ、現状の仕様では、セットとリセットしかないと答えたら、それでは使えないというような反応が来たことがある。
論理設計の0.1%にもみたないような僅かな仕様で、採否を決めようとするのは、不思議だが、恐らく、採用しない理由が欲かったのだろう。

ということで、sfl2vlでは、初期値を自由に設定できるようにした。
ついでに、定数にビット幅の重みを明示的に持たせられるようにする。
(10進定数を新たに定義したので、幅を持たない整数値の回路中での扱いを変更した)。

定数の変更だが、Verilog風に、
整数’定数
で、整数ビットの定数値を作る。
定数プリフィックスには、0b, 0o, 0x などの従来の定数の他、10進定数 0dを定義した。

また、レジスタの宣言において、初期値を明示的に設定できるようにした。

module t {
reg a<8>=0x80, b<8>=8'0d5, c<8>;
c:=a+b;
}

のような記述を許している。

sfl2vlの20090222版からのサポートとなる(ベータ版扱い)。

2009年2月17日

スペースインベーダー起動

Filed under: Weblog — い~ぐる @ 1:26 PM


回路的には間違っていないし、シミュレーションでは動作しているのに、実機で動作していなかったMidway-8080であるが、問題は、メモリの初期化のためのBMMファイルにあった。BMMファイルには、ビットレーンを記述するので、下記のように記述したが、実は、XilinxのISEはビットレーン情報はビット数を計算するためだけに使っていて、値は見ていない。data2memで確認すると、全くの逆順にデータが格納されていた(!)。

そこで、BMMファイルに記述するビットレーンを逆順にしたら動きだした。
(画面にゴミが見えるのは、VRAMを256×240に設定しているからであり、インベーダーの解像度、256×224に合わせればゴミは消える)

ADDRESS_SPACE rom8k RAMB16 [0x0000:0x1fff]
BUS_BLOCK
board/rom/Mram_ram1 [1:0];
board/rom/Mram_ram2 [3:2];
board/rom/Mram_ram3 [5:4];
board/rom/Mram_ram4 [7:6];
END_BUS_BLOCK;
END_ADDRESS_SPACE;

蓋を開けてみれば、こんなことだ(笑)

これにデジタル処理の音声回路を付けたら完成だ♪
ただ、このボードには標準では音声の出力コネクタがないので、どこのピンに出すべきか…

データ端子の競合検出

Filed under: Weblog — い~ぐる @ 9:25 AM

SFL2VLでは、データ端子に同時に複数の代入が生じた場合に、競合の検出を行なうようなVerilogコードを出していたが、疑似検出が多くあまり便利ではなかったので、コードを整理して、修正した。

20090217のベータ版のみでの対応だが、かなり効率的に競合の検出ができている(ような気がする)。

次のステップは、どの端子同士が競合を起しているかを出力するべきかどうかだが、競合発生時に、シミュレーションストップさせないと、出力が膨大になるので、対応を検討中。それと、合成された中間信号名で出力しても、分りにくいだろうしね~

2009年2月16日

ETロボコン 2009 LEGO MINDSTORMS NXT 開発環境

Filed under: Weblog — い~ぐる @ 1:24 PM

ZIPファイルをハードディスクに展開するだけで、開発環境一式が揃うLiveCygwinに、nxtOSEKを搭載した、LiveCygwin-nxtOSEKを作成していたが、ETロボコンの推奨開発環境とツールのバージョンを合わせて、そのままETロボコンの開発環境として、利用可能とした。

私はETロボコンの技術委員だけれど、この環境自体は、ロボコンの公式環境ではなく、サービスとして提供するものであることに注意

自分の手持ちのLEGO NXTで動作確認を行ない正常動作を確認している。
ちなみに、LiveCygwinはCygwin環境がすでに構築されていても、同時起動しない限り、バッティングしないので、安心して試されたし。同時に動かしておかしくなった時には、再起動をおすすめ。

サンプルのHello Worldを実行するまでの手順は、以下になる。

0. LiveCygwin起動 (上のファイルを展開して、startup.batを実行)

1. NextToolでNXTファームウェアをインストール
NXTの裏のリセットボタンをピンの先で5秒程度押し、ファームウェアアップデートモードにする。(小さくクリック音が聞こえてくる状態)
PCを接続し、

cd /usr/nxttool/
./NeXTTool /COM=usb -firmware=lms_arm_nbcnxc_106.rfw

しばらくすると完了。一旦、NXTの電池を抜いて、NXTを再起動する。

2. helloworld例題のコンパイル

cd /home/nxtOSEK/samples/helloworld
make all

3. 実行ファイルダウンロード

sh rxeflash.sh

4: 実行

NXTの赤いボタンを押して、ダウンロードソフトを実行する。

それでは、ETロボコン参加者の皆さん、がんばりましょう♪

2009年2月15日

Midway-8080 game platform

Filed under: Weblog — い~ぐる @ 11:35 PM


もう五年以上前の話になるが、(株)タイトーのご好意で、スペースインベーダのプログラムROMを教育用に提供していただいた。その時は、Midway game platformをFPGA上に実現し、もともとアナログ回路で実現していた効果音も、FPGA上で1ビットデジタル処理によるオリジナルDSP処理で出していた。使用したCPUは私が書下した8080A命令互換CPUである。

この時は、Midwayでは、白黒出力で、画面に色テープを張ってカラー表示していたところを、我々は、画面の場所ごとに、色を変えることで対応した。
SRAM/ROMには、汎用品を用い、画面出力は、NTSCカラーとして出していた。

昔の成果物を例題として、整理しようと考えていて、これらをFPGAの内部RAMとVGA出力に変更している。
CPUとVGA他の周辺回路を載せた状態の合成結果を下記に示す。
ゲート的にはまだまだ余裕がある。

Device utilization summary:
---------------------------
Selected Device : 3s200ft256-5
Number of Slices:                      666  out of   1920    34%
Number of Slice Flip Flops:            279  out of   3840     7%
Number of 4 input LUTs:               1279  out of   3840    33%
Number of IOs:                          42
Number of bonded IOBs:                  34  out of    173    19%
Number of BRAMs:                         8  out of     12    66%
Number of GCLKs:                         1  out of      8    12%
Number of DCMs:                          1  out of      4    25%

まだ、音声は載せていないが、Verilatorでシミュレーションして、VRAMの中身をダンプして、正常動作を確認した。

FPGAにダウンロードするのは、これからだが、現状のシミュレーション画面を表示しておこう。

本画像のキャラクタの著作権は、(株)タイトーにある。

Copyright 1978 TAITO Corporation.
All rights reserved.

2009年2月14日

ISEに二つのメモリの初期化をさせる

Filed under: Weblog — い~ぐる @ 1:18 PM

Apple-I互換システムでは、WozのモニタとキャラクタジェネレータROMの二つのメモリを初期化したかったというのは、前に書いた。これらの内容は、bitファイルを作成した後から、自由に書き換えられると便利なので、合成前のソースではなく、bmmファイルとmemファイルから勝手に初期化する方法を模索していた。

ところが、ISEの標準パスでは、memファイルは一つしか許されないということらしい。(二つを指定した時には文句を言われなかったのに、二つ目を新規作成しようとしたら、メッセージが出てきた)。

とういうことで、方針としては、二つのメモリを一つとして扱い、一気に初期化してしまうことに決めた。

Apple-Iシステムのメモリマップと、data2memの認識するメモリマップを一致させる必要は全くないので、モニタROMのBRAMを 0x000-0x7FFに設置し、VRAMを0x800-0xFFFとする。こうしておいて、memファイルの、CGパターンの始まる所に、アドレス指定記述を置く。

シリアルケーブルを持ってこなかったり、独立して使えるVGAモニタが東京の職場にはなかったりするので、実機での確認はできないが、bitファイルは正しく生成されていることをdata2memのbitファイルダンプ機能を使って確認ずみ。

分ってしまえば、なぁんだということは多い。
(でも、説明書にもう少し書くか、エラーメッセージくらい出せよと言っておこう)

Older Posts »

Powered by WordPress