2001-12-28

Springboardモジュールを自作する

 

ヒューマンデータさんの通販で、XILINX CoolRunner(XCR3064XL-10PC44C)を購入できることを知り、試しに5個注文してみました。早速以前からやってみたかった自作Springboardに挑戦です。フラットな石が欲しいとか、綺麗な基板が欲しいとか、格好いいケースが欲しいとか、そういうことは後回しにして、とりあえず空中配線で無理矢理動かしてみます。

資材調達

XILINX社のCoolRunnerシリーズは消費電力がとても少ないので、バッテリー駆動の機器を作るのに最適です。これでVisor用Springboardモジュールを作ります。

TaleLight
CoolRunner

市販のSpringboardモジュールの中でもっとも貧弱といってもいいTaleLightを分解します。これはケースを開けてみると、上の写真の通り実にふざけた商品で、こんな物に4480円という値段を付ける神経はどうかしていると思います。とはいえ、店頭実売2200円でくらい購入できましたので、実験用のケースと考えれば、ぎりぎり許容できる値段でしょうか。もっとも、原価は500円もかかってなさそうに見えます。

設計

Springboardコネクタからは、アドレス24本、データ16本、その他、制御信号が約10本ほど出ていますが、今回使ったXCR3064XL-10PC44Cでは、入出力に使えるピンが足りないので、アドレスは4本、データは8本しかつながないことにします。そして、外部とのやりとりに8ビットとします。それでも、お遊び用パラレルポートとしてはじゅうぶんです。

LED点灯
混沌とした風景

上の写真でXCR3064XLの29番ピンをGNDにつないでいますが、これは間違いで、正しくは30番ピンをGNDにつながなければいけません。動作に支障があるような問題ではありませんが、この写真のとおりに作るとちょっとまずいです。

0.635mm間隔のピンにウレタン線で配線するのも憂鬱だけど、CPLDに空中配線するのも憂鬱です。

CPLDでLEDを直接ドライブしていますが、大電流は流せないので、高輝度LEDを4.7kΩを介してつなぎました。0.4mA以下になると思いますが、ちょっと暗いかなという程度で、じゅうぶん確認できる程度の明るさで光ります。

XCR3064XL-10PC44Cの中身は以下の通り。VerilogHDLで書いてあります。Handspring社から出ている資料を見ながら書いてみました。本当にこんなやり方でいいのか、私自身よく理解できていないのです。詳しい方、だれか添削してください。

springboard.v

module springboard(WE, CS0, CS1, OE, IRQ, RESET, LOWBAT, A, D, LED);

    input WE, CS0, CS1, OE, RESET, LOWBAT;
    input [3:0]A;
    inout [7:0]D;
    output IRQ;
    inout [7:0]LED;
    reg [7:0]data;
    reg [7:0]addr;

    wire active = RESET & LOWBAT;
    wire chipselect = CS0;
    wire writecycle = ~OE | chipselect | WE;
    wire readcycle = ~OE & ~chipselect & WE;

    assign IRQ = 1;
    assign LED = active ? data : 8'bZZ;
    assign D = readcycle ? data : 8'bZZ;

    always @ (negedge chipselect) begin
        addr <= A;
    end

    always @ (posedge writecycle) begin
        data <= D;
    end

endmodule

 

springboard.ucf

NET "A<0>" LOC = "P29";
NET "A<1>" LOC = "P31";
NET "A<2>" LOC = "P33";
NET "A<3>" LOC = "P34";
NET "D<0>" LOC = "P39";
NET "D<1>" LOC = "P37";
NET "D<2>" LOC = "P36";
NET "D<3>" LOC = "P6";
NET "D<4>" LOC = "P5";
NET "D<5>" LOC = "P4";
NET "D<6>" LOC = "P41";
NET "D<7>" LOC = "P40";
NET "CS0" LOC = "P17";
NET "OE" LOC = "P14";
NET "WE" LOC = "P12";
NET "IRQ" LOC = "P11";
NET "RESET" LOC = "P9";
NET "CS1" LOC = "P16";
NET "LOWBAT" LOC = "P8";
NET "LED<0>" LOC = "P18";
NET "LED<1>" LOC = "P19";
NET "LED<2>" LOC = "P20";
NET "LED<3>" LOC = "P21";
NET "LED<4>" LOC = "P24";
NET "LED<5>" LOC = "P25";
NET "LED<6>" LOC = "P26";
NET "LED<7>" LOC = "P27";

アドレス線は4本割り当てていますが今のところ使っていませんので、外部入出力用などに利用してもいいでしょう。また、Springboardは16ビットバスになっていて、普通は偶数アドレスに対して16ビット単位で読み書きしますので、A0は必要ないような気がします。

パームウェア

外部データ線につながったLEDを個別にON/OFFするサンプルプログラムを作ってみました。

springboard.tar.gz

このファイルには、以下のファイルが含まれています。

諸般の事情(笑)により、メインプログラムはC++で書いています。PalmOSのオブジェクトをラップするクラスを自作してみたのですが、極めて中途半端な代物ですので、深く追求しないでください。また、format.*というファイルはsprintf関数のサブセットですが、こちらも負けず劣らず中途半端なものですので、流用するなとは言いませんが、できれば流用は控えてください。

springboard.prcはコンパイル済みのパームウェアですので、開発環境を用意しなくても、そのままVisorに転送して実行できます。

パラレル出力

以下はLEDを自動で順番に点灯させるようにプログラムを変更したときの動画です。

動画 (MPEG4/157k)

まだまだ、Palmアプリケーションのプログラミングをあまり理解できていないのが痛いです。