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

組み込まれたエンジニア

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

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のページを参照して欲しい。

独自CPU向けにANSI Cコンパイラを移植

2009-02-02 10:46:13 | Weblog
専門職大学院の学生達のプロジェクトで、彼等の独自アーキテクチャのCPUに彼等がANSI C(LCC)を移植していたが、これの動作確認がFPGAボード上で完了した。

最後、バタバタしたが、私が担当したアセンブラのバグが数件足を引っぱって、プロジェクトの発表時に実機デモができなかったのが、申し訳なかった。

動作確認は、Cで記述したデバグモニタで行なった。デバグモニタ自体は、非常に簡単なもので、コマンドは、d,e,gの3つしかないが、どれも動作ができている。(私のプログラムなので、見栄えが悪いのは…だが)

VHDL対応強化

2009-01-27 21:54:56 | Weblog
やりはじめたら、中途半端に止められない性格のため、sfl2vlのVHDL対応の強化をしてしまった。(といっても、Verilog版に追い付いただけだが…)

強化点は、次の通り


  1. セレクタ最適化オプション導入
  2. メモリ合成のサポート
  3. generic/generic mapのサポート


これらの対策で、Apple-I互換機のVHDL版がXilinx社ISEの合成を通るようになった。

この回路では、最適化で、クロック周波数は約15%向上する。
これに対し、LUT数は、1.4%程多くなっている。

まぁ、いい感じのトレードオフではないかな?

VHDLが嫌いな点の追加(;-p) なぜに、奴らは、予約語をこんなに増やしたのか?
inやoutも気持ち悪いが、ror,rolなどまで予約語にしなくてもいいだろ?

このところ、毎日のように午前3時すぎまで、仕事をしていたので、さすがに少々くたびれてきた。戦士の休息が必要ですね。(まだ休むめどは立たないけれど…)

VHDLでのセレクタ最適化

2009-01-27 13:13:04 | Weblog
VHDLは構文上、プライオリティエンコーダを含むセレクタを推奨する本が多く、サンプルで見かける例にも、whenを使った、プライオリティ付セレクタ使用例が多いので、おそらく、VHDLユーザは高速回路にあまり興味がないだろうと思っている。

Verilogユーザはスピードにクリティカルなので、SFLからVerilogに変換する場合、最適化を指示すると、AND-ORによる高速セレクタを生成していた。一方、VHDLへの変換では、先の理由から、最適化を指示しても、Verilogほどの突っ込んだ最適化はせず、推奨構文を用いて、分りやすい生成しかしてこなかった。

VHDLのユーザはあまりいないので、これで問題になることもなかったし…

ところが、自分のプロジェクトで無料のレイアウトツールとして、Allianceを使おうと思うと、高速なVHDL回路が欲しくなる。もちろん、VerilogからEDIFに変換するツールを用いて、EDIF経由でレイアウトする方法もあり、以前、テストチップ作成したときには、Verilogの合成ツールを自分で書いて対応した。

だが、EDIFレベルの論理合成をライブラリの属性を見ながら最適化するツールを作るのは、無駄な気がして、あまりメンテナスしていない。

そこで、自分のプロジェクトで使うために、sfl2vhでのセレクタ最適化が可能となるようにした。

回路実装までは試していないが、完成したとしても、今まで、VHDLユーザーには、その手のリクエストはなかったので、一般公開はしなくてもいいかも?

SystemCの分割コンパイル

2009-01-24 01:53:16 | Weblog
ふと、思い出したが、SystemC(というか、C++)では、分割コンパイルする時に、インクルードするヘッダファイルに、コンストラクタを書く必要があった。

SystemCのコンストラクタは、実質内部処理を記述しており、IP記述としては、役に立たないと、その昔、仕様を読んだ時に思ったのだった。

コンストラクタまで入れたヘッダファイルは、処理部分を入れたファイルと大きさ的にも大差ないので、ファイル丸ごとインクルードという今の仕様でもいいのかも?


sfl2vl SystemCサポートβ版リリース

2009-01-23 17:38:37 | Weblog
モジュールの基本動作、状態遷移マシンの自動生成、階層モジュールの動作など、ざっとではあるが、一通りの確認ができたので、sfl2vlの SystemCサポートβ版をリリースする。 (Windows GUI版のみ)

もう少し確認を終えたら、正式リリースをする予定。

今回はざくっとSystemCのファイルを作ることが目的なので、生成コードの効率に関しては目をつぶっている。もっとも、同一 SFLからVerilogに落ちるので、論理合成に持っていきたい人はいないと踏んでのことだが。

確認のため、いくつか、SystemCのテストベンチを書いたが、SystemCは、かなり面倒だ。SystemCを用いるテストベンチの簡単な作成方法を考えないと、(私のようなオールド)ユーザに優しくない。

SystemCでシミュレーション

2009-01-22 22:03:13 | Weblog
SFLから自動生成したSystemCのコードにmainルーチンを付け、コンパイルして実行してみた。

一日忙しかったのと、本日は、体調不良のため、階層モジュールで動くかどうかはまだ試していないが、とりあえず、レジスタを含む単純なモジュールは動いている。

C++に慣れていないので、分割コンパイルがうまくいかず、mainから合成したファイルをインクルードしてしまったが、分割コンパイルの方法を調べなくては…


備忘録:
モジュール端子のバインディングでは、型をきちんと合せる必要がある。
c++だから仕方ないが、自動キャストできる場合とできない場合、あまり一貫性がないのが気持ち悪い。というか、代入の時だけかな、キャストが自動的に行なわれるのは?

