Sim's blog

電子工作はじめてみました

コンフィグレーション回路を作ってみました

2007-06-30 01:47:40 | FPGA
DWM7月号のp.40に載っているコンフィグレーション回路を作ってみました。だめもとでブレッドボードと思ったら、なぜか動いてしまいました。

74LCX244はマルツで売っていました。1.27mmピッチなので変換基板を使って2.54mmピッチにしています。変換基板はダイセンのDO20です。

動作の確認は
(1) なひたふさんのMITOUJTAGを動かしてみる
(2) iMPACTでverifyしてみる
の2通りを行いました。

FPGAをverifyするには、ProcessesウインドウのGenerate Programming Fileを右クリックして出るポップアップメニューのPropertiesを選んでProcess Propertiesのダイアログを出してから、CategoryのReadback Optionsを選んでCreate ReadBack Data FilesとCreate Mask Fileをチェックします。

コンフィグレーション回路では、信号の波形が重要だそうなので、ブレッドボードは避けた方が無難です。

p.40の回路図では電源は3.3Vにしていますが、2.5Vのような気がします。一応試してみたら、どちらでも動きました。

どんな波形が出ているのか見てみたいものです。



日米商事の7seg LED

2007-06-28 00:15:21 | 電子工作
日米商事で格安の(junk?)7seg LEDを買いました。赤が53円、緑が32円です。アノードコモンです。

型番は右上にSL-1063-50、右下にPE2094-V1となっています(1はI、0はOかもしれません)。

ピン配置を調べてみました。
A     13      12   11    10    9

K     _2_     ___        ___   ___
   4 /5_/ 3  /__/  ・3  /__/  /__/
  8 /__/ 6  /__/  ・6  /__/  /__/   g 7
     1

9-13pinで表示するセグメントを選択して、1-8で点灯するLEDを選択します。
緑の右下の「g」はAが9でKが7のとき点灯します。

コンフィグROMをつけてみました

2007-06-26 22:45:06 | FPGA
xcf02sをはんだづけしてみました。0.65mmピッチは結構つらいですね。フラックスを塗ればいいのではんだづけそのものはできるのですが、最初に位置あわせするのがなかなかできませんでした。

秋葉原で唯一売っていた千石電商もずっと欠品のようです(もしかしたら他で売ってるかもしれませんが知っているのはここだけです)。

ついでに34pinのピンソケットもつけました。34pinのpinソケットは売っていなかったので、秋月の40pinのを切断してつくりました。金属のpinを抜くと中空なのでカッターで切れました。

Interface 8月号

2007-06-25 22:37:33 | V850
とりあえず買ってきました。V850関連は「V850マイコン基板を用いたカラー表示ビデオ・ゲーム機の製作(後編)」です。NTSCビデオ信号の話なんかが書いてあります。こんなに複雑なんですね。
それとp.185には前回の回路図で間違ったところがあったのの訂正が載っています。

BLANCAの連載ではなひたふさんがMITOUJTAGの話を書いています。


鈴商液晶(7) 電流測定

2007-06-24 16:11:15 | FPGA
テスターで電流を測ってみました。動作電圧は3.3Vです。
CTRL = 1   0.4mA (電源OFF)
CTRL = 0
  VEE = 111
    DISP = 0 (表示ON)
      コントラスト最小  15mA
      コントラスト最大  21mA
      コントラスト中    16mA (見やすいコントラスト)
    DISP = 1 (表示OFF)
      コントラスト最大  14mA
      コントラスト中    11mA
  VEE = 000
    DISP = 0 (表示ON)
      コントラスト最小  13mA
      コントラスト最大  21mA
      コントラスト中    18mA (見やすいコントラスト)
    DISP = 1 (表示OFF)
      (未測定)

電源を落とすとさすがに減りますが、表示なしでもコントラストによって電流が変わります。見た目、同じくらいのコントラストのときはVEE=111の方が少し電流が少なかったような気がします。ざっくり20mAもあれば表示できそうな雰囲気です。

ELインバータについても計ってみました。
秋月インバータ(5V) 58mA
秋月インバータ(8V) 87mA  (バッテリー動作)
共立インバータ(5V) 45mA

