goo blog サービス終了のお知らせ 

組み込まれたエンジニア

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

LiveCygwinのRCX C++環境

2009-03-11 02:28:33 | Weblog
今日は久々に米国在住のM氏と会話できた。
その中で、LiveCygwinを教育用に使っていただいたという報告があった。
ただ、RCX向けのC++環境が実働しなかったので、コンパイラを入れ換えたということだ。(↓ 私が試したら動いた)

RCXは自分では、Cでしか動作確認しておらず、C++が動作しないことに気がつかなかった。早めに対処したいが、しばらくは多忙のため、対応不可。


追記

RCXを利用できる環境があったので、試してみたが、動くじゃないかぁ…
彼は何をやったら動かなかったのだろう?

もっとも、brickOSの推奨環境のgccバージョンは古いので、このバージョンで動作しないような記述をしていたら当然動かないのだが…?

追記の追記

M氏から返信が来て、やはり小さなプログラムはOKだったが、大きなものがNGとのこと。どうやら、RCXのメモリには入らないような大きさのものだったのでは?
という結論になりそうだ。コンパイラをバージョンアップしたことで、生成コードが若干小さくなって、ぎりぎりNGがぎりぎりOKになる境界だった可能性大。

SFL拡張書式の追加

2009-03-07 18:11:17 | Weblog
sfl2vlにSFLの拡張書式を追加した。
今回の追加は、par文とrelay文に関するもの。

まず、par文は並列動作を記述するための構文だけれど、ハードウェアは基本が並列であり、特に断わりない限り、物事は並列に動作する。そこで、「par」を省略可としてみた。

次に、ステージ中の、他タスクの呼び出しには、relayやgenerateを使うが、こちらも、ほとんどのケースで、relayしか使う必要がないことから、もっと見た目に綺麗な書式にしたいと思っていた。今回、「relay」を省略可能にしてみた。

これらの省略形を用いると、先日のm8のアドレスモードデコードのステージは、↓のようになる。

 stage decode {
   any {
   OPR_IMM: { exec.run(mr(pc).i);
              pc := alu.exe(ADD, pc, 0x01).o;}
   OPR_MEM: { memory.run(mr(pc).i);
              pc := alu.exe(ADD, pc, 0x01).o;}
   OPR_PC : exec.run(pc);
   OPR_ACC: exec.run(acc);
   OPR_ZER: exec.run(0x00);
   }
 }


主観だが、かなりすっきりして、気持ち良くなったと思う。

20090307版からのベータ版でのサポートとなる


3/11追記

generateだけ残るのは気持ち悪いので、generateかrelayなのかをツール側で判定するようにして、generateも省略可能とした。
ステージ中では、基本としてrelay扱いとなり、ステージ外では、generateと扱う。

上に絡むが、instrselfとinstroutは、起動しない時には0を保証するので、同時ONのチェック対象外とした。relayを同時に複数のステージに発行する時、ステージのリセット信号でハザードが発生していたのを抑止。
この結果、これらの信号は設計者のチェックに任せるので、多少気を付けないといけない。

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でコンパイルできる環境を整えてもらえるように、お願いしてみようかな。