組み込まれたエンジニア

我輩は石である。名前はまだ無い。

8bit 小型CPU

2009-02-28 08:28:19 | Weblog
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でサブルーチンができても仕方ないだろうという突っ込みどころ満載であるが、それはそれとして… :-)

i8086のコンパイラ

2009-02-24 15:14:46 | Weblog
デモ用の記述を整理している時に、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でも、充分使い道はあるので、悩み所。

レジスタの初期値

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

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


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;


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

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

データ端子の競合検出

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

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

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

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

2009-02-16 13:24:54 | Weblog
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ロボコン参加者の皆さん、がんばりましょう♪


Midway-8080 game platform

2009-02-15 23:35:29 | Weblog
もう五年以上前の話になるが、(株)タイトーのご好意で、スペースインベーダのプログラム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.

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

2009-02-14 13:18:16 | Weblog
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ファイルダンプ機能を使って確認ずみ。

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

sfl2vlプリプロセッサの変更

2009-02-14 07:51:31 | Weblog
バレンタインにちなんで(?)、プリプロセッサに機能追加した。

%ifdef
%else
%endif

が、Cのプリプロセッサ同様に動作する。
それと、識別子中に、

abc%XX%def


と書くことで、マクロ定義した、XXを識別子の一部として認識させる。

ついでに、コメントのネストも動くようにした(はず)。

変更後のパッケージは、
次にある。

http://www.ip-arch.jp/sfl2vl.html

追記:電車の中であるが、ふと、ifdefがあって、ifndefがないのはどうよと思い、ifndefを追加した。上書きしたので、上のURLはそのまま。バタバタしていて、今回の機能はほとんど確認が取れていないので、上のパッケージは正式リリースではないことに注意。


もう一つついでに、SFL構文で使う数字に+/-で定数を付加することを許す。
%d N 10

module test_%N% {
 input a<N> ;
 output f<N-1> ;

 f=a<N-2:0> ;
 }

のような使い方を許すことで、ライブラリ化に便利となる(はず)。

6502コードジェネレータ改良

2009-02-11 01:52:55 | Weblog
lburgの記述のマッチングパターンを増やし、コスト関数を工夫して、生成するコードの改良を図る。もちろん、まだ、ピープホール最適化をしているわけではないので、無駄なコードは出るのであるが、パターンマッチで最適化できる最低限のことはコンパイラの初期生成時に行なっておく方が結果が良いはずなのだ。

先日の、8クイーン問題のコンパイラ出力リスト(の一部)を下記に示す。
先日のコードより、2割程、生成するコードの大きさが小さく、よい感じになってきつつある。

0448   06AD C8          	INY
0449   06AE 91 F6       	STA (R3),Y
0450   06B0             ;INDIRI2
0451   06B0 BA          	TSX
0452   06B1 BD 03 01    	LDA $101+2,X
0453   06B4 85 F6       	STA R3
0454   06B6 BD 04 01    	LDA $102+2,X
0455   06B9 85 F7       	STA R3+1
0456   06BB             ;LSHI2
0457   06BB 06 F6       	ASL R3
0458   06BD 26 F7       	ROL  R3+1
0459   06BF             ;ADDP2 
0460   06BF 18          	CLC
0461   06C0 A5 F6       	LDA R3
0462   06C2 69 3B       	ADC #x & 255
0463   06C4 85 F6       	STA R3
0464   06C6 A5 F7       	LDA R3+1
0465   06C8 69 09       	ADC #x>>8
0466   06CA 85 F7       	STA R3+1
0467   06CC             ;INDIRI2
0468   06CC A0 00       	LDY #0
0469   06CE B1 F8       	LDA (R4),Y

Herbプロジェクト

2009-02-10 22:08:37 | Weblog
VHDL EDAツールセットのAllianceを整理・拡張しようという
Herbプロジェクト
のMukundさんから、以前作成していたAlliance関連のチュートリアル資料の利用を打診してきた。

Allianceをきれいにしてもらえるのは大歓迎なので、さっそくOKを出したついでに、関連すると思われる他のチュートリアル資料も提示しておいた。
(といっても、全部、日本語なんですが…)