えっと、あはは、いっぱい流れますね。

秋月のは超デカEL発光パネル・専用インバータセット(白色)についてきたインバータです。共立エレショップのは「50cm2用ELインバータモジュール/SDEC-I005」というのです。400円なので安くていいですが明るさは足りません。

ついでにDWM付録FPGA基板も計ってみました。
電源投入直後           55mA
コンフィグレーション時 63mA
動作時                 44mA
動作時                 38mA (JTAGケーブルを抜いた)

結構流れるものなんですね。つけている発振器は33MHzの秋月で入手したものです。回路規模は62sliceとblock ramが5個、I/Oは8本の出力だけです。もっと回路規模が大きくなるとすごいことになりそうです。まじめに電源をつけてやらないといけないですね。たしかInterface 付録V850基板って3.3Vは100mAくらいだったような気がします。

外部から入ってくるクロックは33MHzですが、内部で分周して実際は2.35MHz(= 33/14)で動作しています。この14分周は見た目でちらつかない値を適当に選びました。大きいものや速いものを作ったときにどのくらい電流が流れるのかは今後のお楽しみです。

テスターでいいかげんに計っただけなので色々間違っている可能性もあるので注意してください。というか、ちゃんと計るのってどうやるのがいいんでしょうね?

core generatorでROMを作る

2007-06-24 00:01:04 | FPGA
ISE8.1のcore generatorを使えば、block ramを使用したROM/RAMを簡単に作れます。付録DVDに入っていたISE9.1でも同様にできると思います(無責任モード)。

まず、ROMの内容を書いたテキストファイル(coeファイル)を作ります。拡張子は.coeにします。ほとんどべたファイルなのですが、少しだけお約束があります。

(1) 1行目はMEMORY_INITIALIZATION_RADIX=16;にします。これは16進を使うことを指定しています。
(2) 2行目はMEMORY_INITIALIZATION_VECTOR=にします。
(3) 3行目以降はコンマ(,)で区切って16進2桁ずつROMの内容を書きます。1行に何個データを書くとかのルールはないようです。
(4) データの最後はセミコロン(;)にします。

こんな感じになります(mona9.coe)。
MEMORY_INITIALIZATION_RADIX=16;
MEMORY_INITIALIZATION_VECTOR=
ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,
80,00,00,00,00,00,00,00,00,00,00,00,
(中略)
ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff;

さて、iseの使い方です。まずメニューのProject → New Sourceを選ぶとNew Source Wizardが起動します。

この画面では、左側の一覧からIP (Coregen & Architecture Wizard)をシングルクリックして選択して、File Nameに作りたいコアの名前を入れます。今回はromにします。この2つを入力するとNextボタンが灰色じゃなくなって選択できるようになります。
他にすることもないのでNextボタンを押して次の画面に進みます。


この画面では作成するIPを選択します。ツリービューになつているので+を押して展開していきます。Memories & storage Elements → RAMs & ROMsを開いてSingle Port Block Memoryをシングルクリックして選択します。
Nextボタンを押すと確認の画面になるのでFinishを押すとcore generatorが起動します。


最初の画面では以下を行います。
(1) Read Onlyのラジオボタンを押してROMにします
(2) Width(データのbit幅)を8bitにします
(3) Depth(データの個数)を9216(= 9x1024)にします
最後の9216というのは鈴商液晶が384x192dotなので9216バイト(= 384x192/8)であることを指定しています。
Nextボタンを3回押して4page目に移動します。


この画面では、先ほど作ったcoeファイルを指定します。Load Init FileのチェックボタンをチェックするとLoad Fileボタンが有効になります。Load Fileボタンを押すとファイル選択のダイアログで出てくるので選択してやります。

これで設定はできたので左下のGenerateボタンを押してしばらく待つとROMの出来上がりです。隣のDismissボタンを押すと全部キャンセルされてしまうので間違って押さないようにします。