SFLでのマルチビットの端子は、sc_uintにしていて、シングルビットの端子は、boolに変換したので、バインディングの受け側のシグナルも同じ型にすること。

SFLからSystemCへの変換

2009-01-22 07:10:44 | Weblog
sfl2vlに機能追加で、SystemCへの変換が可能となるようにした。(未公開)
まだ細かなチェックはしていないれど、コンパイルは通るようになった。

systemc.h へのインクルード指示を生成ソースに入れるかどうか迷っている。もちろん、インクルードがないと動かないのだけれど、自動生成で入れるべきものか、ユーザが入れるべきものか、どちらなのだろう?


CQのVerilog本に、Apple-I互換機を実装中

2009-01-21 09:56:26 | Weblog
CQの本付録のボードには、Spartan3E100が実装されているので、容量的に、Apple-I互換機が載る。もちろん、IOはあまりないので、シリアルポート、7SEG, LED, SW程度で使うのだ。

FPGAボードで学ぶVerilog HDL


拡張用に汎用IOポートのパターンがあり、これを使ってみよう。拡張ポートは16本しかないので、入出力の双方向ポートにする。方向レジスタと出力レジスタを定義し、双方向ポートを実装した。

XSTの合成レポートでは、スライス数60%程度とまずまずである。クロック周波数は少し落ちているが、これは、QFPと関係するのかな…

さて、プレース&マップしよう…として、GPIOの5ピンが実装できないエラー?
他のピンではエラーはないので、もしやと回路図確認。

このピンだけ、GPIO5ではなく、GPIN5と書かれている(!)。う~む、どうせなら全部のピンを入出力可能にしてほしかったぞ。まだFPGAには空いたピンも残っているんだから。

気を取りなおして、5番だけ入力専用に変更して、プレース&マップ。

あれ?再びエラー?DCMがどうのこうの言っている?

--------------------------------------------------------
この問題は、クロック配置ツールで各 DCM サイトのあるチップの辺が正しく識別されないことが原因で発生します。DCM を適切なサイトに制約すると、この問題を回避できます。

この問題は、Spartan-3 のすべてのファミリで発生する可能性があります。

この問題は、最新版の 10.1 サービス パックで修正されています。サービス パックは次のサイトから入手できます。
http://japan.xilinx.com/xlnx/xil_sw_updates_home.jsp
この修正は、10.1 サービス パック 1 以降に含まれます。
--------------------------------------------------------

おぃ…


追記:

長い時間をかけて、サービスパックをダウンロードしインストールしたけれど、結局、エラーは直らない。
しかたないので、次の行をUCFに挿入。

NET "m_clock" CLOCK_DEDICATED_ROUTE = FALSE;
PIN "dcm_2.CLKIN" CLOCK_DEDICATED_ROUTE = FALSE;

DCMを使わなければいいんだけれどね~

クロックが低く見えるのは、遅延のフォルトパスの問題だった。

とりあえず、これで合成できたが、残る問題は私はパラレルポートのあるPCを持っていないので、このボードにはダウンロードできない(;-p)

80MHzの6502

2009-01-20 00:24:52 | Weblog
お正月に開発したAISoCは、Apple-I互換機と言っているが、互換なのは、キーボードとモニタのIOポートの仕様(アドレスとデータのビットマップ)だけであり、それ以外はまるっきり無関係である。

そもそも、その頃には存在していなかったIOもかなり搭載している

こいつのCPUは、自分で開発した6502互換CPUであり、論理回路はすべてフルスクラッチで自分で書いたものだ。


今日、VRAMを2ポートに変更したついでに、変更後のXilinxの合成結果を眺めていて、ふと、クロック周波数の上限が、80MHzとなっていることに気が付く。


Timing Summary:
---------------
Speed Grade: -5

Minimum period: 12.457ns (Maximum Frequency: 80.274MHz)
Minimum input arrival time before clock: 7.711ns
Maximum output required time after clock: 9.172ns
Maximum combinational path delay: No path found


AISoCは、この周波数で実際に動かしているのでなくスターターキットの50MHzのクロックをDCMで4分周した12.5MHzで動作させているのだが、それにしても、80MHzである。 あのApple-IやApple-IIが80MHzで動作していたら、IBM PCなど束になってもかなわないスピードでプログラムが動作するだろう♪

低価格FPGAもあなどれない。

Apple-I互換機、画面出力ハード完成

2009-01-18 00:10:26 | Weblog
キャラクタジェネレータ経由で画面に文字を表示するハードウェアは完成だ。
とりあえず、フォントではなく、適当なパターンをキャラクタに設定してみる。

1400: 18 66 99 A9 A5 24 42 81

VRAMは0番目に1を設定し、それ以外は0のままとしている状態で、キャラジェネに上の設定をする。

と、画面の左上だけブランクで、それ以外に同じパターンが展開される(!)。
狙いは、左上だけに表示するつもりだったが、キャラジェネの設定のアドレスを間違えて、0番目のフォントデータとして、絵を描いてしまったのだ。

追記:ちょっと、まぎらわしいが、要するに、ハードには問題がないということだ。単に、私がキャラクジェネレータにデータを書き込むアドレスを8バイトずらしてしまっただけ。

8×8のパターンを目一杯記述しているので、隣同士がくっついているが、ビットマップが表示されていることが分る。

今回から、Spartan3 Starter KitとSpartan3E Starter Kitのアーカイブを統合した。