Mukundさんは、MOTIFを使っていたAllianceのGUIをGTKに置き換えようとしている。gtkならWindows版もあるので、ライブCDへの統合の可能性もある。Windowsでコンパイルできる環境を整えてもらえるように、お願いしてみようかな。

MSの問題?

2009-02-09 19:49:52 | Weblog
Apple-I互換機のSFLの展開がうまくいかない人がいたので、チェックしていたが、どうやら、USBメモリ上だと展開に失敗するらしい。

とりあえず、HDDにファイルを移動してから展開してもらったが、OSの問題か、マイクロソフトのコンパイラの問題か、区別が付かない。

職場ではなんともならないので、家に帰ってから、USBメモリを使って確かめてみよう。

HDDに持ってきたら無事に動作したので、ソースファイル自体には問題がないはず。


追記:
家に帰ってから、実験すると、確かに再現した。
だが、原因が分からない。
プログラムでは、CreateProcessで二つのプログラムをパイプで接続して起動して、その後ろ側のプログラムが書きこみを行なっている。だけれど、USBメモリ「だけ」書き込みが失敗する理由が分からない。しかも、再現性が悪い。何度か試していると書けたりするのだ。同じことを手動でプログラムを立ち上げても発生しないし、原因追求には時間がかかりそう…

Apple-I互換機で、8 queenを解く

2009-02-08 21:30:36 | Weblog
昨日、LCCの6502ターゲット記述を作成したので、LCCのテスト例題に入っている8Queenプログラムをコンパイルして、Apple-I互換機のシミュレーション環境でシミュレーション実行し、動作を確認した。(無事に動いたので、この後で、FPGA上でも実験するつもり)

再帰プログラムである8q.cも無事動作し、6502ターゲットの基本動作仕様には問題なさそうだ。

出力は、PCでの実行結果と比較し(といっても長いので、数行だけ)、正しい結果となっていることを確認した。


PC:0862 OP:65 F:00100000 A:0A X:F0 Y:F0 S:E5 ad:0862 o:00 i:85
PC:0863 OP:85 F:00100000 A:0A X:F0 Y:F0 S:E5 ad:0863 o:00 i:F7
PC:0863 OP:85 F:00100000 A:0A X:F0 Y:F0 S:E5 ad:00F7 o:0A i:00
PC:0864 OP:85 F:00100000 A:0A X:F0 Y:F0 S:E5 ad:0864 o:00 i:A0
PC:0865 OP:A0 F:00100000 A:0A X:F0 Y:F0 S:E5 ad:0865 o:00 i:00
PC:0866 OP:A0 F:00100010 A:0A X:F0 Y:00 S:E5 ad:0866 o:00 i:A5
PC:0867 OP:A5 F:00100010 A:0A X:F0 Y:00 S:E5 ad:0867 o:00 i:F2
PC:0867 OP:A5 F:00100010 A:0A X:F0 Y:00 S:E5 ad:00F2 o:00 i:01
PC:0868 OP:A5 F:00100000 A:01 X:F0 Y:00 S:E5 ad:0868 o:00 i:91
PC:0869 OP:91 F:00100000 A:01 X:F0 Y:00 S:E5 ad:0869 o:00 i:F6
PC:0869 OP:91 F:00100000 A:01 X:F0 Y:00 S:E5 ad:00F6 o:00 i:E1
PC:0869 OP:91 F:00100000 A:01 X:F0 Y:00 S:E5 ad:00F7 o:00 i:0A
PC:0869 OP:91 F:00100000 A:01 X:F0 Y:00 S:E5 ad:0AE1 o:01 i:00
PC:086A OP:91 F:00100000 A:01 X:F0 Y:00 S:E5 ad:086A o:00 i:A5
PC:086B OP:A5 F:00100000 A:01 X:F0 Y:00 S:E5 ad:086B o:00 i:F3
PC:086B OP:A5 F:00100000 A:01 X:F0 Y:00 S:E5 ad:00F3 o:00 i:00
PC:086C OP:A5 F:00100010 A:00 X:F0 Y:00 S:E5 ad:086C o:00 i:C8
PC:086D OP:C8 F:00100010 A:00 X:F0 Y:00 S:E5 ad:086D o:00 i:00
PC:086D OP:C8 F:00100000 A:00 X:F0 Y:01 S:E5 ad:086D o:00 i:91
---- OUTPUTS ------>