今回作ったROMはblock ramから作られているので、アドレスを指定した次のクロックでデータが出力されます。
block ramは1個あたり2kバイトです。今回は9k byteのROMを作ったので5個のblock ramを使用します。DWM付録基板のxc3s250eは全部で12個のblock ramが搭載されています。24kバイトのROMまたはRAMが使えることになります。
(正確には16kbitではなくパリティもあるので18kbitですが、8bit幅にすると2kバイトまでしか使用できません)

論理合成するとISEの右側の画面にDesign Summaryが表示されますが、この中にblock ramの使用状況も表示されます(今回のは5個)。

core generatorを使えばデュアルポートRAMも簡単に作れます。

ROMを作る他の方法としては以下があります。

(1) alwaysとcaseで作る。ISEはblock ramを推論してくれます。
(2) initial中で初期化する。ただし全データを設定してやる必要があります。ISEはblock ramを推論してくれます。テストベンチだけでなく、論理合成のときにinitialが使えるのはたぶんise特有だと思います。
(3) アトリビュートのINIT_xxに書いてやる。block ramを1つずつインスタンス化しないといけないません。インスタンス化のときに#( )の中に書く方法と// synthesis attributeで書く方法があります。language templateは#( )の方法になっています。
(4) ucfファイルの中で指定(?)。これはやってみたことがないのでよく分かりません。もしかしたらxcfファイルかもしれません。
(5) data2memユーティリティを使って直接bitファイルを書き換える。これには.bmmファイルと.memファイルを作ってやる必要があります。EDKはこの方法でblock ramを書き換えています。data2memの使い方はFPGAの部屋さんで何回か取り上げられています。

他にもあると思いますが知っているのはこのくらいです。

鈴商液晶(6) verilogソース

2007-06-23 22:01:12 | FPGA
鈴商で売っている384x192液晶をDWM付録FPGA基板から動かすことができました。