300R

0300: A2
15863724
16837425
17468253
17582463
24683175
25713864
25741863
26174835
26831475





追記:
改行コードを間違ったり、XilinxISEの設定不良や、Wozモニタの仕様(出力文字は、MSBに1を立てないと表示しない)などで、少々手間取ったが、FPGAボードでの動作も確認できた。(画像参照)


ANSI Cコンパイラ LCCの6502ターゲット開発

2009-02-07 13:49:58 | Weblog
Apple-I互換システムで使うため、LCCの6502ターゲットを開発中。

検索するとlcc65というプロジェクトが見つかるのだが、ソースはないし、特定機種限定の開発になっているらしいので、スクラッチ開発することにした。

以下、テストプログラムのコンパイル結果をTASMでアセンブルしたリストである。
まだ、アセンブラが通るレベルというだけで、詳細の確認はこれからだが、なんとなく、6502っぽいコードになっているかな?

疑似レジスタとして、ゼロページの16バイトを用意したが、コンパイラの出力を見る限り、16バイトもいらなかったかも?もう少し整理してから、最終的に結論を出そう。



0056   0349 B1 FA               LDA (R5),Y
0057   034B 85 F6               STA R3
0058   034D C8                  INY
0059   034E B1 FA               LDA (R5),Y
0060   0350 85 F7               STA R3+1
0061   0352             ;ASGNI2 laddr
0062   0352 A0 02               LDY #2
0063   0354 A5 F6               LDA R3
0064   0356 91 F8               STA (R4),Y
0065   0358 A5 F7               LDA R3+1
0066   035A C8                  INY
0067   035B 91 F8               STA (R4),Y
0068   035D             ;SUBI2 reg acon
0069   035D 38                  SEC
0070   035E A5 F6               LDA R3
0071   0360 E9 01               SBC # $FF & 1
0072   0362 85 F4               STA R2
0073   0364 A5 F7               LDA R3+1
0074   0366 E9 00               SBC # 1 >> 8
0075   0368 85 F5               STA R2+1
0076   036A             ;ARGI2 reg
0077   036A A5 F5               LDA R2+1
0078   036C 48                  PHA
0079   036D A5 F4               LDA R2
0080   036F 48                  PHA
0081   0370             ;CALLI2 acon hasargs
0082   0370 20 FB 02            JSR foo
0083   0373 A2 02               LDX #2
0084   0375 68                  PLA
0085   0376 CA                  DEX
0086   0377 D0 FC               BNE *-2
0087   0379             ;LOADI2 reg
0088   0379 A5 F0               LDA R0
0089   037B 85 F6               STA R3
0090   037D A5 F1               LDA R0+1
0091   037F 85 F7               STA R3+1

LEGO MINDSTORMS NXT向けのLiveCygwin

2009-02-05 17:20:53 | Weblog
nxtOSEKプロジェクトの現時点での最新版にあわせて、LiveCygwinをアップデートした。

http://www.ip-arch.jp/LiveCygwin-nxtOSEK.zip

より、nxtOSEKを含む、LiveCygwinをダウンロード可能だ。

このアーカイブを、スペースの入らないパスに展開し、
そのアーカイブの中の
startup.bat
をダブルクリックすることで、Cygwin環境が立ち上がり、LiveCygwinというコンソール画面が出てくる。(初回は、nxtOSEKを展開するので、多少時間がかかる)
ここで、
cd nxtOSEK/samples/helloworld
make all
で、NXTにダウンロードファイル群ができる。具体的な利用方法は
nxtOSEKのサイトを参照のこと。

上のサイトに出てくる、拡張ファームウェアと、NXTTOOLは、Cygwinの/usr/nxttoolに置いている。

これ以外に、LEGO MINDSTORMSのドライバをインストールする必要があるが、それは、LEGOのページを参照して欲しい。