verilogソースです。ファイルの拡張子は.vです。
`default_nettype none
module main(
    output [3:0] d,          // 液晶 5:D3 6:D2 7:D1 8:D0
    output reg cl1 = 1'b0,   // 液晶 1:LOAD
    output reg cl2 = 1'b1,   // 液晶 2:CP
    output reg frame = 1'b1, // 液晶 3:IO1
    output reg m = 1'b1,     // 液晶 4:DF
    output reg led = 1'b1,   // active low
    input clk);

    parameter DIV_END = 13;

    reg [3:0] div = 0;
    reg [6:0] x = 0;
    reg [7:0] y = 0;
    reg [13:0] adr = 14'h002f;

    wire [7:0] romout;
    wire cl2_en = div == DIV_END;

    assign d = x[0] ? romout[7:4] : romout[3:0];

    // ROM
    rom rom0(
        .addr(adr),
        .clk(clk),
        .dout(romout));

    // 分周
    always @(posedge clk)
        div <= cl2_en ? 0 : div + 1;

    // cl1, cl2
    always @(posedge clk)
        if(cl2_en) begin
            cl2 <= ~cl2;
            cl1 <= cl2 & x == 99;
        end

    // x, y, d, frame, m
    always @(posedge clk)
        if(cl2_en & ~cl2) begin
            x <= x == 99 ? 0 : x + 1;
            if(x == 99) begin
                y <= y == 191 ? 0 : y + 1;
                if(y == 191) begin frame <= 1'b1; m <= ~m; end
                if(y == 0) frame <= 1'b0;
            end
        end

    // adr
    always @(posedge clk)
        if(cl2_en & ~cl2)
            if(x == 99)   adr <= y == 191 ? 14'h002f : adr + 97;
            else if(x[0]) adr <= adr - 1;

    // LED点滅
    reg [22:0] led_ctr = 0;
    always @(posedge clk) begin
        led_ctr <= led_ctr + 1;
        if(led_ctr == 0) led <= ~led;
    end

endmodule

divが1周したらcl2が反転します。xが1周したらyが増えます。yが1周したらmが反転します。
adrは最初の行では002fから減っていきます。次の行では005fから減っていきます。

ROMのソースはありません。core generatorで作りました。ROMの作り方は長くなるので次回にします。

ucfファイルです。ファイルの拡張子は.ucfです。
NET "clk"   LOC = "P88" ; 
NET "led"   LOC = "P98" ; 

NET "cl1"   LOC = "P60" ; # A03
NET "cl2"   LOC = "P61" ; # B03
NET "frame" LOC = "P62" ; # A04
NET "m"     LOC = "P63" ; # B04
NET "d<3>"  LOC = "P53" ; # A01
NET "d<2>"  LOC = "P54" ; # B01
NET "d<1>"  LOC = "P57" ; # A02
NET "d<0>"  LOC = "P58" ; # B02

ucfファイルはverilogの記号とFPGAのpinの対応表です。ucfファイルを書き換えれば他のpinに変更することも簡単にできます。

一応、回路図です。

DISPだけスイッチをつけています。FPGAに書き込んでいる間とかはMに交流が入らないので液晶を壊してしまう危険性があります。そこで表示しないようにスイッチを切っておきます。それ以外は直結です。

CTRL, DISP, Vee1, Vee2, Vee3はFPGAにつないでしまってもいいかもしれません。液晶の電源や表示のON/OFF、コントラストがFPGAから制御できるようになります。その際、CTRLとDISPは液晶保護のためにpull upしておきます。

鈴商液晶(5) (真)タイミングチャート

2007-06-23 02:57:11 | FPGA
昨日、はらおさんにコメントで何が間違っているのかを教えていただきました。

鈴商液晶は横方向に5個のMSM5299Cというコントローラを使っているのですが、1つあたり80dot分のシフトレジスタを持っていて5個で400dot分のサイズがあります。表示の横方向は384dotなので余った16dot分は単に表示されません。表示は384dotだから表示する分だけデータを送ってやればいいやと勝手に思い込んでいましたが、実際は400dot分のデータを送ってやらなければいけないというのが、はらおさんに教えていただいたことです。

データは1クロック(CL2)あたり4bitずつ送信するので400dotは100クロックになります。昨日のタイミングチャートは96クロック分しか送っていませんでした。

なんかブログしててよかったと感激な日でした。


鈴商液晶(4) タイミングチャート(仮)

2007-06-21 22:21:28 | FPGA
とりあえず、まともに動いていないわけですが、たぶんこんな感じなんだろうという制御線のタイミングチャートを載せておきます。
まずは、1行目だけを拡大したタイミングチャートです。



次に全体というか、3画面(3FRAME)分のタイミングチャートです。



ちゃんと画面が出ていないので、どこかしら間違っているのですが、どこが間違っているのかさっぱりです。

タイミングチャートはpowerpointで書きました。やたら手間がかかった気がします。

鈴商液晶(2)

2007-06-19 00:21:41 | FPGA
昨日の続きです。この液晶は384x192なので、128x64のモナーを9個表示できます。

まだ全然うまくいっていません。ちょっと挫けそうです。
今のところ、変なところは
(1) 左右逆に表示される
(2) 1dot目から数dot分が60dot目あたりに表示される(写真左側の縦線)

(1)はアドレスの生成方法とデータのビット並びを修正する必要があります。
(2)は制御線のどれかのタイミングがずれているか、ノイズとかで信号が壊れているとかです。4つある制御線のタイミングはよく分かっていません。Myオシロがほしくくなります。

3つあるVEEには半固定抵抗をつけてみましたが、実際は2値しか受け付けないようです。4.6Vくらいを境に、以上だとH、以下だとLとみなしているようです。Hにすると濃くなります。3bitで8段階のコントラストを調整できます。

4bitあるDですが、横4dot分を送るのに使います。横方向は384dotなので、96回(=384/4)データを送ってやると1ライン表示されることになります。

LOAD(CL1)は1行の始まりを示す信号です。
CP(CL2)は立下り毎にDからデータが取り込まれます。
IO1(FRAME)は1行目を示すための信号です。
DF(M)は1画面(1フレーム)毎に反転する信号です。

細かいタイミングがよく分かっていないので、試行錯誤しています。

鈴商液晶

2007-06-17 23:05:27 | FPGA
DWM付録基板に鈴商で売っている液晶をつないでみようと思っています。この液晶の解析はgomisaiさんが行っています(ここここ)。この情報はすんさんの掲示板で知りました。

電源は5Vだけあればよいようです。

液晶は5V系なので3.3V系のFPGAとつなぐためにレベル変換ICをつけました。74ACT244は5V動作ですが、入力は2V以上をHとみなして出力を5Vで出してくれます(鈴商で100円)。液晶の制御線は8本なので74ACT244は1つで十分です。

液晶の入力はハーフピッチ18pinのフレキケーブルなので、ブレッドボードをつなげる部品を作りました。変換コネクタは鈴商で売っています(50円)。とりあえすFPGAの出力がちゃんと5Vになっていることだけ確認しました。



バックライトはELです。秋月で売っているEL用インバータをつないでみたらちゃんと光りました。ELI-1にインバータの出力をELI-2にGNDをつなぎました。



というわけで、FPGAの中身を開発するための準備ができました(はずです)。

ELインバータの出力は高圧なので感電に注意する必要があります。また、液晶は交流を与えないと壊れるので、開発中はとりあえず表示を停止しておく必要があります。

Interface 7月号のゲーム(2)

2007-06-14 22:46:33 | V850
ゲームを遊んでみたかったので、3.3V系というか3軸加速度センサーの部分を組み立ててました。ゲームは結構難しいです。まだ2面クリアできません。



6/15 追記 音声出力用のopアンプもつけてみました。音がピコピコなって楽しいです。2面はクリアできました。線がいっぱい生えてて、あまり操作性はよくありません。
ビデオの線の色は映像(黄)音声左(白)音声右(赤)です。


Xilinx アンサー#22255について

2007-06-14 00:29:19 | FPGA
Xilinxのアンサーデータベースに以下のようなアンサーがあります。

ザイリンクス アンサー #22255 「Spartan-3 コンフィギュレーション - JTAG でのコンフィギュレーションは正しく完了するがデバイスは完全に機能せず検証でエラーが発生する」

(XilinxのサイトはすぐURLが変わるのでリンクはしません)

Spartan-3と書いてありますが、Spartan-3ファミリーが対象なのでSpartan-3Eもあてはまります。DWM付録のFPGA基板はモードがマスターシリアルに固定なので、この問題が発生する可能性があります。

「この問題は、ISE 9.1.01i (2007 年 1 月末リリース) で修正される予定です。」ということなので、DWM付録基板を使うときはISE 9.1以降にしたほうがよさそうです。

マルツのジャンク圧力センサー(FPM-02PG)

2007-06-14 00:06:24 | 電子工作
マルツパーツの店の前のワゴンで52円の圧力センサーを売っていました。店の前に置いてあった仕様をメモしたものです。webとかでも仕様はよく分からないので載せておきます。書き写し間違いがあるかもしれません。
6/23 追記 52円に修正

センサーはFPM-02PG、センサーアンプはPSM-02PG-2(刻印はPG-2)。回路図の抵抗値は書いてありませんでした。

圧力センサーモジュール

◎絶対最大定格
電源電圧 DC12V
最大負荷圧力 210g/cm^2
動作温度 0~70℃
保存温度 -40~120℃

◎外寸
センサ W14x13.5xD12 約1.4g
センサアンプ用IC W22x18.0xD25.4 約2.7g

◎電気的特性
出力電圧 1.0g/cm^2 : 0V
     30.0g/cm^2 : 4.5V
総合精度 ±8%FS/0~50℃

◎使用条件
圧力範囲 1.0~30.0g/cm^2
使用温度 0~50℃
圧力媒体 非腐食性ガス
使用雰囲気 屋内一般清浄雰囲気

(グラフがあったのですが、言葉で説明します)
グラフタイトル 出力特性
横軸 圧力(g/cm^2)
縦軸 出力電圧(V)
1.0g/cm^2のときの出力電圧0V
15.5g/cm^2のときの出力電圧2.25V
30.0g/cm^2のときの出力電圧4.5V
(この3点を結ぶ右上がりの直線)

6/14 追記 FPM-02PGでググるとデータシートがすぐ見つかります(ここ)。メーカーはフジクラというところみたいです。抵抗は200Ωの可変抵抗のようです。