FC2カウンター FPGAの部屋 2011年10月

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

システム開発入門[Altera偏]を試してみる4(2.4アップダウン・カウンタのシミュレーション2)

システム開発入門[Altera偏]を試してみる4(2.4アップダウン・カウンタのシミュレーション1)”の続き。

今回は、btn_in.vの修正点と新たに作成したテストベンチ、updown_tb.v について説明する。

最初にbtn_in.v の変更点から説明する。
btn_in.v の50MHzを1250000分周して40Hzを作るen40hzの書き方をparameterを使用した書き方に変更させていただいた。
元のbtn_in.v の一部を下に示す。

reg [20:0] cnt;

wire en40hz = (cnt==1250000-1);


下にparameterを使用した書き方を示す。

parameter DIV_VAL = 1250000;

reg [20:0] cnt;

wire en40hz = (cnt==DIV_VAL-1);


これで、テストベンチから、DIV_VALの値を変更することができる。
updown.v とbtn_in.v を通常にシミュレーションしたのでは、en40hzが1になるまでに、1250000クロックかかってしまう。これではシミュレーション時間がとても長くなってしまう。そこで、シミュレーションの時だけ、DIV_VALを2に設定して、2クロック間スイッチに1を入れておけば動作するようにした。このテクニックはVerilogだけ使えて、VHDLは使用できない。でも、シミュレーション時に再上位のテストベンチからシミュレーションしやすいようにのみ使うのが妥当だ。通常の論理合成可能な記述で使うと、何処でオーバーライトされているかわからずにバグの温床を抱えることになってしまう。

(注1:ちなみに、ModelSimであれば、VHDLでもinit_signal_spyを使用して、VHDLの他の階層のsignalをミラーする事ができる)
(注2:VHDLの共有変数を使用すると、似たようなことが書ける

次に、updown_tb.v を下に示す。

// UPDOWN.v用テストベンチ

`default_nettype none
`timescale 1ns/100ps

module UPDOWN_tb;

    reg                clk = 1'b0;
    reg                rst = 1'b1;
    reg        [2:0]    nBUTTON = 3'b000;
    wire    [6:0]    nHEX0;
    integer        j;
    
    // nBUTTON と押しボタンスイッチの対応
    parameter RESET_SW_ENABLE =    3'b100;
    parameter DOWN_SW_ENALBE =    3'b010;
    parameter UP_SW_ENABLE =    3'b001;
    parameter SW_DISABLE =        3'b000;
    
    // スイッチのチャタリング防止用のイネーブルの間隔(シミュレーション用)
    parameter CHATTERING_INTR = 2;
    
    // クロック用のパラメータとクロック生成
    parameter PERIOD = 20;
    parameter real DUTY_CYCLE = 0.5;
    parameter OFFSET = 0;
    
    initial
    begin
        #OFFSET;
        forever
        begin
            clk = 1'b0;
            #(PERIOD-(PERIOD*DUTY_CYCLE)) clk = 1'b1;
            #(PERIOD*DUTY_CYCLE);
        end
    end

    // UPDOWNモジュールのインスタンス
    UPDOWN UPDOWN_inst (
        .CLK(clk),
        .RST(rst),
        .nBUTTON(nBUTTON),
        .nHEX0(nHEX0)
    );
    // btn_in.vのDIV_VALの値をシミュレーションに都合が良いように変更する
    defparam UPDOWN_inst.BTN_IN.DIV_VAL = CHATTERING_INTR; 
    
    // テストベンチ部分、各taskを呼び出してテストを行う
    initial begin
        #(PERIOD*2);    // 2クロック待ってリセットを0にする
        rst = 1'b0;
        
        #1;    // 遅延
        @(posedge clk);    // 次のクロックへ
        #1;    // 遅延
        
        UP_SW(4'd10);    // 10回、UPスイッチを押す
        
        DOWN_SW(4'd7);    // 7回、DOWNスイッチを押す
        
        RESET_SW;    // RESETスイッチを押す
        
        #(PERIOD*5);    // 5クロック待つ
        
        $stop;
    end

    // i回、UP_SWを押すtask (i < 16)
    task UP_SW;
        input [3:0] i;    // バースト回数
        begin
            @(posedge clk);    // 次のクロックへ
            #1;    // 遅延
            while (i>0) begin
                nBUTTON = UP_SW_ENABLE;
                CHATTERING_WAIT;    // チャタリング防止用の期間待つ
                
                nBUTTON = SW_DISABLE;
                CHATTERING_WAIT;    // チャタリング防止用の期間待つ
                
                i=i-4'd1;
            end
        end
    endtask
    
    // i回、DOWN_SWを押すtask (i < 16)
    task DOWN_SW;
        input [3:0] i;    // バースト回数
        begin
            @(posedge clk);    // 次のクロックへ
            #1;    // 遅延
            while (i>0) begin
                nBUTTON = DOWN_SW_ENALBE;
                CHATTERING_WAIT;    // チャタリング防止用の期間待つ
                
                nBUTTON = SW_DISABLE;
                CHATTERING_WAIT;    // チャタリング防止用の期間待つ
                
                i=i-4'd1;
            end
        end
    endtask
    
    // RESET_SW を押すtask
    task RESET_SW;
        begin
            @(posedge clk);    // 次のクロックへ
            #1;    // 遅延
            nBUTTON = RESET_SW_ENABLE;
            CHATTERING_WAIT;    // チャタリング防止用の期間待つ
            nBUTTON = SW_DISABLE;
            CHATTERING_WAIT;    // チャタリング防止用の期間待つ
        end
    endtask
    
    // チャタリング防止用の期間Waitするtask
    task CHATTERING_WAIT;
        begin
            for (j=CHATTERING_INTR; j>0; j=j-1) begin // チャタリング防止用の期間、値を保持する
                @(posedge clk);    // 次のクロックへ
                #1;    // 遅延
            end
        end
    endtask
    
endmodule

`default_nettype wire



部分的な解説

    // クロック用のパラメータとクロック生成
    parameter PERIOD = 20;
    parameter real DUTY_CYCLE = 0.5;
    parameter OFFSET = 0;
    
    initial
    begin
        #OFFSET;
        forever
        begin
            clk = 1'b0;
            #(PERIOD-(PERIOD*DUTY_CYCLE)) clk = 1'b1;
            #(PERIOD*DUTY_CYCLE);
        end
    end


上の部分はクロックを生成する記述だ。確か、何処かで見て、参考にさせていただいている。
これだと、クロックサイクル、デューテー・サイクル、オフセットを指定することができる。注意が必用なのは、時間分解能がns だとしたら、きちんと割り切れる値にする必要が有ることだ。上の場合は例えば、PERIODを奇数にしてしまうと、小数点が出てしまい切り捨てられるので、思った波形にならない。その場合は時間分解能を100ps などに変更する。

下の部分で、defparamを使用して、btn_in.vのDIV_VALに2を代入している。

    // btn_in.vのDIV_VALの値をシミュレーションに都合が良いように変更する
    defparam UPDOWN_inst.BTN_IN.DIV_VAL = CHATTERING_INTR; 



テストベンチの主な部分を下に示す。

    // テストベンチ部分、各taskを呼び出してテストを行う
    initial begin
        #(PERIOD*2);    // 2クロック待ってリセットを0にする
        rst = 1'b0;
        
        #1;    // 遅延
        @(posedge clk);    // 次のクロックへ
        #1;    // 遅延
        
        UP_SW(4'd10);    // 10回、UPスイッチを押す
        
        DOWN_SW(4'd7);    // 7回、DOWNスイッチを押す
        
        RESET_SW;    // RESETスイッチを押す
        
        #(PERIOD*5);    // 5クロック待つ
        
        $stop;
    end


@(posedge clk); は、次のクロックの立ち上がりまで待つ記述となる。その後の#1の遅延は、現在、クロックの立ち上がりの瞬間にいるので、時刻を少しでもずらすために入れてある。デルタ時間も0では、次の@(posedge clk); がうまく動作しない可能性があるからだ。

UP_SWタスクは4ビット幅の引数を1つ持つ。引数にはUP_SWを押す回数を設定する。今回は10を設定している。
DOWN_SWタスクは4ビット幅の引数を1つ持つ。引数にはDOWN_SWを押す回数を設定する。今回は7を設定している。
RESE_SWタスクは引数を持たない。RESE_SWタスクを呼び出すと、RSETスイッチが1回押される。


UP_SWタスクを下に示す。

    // i回、UP_SWを押すtask (i < 16)
    task UP_SW;
        input [3:0] i;    // バースト回数
        begin
            @(posedge clk);    // 次のクロックへ
            #1;    // 遅延
            while (i>0) begin
                nBUTTON = UP_SW_ENABLE;
                CHATTERING_WAIT;    // チャタリング防止用の期間待つ
                
                nBUTTON = SW_DISABLE;
                CHATTERING_WAIT;    // チャタリング防止用の期間待つ
                
                i=i-4'd1;
            end
        end
    endtask


クロックの立ち上がりまで待って、遅延する。
UP_SWを1にしている。CHATTERING_WAITタスクを呼び出して、チャタリングが収まるまで待ってから、UP_SWを0にして、またCHATTERING_WAITタスクを呼び出す。これをi回繰り返している。

疲れてきたので、後の説明は省略する。

  1. 2011年10月30日 05:08 |
  2. FPGAボードで学ぶ組込みシステム開発入門[Altera偏]
  3. | トラックバック:0
  4. | コメント:0

Altiumセミナ、三銃士/王妃の首飾りとダ・ヴィンチの飛行船に行ってきました

今日は、10時からFPGA-CAFEでAltium Designerの講習会に参加しました。やはり機能的にはDesignSpark PCBよりも上だと感じました。そりゃそうですよね。お高いソフトとフリーウェアの差です。
DesignSpark PCBも、PCBデザインでネット名が見えてると、配線の最後に拡大したときに繋ぎやすいんですがね。。。後、クリアランスを表示するときに移動すると、計測値が消えちゃうのが難点だと思います。でもフリーウェアとして立派な凄いソフトだと思います。
Altiumは、C to HDL機能もあるし、FPGA対応機能もあるので、使ってみたいと思っていました。仕事ではそういうニーズがないので、購入できません。なので、6万円くらいでしたら個人的に買ってみたいです。

セミナの後は、奥さんとイーアスで待ち合わせて、映画、”三銃士/王妃の首飾りとダ・ヴィンチの飛行船”に行ってきました。3Dです。痛快でなかなか面白かったです。多分、続編があると思います。

最後に、ガス展に行きました。17年もガス台使っているので、そろそろ新しいのが欲しいとのことです。最近のガス台は機能満載です。温度調整、タイマー、ガラストップ、至れり尽くせりです。どうやら、買うことになりそう。約15万円。

私のAltium Designerの運命やいかに。。。
  1. 2011年10月29日 21:19 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

システム開発入門[Altera偏]を試してみる4(2.4アップダウン・カウンタのシミュレーション1)

FPGAボードで学ぶ組込みシステム開発入門[Altera偏]の第4弾は、2.4章のアップダウン・カウンタをシミュレーションしてみようと思う。

ダウンロードしたDE0用のプロジェクトでは、dai2sho\updownだ。
Quartus IIでコンパイルして実機で確かめてみたが、問題なく動作した。
FPGA_Board_Dev_18_111029.png

次にModelSimでシミュレーションを行う。ModelSimのバージョンは6.6d、Quartus II 11.0用。久しぶりのModelSimだ。
プロジェクトを作成して、Verilogファイルを追加し、シミュレーションを行う。なお、OKボタンをクリックするのは省略してある。

1.最初に、dai2sho\updownフォルダにSimulationフォルダを新規作成して、テストベンチファイル、updown_tb.vを入れておく。

2.ModelSimで、FileメニューからNew -> Project...を選択して、新規プロジェクトを生成する。

3.Create Projectダイアログが開く。Project Nameをupdownとして、Project Locationを1.で作成したSimulationフォルダに設定する。
FPGA_Board_Dev_19_111029.png

4.Add item to the Projectダイアログが開く。Add Existing Fileをクリックして、ファイルをプロジェクトに追加する。
FPGA_Board_Dev_20_111029.png

5.Add file to Projectダイアログが開く。File NameのBrowse...ボタンをクリックする。
FPGA_Board_Dev_21_111029.png

6.Select files to add to projectダイアログが開く。btn_in.v, updown.v を選択して、開くボタンをクリックする。(btn_in.vはオリジナルのファイルから少し書き換えた。どう書き換えたかは後で述べる)
FPGA_Board_Dev_22_111029.png

7.Add file to ProjectダイアログのFile Nameに2つのファイル名が入った。OKボタンをクリックする。
FPGA_Board_Dev_23_111029.png

8.btn_in.v, updown.v がModelSimのProjectウインドウに追加された。
FPGA_Board_Dev_25_111029.png

9.もう一度、Add item to the Projectダイアログで、Add Existing Fileをクリックして、Simulationフォルダのupdown_tb.v もProjectウインドウに追加する。Add item to the ProjectダイアログをCloseボタンをクリックして閉じる。
FPGA_Board_Dev_26_111029.png

10.CompileメニューからCompile Order...を選択する。Compile Orderダイアログが開く。Auto Generateをクリックする。
FPGA_Board_Dev_27_111029.png

11.updown_tb.v にバグがあったので修正したが、コンパイルが成功すると、ダイアログが表示される。これでコンパイルは終了した。
FPGA_Board_Dev_28_111029.png

12.Compile OrderダイアログをOKボタンで閉じる。
FPGA_Board_Dev_29_111029.png

13.シミュレーションを開始する。SimulatonメニューからStart Simulation...を選択する。

14.Start Simulationダイアログが開く。Designタブのworkを展開して、UPDOWN_tbを選択し、OKボタンをクリックする。(今回はAlteraのライブラリは使わないので、その他のタブはそのままとする)
FPGA_Board_Dev_30_111029.png

15.シミュレーション画面に変更された。Objectsウインドウのclk, rst, nBUTTON, nHEX0を選択して、Waveウインドウにドラック&ドロップした。
FPGA_Board_Dev_31_111029.png

16.InstanceウインドウでUPDOWN_instを選択すると、updown.vの信号がObjectsウインドウに表示される。
FPGA_Board_Dev_32_111029.png

17.これらの信号をWaveウインドウに追加する前に、目印にDividerをWaveウインドウに挿入しよう。Waveウインドウで右クリックメニューからInsert Dividerを選択する。
FPGA_Board_Dev_33_111029.png

18.Wave Divider Propertiesダイアログが開く。Divider NameにUPDOWNと入力して、OKボタンをクリックする。
FPGA_Board_Dev_34_111029.png

19.updown.vの信号をすべて、Waveウインドウにドラック&ドロップする。BTN_INの信号も同様にDividerを作っって、ドラック&ドロップした。
FPGA_Board_Dev_35_111029.png

20.いよいよシミュレーションを開始する。アイコンをクリックしても良いのだが、Transcriptウインドウで"run -all"と入力してシミュレーションを走らせる。テストベンチに$stop;を書いてあるので、そこまでシミュレーションを行うことができる。
FPGA_Board_Dev_36_111029.png

20.updown_tb.v の$stop;行でシミュレーションが停止する。
FPGA_Board_Dev_37_111029.png

21.Waveウインドウに戻ると波形が表示されているが、一部で見にくい。全体を表示させるために、zoom Fullアイコンをクリックする。
FPGA_Board_Dev_38_111029.png

22.Waveウインドウの全体が表示された。
FPGA_Board_Dev_39_111029.png

(注)本のVerilogファイルをそのままシミュレーションしても上の波形にはなりません。btn_in.vをいじってあります。どういじってあるかは第2回目を参照ください。

23.今、7セグメントLEDに何を表示しているかを見るために、updown.vの[3:0] udcntを符号なし十進数で表示してみましょう。そうするには、右クリックメニューからRadixをUnsigned に設定します。
FPGA_Board_Dev_40_111029.png

24.udcntが0から10までアップ・カウントして、そこから3までダウン・カウントして、次に0にリセットされているのが見えます。
FPGA_Board_Dev_41_111029.png

25.CTRL+左クリックドラックで指定範囲を拡大できます。
FPGA_Board_Dev_42_111029.png

26.udcntが0の時のnHEX0を見ると"1000000"です。これが7セグメントLEDの点灯パターンになります。これは、gセグメントのみ消灯で、それ以外のa, b, c, d, e, fセグメントが点灯します。つまり、8の真ん中の棒のみ消灯なので、0に見えます。7セグメントLEDの点灯表は、本の44ページの表2-2 7セグメントLEDデコーダの真理値表に書いてあります。
FPGA_Board_Dev_43_111029.png

また最初からシミュレーションをしたいときは、Trascriptウインドウで、

restart -f
run -all


を入力します。

これで第1回目は終了です。第2回目は、btn_in.vの修正部分とupdown_tb.vのテストベンチについて書くことにします。

システム開発入門[Altera偏]を試してみる4(2.4アップダウン・カウンタのシミュレーション2)”に続く。
  1. 2011年10月29日 06:03 |
  2. FPGAボードで学ぶ組込みシステム開発入門[Altera偏]
  3. | トラックバック:0
  4. | コメント:0

ステレオカメラ基板作成5(OV7670基板完成)

ステレオカメラ基板作成4(OV7670基板4)”の続き。

届いたSpartan-3A Starter Kit用のステレオカメラ基板にコネクタとパスコンを実装した。CAM1のみaitendoのOV7670モジュールを実装してテストした。(以前は赤い色の基板でした)
StereoCamBoard_21_111027.jpg

画像が表示できなくて焦ったが、画面キャプチャスイッチを入れ忘れていたためだった。ONにすると画像が表示できた。
StereoCamBoard_22_111027.jpg

CAM1が成功したので、CAM3(CAM2はない)も実装してテストした。
StereoCamBoard_23_111027.jpg

こっちはすんなり成功した。
StereoCamBoard_24_111027.jpg

これで両方のカメラモジュールの動作が確認できた。初めて自分で作ってもらったプリント基板は大成功だった。こんな配線しかない簡単な基板を作るだけでも、いろいろわからないことばかりで大変だった。
いろいろアドバイスしていただいた皆さん、本当にありがとうございました。また、近い内に基板を作ると思うので、またアドバイスお願いします。

次は、すぐにでもaitendoのOV9655モジュール用の基板を作りたい。
その次はHDMIコネクタを実装する基板をSpartan-3A Starter Kit用に作りたいと思っている。(HDMIコネクタは購入済み)

  1. 2011年10月28日 04:32 |
  2. プリント基板作成
  3. | トラックバック:0
  4. | コメント:3

ステレオカメラ基板作成4(OV7670基板4)

10月9日に”ステレオカメラ基板作成3(OV7670基板3)”で発注したOV7670のステレオ基板ですが、10月12日に基板外形がないと言われて、”DesignSpark PCBでガーバーファイルにBoard Outlinesを追加する”で基板外形を追加して、送り直し、In productionになりました。

そして、今日基板が到着しました!!!やった~。嬉しいです。

Fusion PCBに頼んでからの軌跡を下に示します。

10/09/2011 Confirmed
10/09/2011 Confirmed  PayPal status: Completed @ 22:13:49 Oct 09, 2011 PDT
                Trans ID:*************
                Amount: 38.42 USD
10/11/2011 Processing
10/12/2011 In production
10/17/2011 Shipped
10/17/2011 Traceabl    eplease enter your order number at

国際郵便の記録

10月18日
16:00    引受 HONG KONG

10月21日
15:15   国際交換支店から発送 KOWLOON D HONG KONG

10月24日
15:55   国際交換支店に到着  成田国際空港支店 千葉県

10月25日
9:00   通関手続中        成田国際空港支店
千葉県

10月25日
11:15   国際交換支店から発送   成田国際空港支店 千葉県

10月26日
5:46    到着          筑波学園支店   茨城県

10月26日
14:39   お届け先にお届け済み  筑波学園支店**集配センター 茨城県



到着した時のパッケージです。
StereoCamBoard_16_111026.jpg

中身です。基板となぜか?髑髏バッチが入っていました。髑髏バッチはスイッチを入れると目と口が光ります。これはもしかして?サイトが乗っ取られたドクロマークのパロディ?そうとすればブラックすぎる~~~。
StereoCamBoard_17_111026.jpg

基板は全部で14枚入っていました。その内の5枚はテープでまとめられているので、これが検査済みみたいです。
基板の裏表です。基板のレジストの色は黄色です。
StereoCamBoard_18_111026.jpg

ヒロセの100ピンコネクタがピッタリ入りました。穴位置もピッタリ。自分でDesignSpark PCB でPCBシンボルを作ったので、ピッタリ入って嬉しいです。
StereoCamBoard_19_111026.jpg

StereoCamBoard_20_111026.jpg

早く部品をハンダ付けして、テストしてみたいです。
  1. 2011年10月26日 22:30 |
  2. プリント基板作成
  3. | トラックバック:0
  4. | コメント:0

FPGAボードで学ぶ組込みシステム開発入門[Altera偏]を試してみる3(7セグデコーダ+FF)

FPGAボードで学ぶ組込みシステム開発入門[Altera偏]を試してみる2(疑問)”の続き。

今回はダウンロードしたDE0用のプロジェクトのdai2sho\seg7dec_ffをやってみようと思う。
QuartusII を立ち上げて、プロジェクトをロードし、コンパイルしたが、エラーが発生した。
FPGA_Board_Dev_12_111026.png

あれ~、おかしいな?とその上の階層にあるREADME.txtを見たら載っていた。ここに引用する。

(注)
 seg7dec_ffは、このままコンパイルするとエラーになります。
ライブラリがCドライブからの絶対パスで登録されているため、
パスが異なると参照できなくなります。本文の2-3-3を参照して、
seg7decのライブラリ登録をし直してください。


パスが絶対パスで登録されているからのようだ。XilinxでもCoregenのcoeファイルが絶対パスでこの前困ったばかりだ。
さて、seg7decのシンボルを作成すれば良いはずなので、シンボルを作成しようとしたら、このフォルダ内にはないみたいだった。そうか、前のseg7decのシンボルを作って、それを登録するわけね。

seg7decプロジェクトに戻って、シンボルを作成した。
FPGA_Board_Dev_13_111026.png

FPGA_Board_Dev_14_111026.png

もう一度、seg7dec_ffプロジェクトに戻って、AssignmentsメニューからSettings...を選択して、出てきたSettingsダイアログのLibrariesのProject Librariesにseg7decを追加した。前に書かれていたseg7decのライブラリは消去した。
FPGA_Board_Dev_15_111026.png

seg7dec_ff.bdfのseg7decをダブルクリックすると、seg7dec.bdfが開くようになった。これでOK。
もう一度コンパイルした。
今度は成功した。
FPGA_Board_Dev_16_111026.png

Programmerで書きこむと動作した。
FPGA_Board_Dev_17_111026.jpg

nBUTTONやSWのWeak Pullupはoffだったので、onにしておいた。”FPGAボードで学ぶ組込みシステム開発入門[Altera偏]を試してみる2(疑問)”参照。
  1. 2011年10月26日 06:01 |
  2. FPGAボードで学ぶ組込みシステム開発入門[Altera偏]
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter KitでEDKを使ってカメラ表示29(ソフトでカメラを制御2)

Spartan-3A Starter KitでEDKを使ってカメラ表示28(ソフトでカメラを制御)”の続き。

XPSでChipScope Proコアを追加してデバック1”と”XPSでChipScope Proコアを追加してデバック2”で、XPSでChipScope ProをIPとして追加して、rot_a, rot_b, rot_centerの様子を観察したら、rot_a, rot_bがPULLUPされているはずなのに、値が0になっていた。
(rot_a, rot_b はロータリー・エンコーダの接点、rot_center はセンタースイッチ、詳しくは、Spartan-3A/3AN スタータ キット ボード ユーザー ガイド (UG334)の30ページ、”ロータリー プッシュボタン スイッチ”を参照のこと)

XPSのUCF制約でPULLUP指定されているはずなのに、PULLUPされていないのはなぜか?調べてみることにした。
FPGA Editorでrot_a, rot_b, rot_centerのPADの属性を調べた。
rot_aのIBUFを下に示す。
Spa3A_SKit_OV7670_121_111025.png

設定値部分を拡大した。
Spa3A_SKit_OV7670_122_111025.png

PULLUPにチェックが入っていない。rot_bも同様だった。rot_centerもPULLDOWNにチェックが入っていなかった。
それじゃ、ISE12.4でインプリメントした回路はどうだったか?というと、”画像テルミン2”をFPGA Editorで見てみた。(こっちはEDKは未使用で、Simple MicroBlazeを使用して、ISEのみで構築してある)
rot_aのIBUFを下に示す。
Spa3A_SKit_OV7670_123_111025.png

PULLUPにチェックが入っていた。rot_bも同様だった。rot_centerはPULLDOWNにチェックが入っていた。

ちなみに、UCFはどちらも同じで下のように記述してある。これは、Spartan-3A/3AN スタータ キット ボード ユーザー ガイド (UG334)に示された制約を丸写ししている。

NET "rot_center" LOC = "R13" | IOSTANDARD = LVTTL | PULLDOWN ;
NET "rot_a" LOC = "T13" | IOSTANDARD = LVTTL | PULLUP ;
NET "rot_b" LOC = "R14" | IOSTANDARD = LVTTL | PULLUP ;


制約ガイド UG625 (v. 13.2) 2011年7月6日”を見ると、3ページの改訂履歴に下のように書いてあった。(引用)
Spa3A_SKit_OV7670_124_111025.png

PULLUP, PULLDOWNについて記述されている。これは、ISE13.2で何かが変わったのかもしれない?
現在のISE13.2の制約を下のように変更してみた。

NET "rot_center" LOC = "R13" | IOSTANDARD = LVTTL | PULLDOWN = TRUE ;
NET "rot_a" LOC = "T13" | IOSTANDARD = LVTTL | PULLUP = TRUE ;
NET "rot_b" LOC = "R14" | IOSTANDARD = LVTTL | PULLUP = TRUE ;


これでも以前同様、PULLUP, PULLDOWNにチェックが入らなかった。(XPSで制約している)

次に、制約を下のように変更してみた。

NET "rot_center" LOC = "R13" | IOSTANDARD = LVTTL;
NET "rot_center" PULLDOWN;
NET "rot_a" LOC = "T13" | IOSTANDARD = LVTTL;
NET "rot_a" PULLUP;
NET "rot_b" LOC = "R14" | IOSTANDARD = LVTTL;
NET "rot_b" PULLUP;


また、以前同様、PULLUP, PULLDOWNにチェックが入らなかった。(XPSで制約している)

どうやっても、PULLUP, PULLDOWN制約が入らない。困った。。。

ISEの方に、system_top_pull.ucfを新規作成した。内容を下に示す。

NET "rot_center" PULLDOWN;
NET "rot_a" PULLUP;
NET "rot_b" PULLUP;


Spa3A_SKit_OV7670_125_111025.png

これでインプリメントし、FPGA Editorで見たところ、うまく行った。
rot_aのIBUFの画面を下に示す。
Spa3A_SKit_OV7670_126_111025.png

rot_bにPULLUP、rot_centerにPULLDOWNのチェックが入っていた。

ということは、13.2のXPSでPULLUP、PULLDOWN制約をしても、インプリメント結果に反映されない。ISE13.2でPULLUP、PULLDOWN制約をすると、インプリメント結果に反映される。ということのようだ。

これで、SDKを立ち上げ、ソフトウェアを入れてビットファイルをダウンロードすると、ロータリー・エンコーダが動作した。これで完璧と思ったら、カメラの表示がおかくなっていた。
Spa3A_SKit_OV7670_127_111025.jpg

前回から入れたのは、ChipScope Proだけなので、iconとilaをXPSで削除して、もう一度やってみたら、カメラの表示が写った。
Spa3A_SKit_OV7670_128_111025.jpg

タイミングは全てメットしていたのだが、やはり、ChipScope Proを入れると、おかしくなることがあるようだ。

一応、これで完成だ。。。
  1. 2011年10月25日 06:05 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

iPhone4Sを購入

昨日、iPhone4Sを2台購入しました。私が黒で、奥さんが白です。写真は黒。
iPhone4S_1_111024.jpg

3GSからの乗り換えです。iCloudでパソコンレスで同期しようとしましたが、やり方が分からず、パソコンで同期しました。
でも、最近、iTunesは具合が悪く、アプリの同期の途中で止まってしまいます。4Sにアプリをインストール途中で止まっちゃいました。
4Sのインストール途中のアプリを全部消して、もう一度、パソコンで同期しましたが、やはりだめでした。
iTunesをリカバリして、やっとアプリが同期できました。
今度は、音楽のコピーです。音楽は同期から外しているので、iTunesからコピーなんですが、これまた曲名だけ入って、音楽のファイル本体がコピーされません。何回かUSBケーブルを付けはずして、午後11過ぎまでかかってやっと思い通りにできました。
4Sのカメラは良いようです。
下が3GSのカメラで取った写真です。ちょっとぶれてしまいました。
iPhone4S_2_111024.jpg

同じところを4Sで取りました。同じようにPaint.NETで640X480に縮小してあります。
iPhone4S_3_111024.jpg

やはり、3GSよりアプリの起動とかが速い気がします。
  1. 2011年10月24日 20:01 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

ホームカミングデーに行ってきました

昨日は母校のホームカミングデーに行ってきました。

懐かしい研究室の同級生と待ち合わせて会って来ました。30年ぶりです。皆、ほとんど変わりがなかったです。ホームカミングデーの後で個別に飲み会にも行って、楽しい時間を過ごすことができました。

サプライズもありました。30年前に卒業研究でZ80のマイコンシステムを作りました。Z80(2.5MHz動作)、48KバイトSRAM。インタフェースは紙テープリーダー、紙テープライター、CRTディスプレイ、スイッチ入力、カセットインターフェースでした。このシステムを4人で、ラックから作りました。
その時書いたマニュアルを同級生の1人が持って来ました。ほんとうに驚きました。そしてそれは、製本されていました。今は亡き先生が製本してくれたとのことでした。飲み会の席では、30年前にタイムスリップしたように、その当時の話で盛り上がりました。
今から考えると、マルチ・タスクモニタを持ったシステムをよく1年で0から開発できたな?と思います。紙テープをリードしながら、他の処理が実行できていました。3日間研究室で徹夜してCRTディスプレイ装置を作ったことが懐かしく思い出されます。

当時、私は、CRTディスプレイ装置とカセットインターフェースを作っていました。カセットインターフェースは、サッポロシティ・スタンダードといって、カンサスシティ・スタンダードよりも高いビットレート(と言っても2400bps程度だったと思いますが)でデータを入出力出来る企画でした。これがうまく行かず、ウインドウ・コンパレータなどをOPアンプで実装して頑張っていたのですが、どうしてもうまく行きませんでした。これは後から考えると、調歩同期のクロックを1/1で使ってしまったためでした。当時はわからなかったんです。
大学4年の時は、それに気が付かなかったと思っていたのですが、同級生から卒業までにそれに気づいて、うまく行ったということを教えてもらいました。なんか肩の荷が降りた気がしました。

いろいろお話できて、本当に嬉しかったです。博多から飛行機で来てくれた同級生もいました。また、死ぬまでにお話ししたいと思っています。
  1. 2011年10月23日 05:54 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:3

XPSでChipScope Proコアを追加してデバック2

XPSでChipScope Proコアを追加してデバック1”の続き。

Project Navigator のAnalyze Design Using Chipscope をダブルクリックして、ChipScope Pro Analyzer を立ち上げた。
左上のOpen Cable/Search JTAG Chainアイコンをクリックして、FPGAを捜す。
EDK_Debug_10_111022.png

FPGAとコンフィグROMが見つかった。OKボタンをクリックする。
EDK_Debug_11_111022.png

左上のウインドウにXC3S700AとXCF04Sが表示された。XC3S700Aを選択して、右クリックメニューからConfigure...を選択する。
EDK_Debug_12_111022.png

ChipScope Pro Analyzerのダイアログが表示された。OKボタンをクリックする。
EDK_Debug_13_111022.png

ChipScope Pro Analyzerは下のような状態になった。
EDK_Debug_14_111022.png

これでは信号名が入っていないので、信号名をインポートする。
FileメニューからImport...を選択する。Signal Importダイアログが表示されるので、system\implementation\chipscope_ila_0_wrapper\chipscope_ila_0.cdcを選択する。
EDK_Debug_15_111022.png

Auto-create Buses Warningダイアログが表示される。了解ボタンをクリックする。
そうすると、WaveformにSignal名が表示された。
EDK_Debug_16_111022.png

これで通常にChipScope Proでデバックをすることができる。
なお、今回はトリガ信号とデータ信号が同一だが、トリガ信号とデータ信号を異なる信号を入れる場合は、”11.1 EDK - ChipScope Pro ILA コアのデータ ポートに信号を接続する方法”を参照のこと。
  1. 2011年10月22日 06:15 |
  2. Chipscope
  3. | トラックバック:0
  4. | コメント:0

XPSでChipScope Proコアを追加してデバック1

Spartan3シリーズでは、BSCANユニットが1個しか入っていないため、MicroBlazeでMDMユニットが入っているとChipScope Pro Inserter でChipScope Proを挿入することができなかった。(”The Simple MicroBlaze Microcontroller 17 (ChipScope Proによるデバックの問題点)”参照)

EDKでは、XPS上でChipScope ProのコアをAdd IPすることによって、ChipScope Proを使用することができるようだ。それをやってみようと思う。この場合にはBSCANユニットをMDMとChipScope Proで共有すると思われる。

XPSでDebugメニューからDebug Configuration...を選択する。
EDK_Debug_1_111020.png

Debug Configurationダイアログが表示された。Moniter Hardware Signalsを選択されていた。左下のAdd ChipScope Peripheral...ボタンをクリックする。
EDK_Debug_2_111021.png

Add New ChipScope Peripheralダイアログが表示された。To monitior arbitrary system level signals (adding ILA) のラジオボタンをクリックする。今回はrotary_encoder のデバックなので、ILAを選択した。
EDK_Debug_3_111021.png

Debug Configuraitonダイアログが表示された。BasicタブでAvailable Ports on InstanceからExternal Portsを選択し、rot_a, rot_b, rot_centerを選択して、Add >>ボタンをクリックし、Signals Monitored by:に入れる。
Select the clock to be used monitoring: をclk_62_5000MHzに変更した。
EDK_Debug_4_111021.png

Advancedタブをクリックして、UserタブのMiscを選択し、Use The ILA Trigger Signals As The ILA Data Signal のチェックを外す。これを外すと編集できるようになるので、Width of ILA Data Input Signalを32から16に変更した。これはデータサンプル数が1024で、データ幅が32ビットだと、1つのBRAMに収まらないからだ。
EDK_Debug_6_111022.png

次に、Trigger Uinitをクリックして、Match Type for Trigger Unit0をbasicからbasic with edges に変更した。
EDK_Debug_7_111022.png

もう一度、Miscをクリックして、Use The ILA Trigger Signals As The ILA Data Signal のチェックを入れた。これでOKボタンをクリックした。
EDK_Debug_8_111022.png

XPSに戻ると、chipscope_icon_0とchipscope_ila_0が追加されていた。
EDK_Debug_5_111021.png

これでXPSを終了して、Project Navigator でインプリメントした。
インプリメントが終了した。やはり、BRAMは100%の使用率になった。
EDK_Debug_9_111022.png
  1. 2011年10月22日 05:37 |
  2. Chipscope
  3. | トラックバック:0
  4. | コメント:0

FPGAボードで学ぶ組込みシステム開発入門[Altera偏]を試してみる2(疑問)

FPGAボードで学ぶ組込みシステム開発入門[Altera偏]を試してみる1”で、dai2sho\seg7decをやってみたのだが、1つ疑問がある。(Quartus II のバージョンは11.0)

43ページの”図2-4 スイッチと7セグメントLEDの接続”でスイッチを見ると、2接点型のスイッチを使用して、上側の端子を抵抗を通して電源に、下側の端子をGNDに、真ん中の端子からFPGAのSW入力に接続されている。この接続の場合は、通常は真ん中の端子は上下の端子のどちらかに付いているが、スイッチが片側からもう片側に移動する時間にハイ・インピーダンスになってしまうという問題があると思う。少なくとも数ms はそうなるのではないだろうか?

その間はFPGAの入力端子がハイ・インピーダンス状態となってしまう。従って、FPGAの入力端子はプルアップが必要になると思われる。
SW[0]のプロパティをChip Plannerで見てみると、Weak pullupはoff になっていた。
FPGA_Board_Dev_6_111020.png

Weak pullup以外にもマニュアルを見るとバス・キーパーとかがあるようなのだが、何処でONするかわからない?とりあえずWeak pullupをONしてみることにした。
多分、Pin Plannerでできるのだと思うので、Pin Plannerを起動して、Groupsウインドウで右クリックしてみた。Customize Columnsを選択した。
FPGA_Board_Dev_7_111021.png

Customize Columnsダイアログが表示された。右のAvailable columns をスクロールするとWeak Pull-Up Resistor があったので、右のShow these columns in this order に入れて、OKボタンをクリックした。
FPGA_Board_Dev_8_111021.png

SW[3..0]のグループのWeak Pull-Up ResistorをONにした。
FPGA_Board_Dev_9_111021.png

Pin Plannerを閉じて、Quartus II でもう一度コンパイルした。コンパイルは以前と同様に成功した。
FPGA_Board_Dev_10_111021.png

もう一度、Chip Planner でSW[0]を見ると、Weak pullupはonになっていた。
FPGA_Board_Dev_11_111021.png

コンフィグレーションして確認すると、動作した。動作は以前と何も変わらない。
  1. 2011年10月21日 04:53 |
  2. FPGAボードで学ぶ組込みシステム開発入門[Altera偏]
  3. | トラックバック:0
  4. | コメント:3

Spartan-3A Starter KitでEDKを使ってカメラ表示28(ソフトでカメラを制御)

Alteraをやってみようとしたのだが、訳あってこっちを先にやってみることにした。

前回、”Spartan-3A Starter KitでEDKを使ってカメラ表示27(独自にタイマーのカスタムIPを作る2)”でSimple MicroBlaze用のタイマーを組み込んだら、うまく動作したので、SDKを立ち上げて、camera_controlプロジェクトを作成して、camera_control.cを作成した。このソフトウェアは、ロータリー・エンコーダを使用して、カメラのレジスタ設定を変更して、カメラのモードを変更するためのものだ。LCDにはそのステータスが表示される。これは、”The Simple MicroBlaze Microcontroller 19 (SCCB設定レジスタを設定できたが...)”で実装したCプログラムのアドレスや関数を一部変更して使用している。
Spa3A_SKit_OV7670_120_111020.png

そうすると、LCDの表示は問題なかった(つまり、smm_timerは正常動作)のだが、ロータリー・エンコーダを回しても表示が動かなかった。ロータリー・エンコーダのセンタースイッチは動作するので、左右に回す時がおかしいようだった。試しにFPGA Editorで見てみたが、rot_a, rot_bには正常に入力ピンがあったし、入力用FFに配線されていたので、問題ないようだった。

これはデバックをする必要があるが、BSCANユニットの関係でChipScope Pro Inserterは入れられない。それでは、XPSからChipScope Proを入れてみたい。ということで新シリーズスタートの予定。BRAMの残りが1個のみというのが痛い。

次は、Alteraに戻るつもりだ。
  1. 2011年10月20日 05:41 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

FPGAボードで学ぶ組込みシステム開発入門[Altera偏]を試してみる1

書籍の”FPGAボードで学ぶ組込みシステム開発入門[Altera偏]”を購入したので、そこに載っている回路をDE0で試して見ることにした。目標はDE0上でuClinuxを動作させることだ。いろいろ挑戦してみたのだが、今のところLinuxをFPGAボード上で動かせたことがないので、よくやり方が書いてあるこの本で挑戦してみようと思った。詳しいことは書かないつもりなので、その部分は本を読んで欲しい。
この本にはシミュレーションの記述が無いので、ModelSimでシミュレーションを試みるつもりだ。

まずは、サポートページからDE0.zipをダウンロードした。

まずは、リハビリのためにdai2sho\seg7decからやってみた。
ちょうど指定のQuartus II 11.0がインストールされているので、フォルダ内のseg7dec.qpfをダブルクリックしてQuartus II を起動した。
Star Compilationアイコンをクリックして、コンパイルをスタートし、エラー無く終了した。
FPGA_Board_Dev_1_111019.png

ところで、回路図をやってなかったので、分からないが、上の図でハイライトされている四角はなんだろう?プロパティも表示できないが、ピンアサインされているという表示かな?
Pin Plannerを開けてみると、後の章のピンアサインもすべてアサインされているみたいだ。
FPGA_Board_Dev_2_111019.png

DE0をUSBポートに接続してコンフィグレーションした。
FPGA_Board_Dev_3_111019.png

問題なく動作した。SWを2進数でセットすると、LEDに表示された。
FPGA_Board_Dev_4_111019.jpg

こんな感じで、すべての手順は書かないで、所々の結果を書く感じで、本の回路を練習してみようか?と思うのですが、K林さん、よろしいでしょうか?先週、部屋に行ったのですが、いらしゃらなかったようなので、お聞きすることができませんでした。
シミュレーションはModelSimでやってみたいと思います。

いろいろやることがあるので、中断するかもしれませんが、uClinuxを動作させるところまで、やってみたいと思います。

(追加)
ハイライトされている四角は、ピン番号でした。ViewメニューからShow I/O Standard and Reverse Pin Assignments をチェックを入れて、外すと表示されました。
FPGA_Board_Dev_5_111019.png

同じViewメニューからShow Location Assignments のチェックを外すと四角とピン番号が消えました。
K林さんありがとうございました。
  1. 2011年10月19日 05:53 |
  2. FPGAボードで学ぶ組込みシステム開発入門[Altera偏]
  3. | トラックバック:0
  4. | コメント:6

山寺(立石寺)に行ってきました2

山寺(立石寺)に行ってきました1”の続き。

途中、阿弥陀如来に見えるという弥陀洞を通りましたが、そう言われれば形が似ているかな?というくらいでした。
yamadera_15_111018.jpg

やっと仁王門が見えてきました。
yamadera_16_111018.jpg

登って行くとまた建物が見えてきました。ここで飲み物を売ってましたが、高かったです。オロナミンCが240円だっったか?
yamadera_17_111018.jpg

やっと奥の院と大仏殿に着きました。疲れました。暑いです。
yamadera_18_111018.jpg

だいぶ登って来ました。この辺からの眺めは最高です。
yamadera_19_111018.jpg

yamadera_20_111018.jpg

ワンダ(コーヒー)のCMで宇宙人が俳句を読んでいるのがここ(五大堂)です。ここからの眺めは最高でした。
yamadera_21_111018.jpg

yamadera_22_111018.jpg

だいたい見所は見終えたので、下に降りました。下に降りる時が膝が笑ってしまって大変でした。
下の川が見える食堂で食事。
名物の団子。何かお麩が上にかかっていて、おはぎのような半づきの持ちの団子でした。くるみ味を頼んだのですが美味しかったです。
yamadera_23_111018.jpg

昼食時だったので、私は天丼を食べました。
yamadera_24_111018.jpg

さて、山寺観光を終えて、温泉に入りたいということで、本当は蔵王温泉スキー場にある大露天風呂に入るのが目的だったのですが、行ってると遅くなってしまうので、天童温泉に行くことにしました。

天童温泉は共同浴場がなく、旅館の温泉の入らせてもらうそうです。
天童温泉に着いて看板の出ていた”いちらく”に入りました。
中は豪華でした。リッチな気分になりました。浴衣とバスタオルとタオルが付いて1500円なので安いくらいです。
露天風呂は良かったですが、泉質が単純泉の用な感じで、やはり蔵王のような温泉に入らないと入った気がしません。
ですが、ここの日帰り入浴はとても良かったです。

天童を出て、仙台まで戻り、娘を届けてから、東北道で家に戻って来ました。
  1. 2011年10月18日 05:06 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

山寺(立石寺)に行ってきました1

土日(10月15,16日)に仙台の娘のところに行ってきて、日曜日に山寺(立石寺)に行ってきました。

10月15日は東北大学の片平キャンパスを見学してきました。とても良さそうなところでした。
yamadera_1_111017.jpg

yamadera_2_111017.jpg

魯迅先生の像がありました。
yamadera_3_111017.jpg

年代を感じさせる建物がありました。
yamadera_4_111017.jpg

15日は娘のアパートに泊まって、16日に一緒に山形の山寺に行ってきました。
山形道を走って、山形北インターで降りて、一般道を走って行きました。麓の駐車場に車を入れて歩いて行きます。
yamadera_5_111017.jpg

橋の下の川はとっても良い眺め。
yamadera_6_111017.jpg

参道を歩いて、最初の階段を上り、立石寺本堂へ。
yamadera_7_111017.jpg

からだを触ると願い事が叶うという招福布袋像があったので、撫でてきました。なでられているところは黒光りしていました。
yamadera_8_111017.jpg

境内では、野点が行われていて、無料で抹茶とお菓子をごちそうになりました。苦くなくて、特にお菓子をいただきながら抹茶を飲むと美味しかったです。
yamadera_9_111017.jpg

yamadera_10_111017.jpg

すぐとなりに神社がありました。そこを過ぎると松尾芭蕉の像がありました。ここは有名な蝉の俳句を読んだところだそうです。
yamadera_11_111017.jpg

いよいよ、ワンダの宇宙人CMの奥の細道偏の撮影現場まで登って行きます。
鬱蒼とした森の中の石段を登って行きます。灯籠や仏像、碑がたくさんありました。
yamadera_12_111017.jpg

途中開けると上の崖が見えたりします。石灰岩かな?
yamadera_13_111017.jpg

途中にせみ塚がありました。芭蕉の句をしたためた短冊を埋めて石の塚を立てたそうです。
yamadera_14_111017.jpg

続く。
  1. 2011年10月17日 05:06 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

Spartan-3A Starter KitでEDKを使ってカメラ表示27(独自にタイマーのカスタムIPを作る2)

Spartan-3A Starter KitでEDKを使ってカメラ表示26(独自にタイマーのカスタムIPを作る1)”の続き。

今回はSDKを使ってソフトウェアを作る。
今回もSDKでのソフトウェアの作り方を手順を追って書いていく。

1.Project NavigatorでEDKインスタンスをクリックし、Exprot Hardware Design To SDK with Bitstreamをダブルクリックして、ハードウェア仕様をSDKに渡しながらSDKを立ち上げるのを忘れないようにする。

2.SDKのWorkspaceを指定する。

3.SDKが立ち上がる。Fileメニュー -> New -> Xilinx C projectを選択して新しいプロジェクトを作成する。

4.一般的には、Fileメニュー -> New -> Source FileでCソースを作って、編集する。(私は、Notepad++でCソースを作って、srcフォルダにドラッグアンドドロップ)

5.Cソースが出来たら、セーブすると、自動的にビルドする。

6.Xilinx Toolsメニュー -> Program FPGAを選択。

7A.Cソースのソフトウェアを直接実行する際は、Software Configuration で .elfファイルを選択して、Programボタンをクリックする。

7B.Cソースのソフトウェアをデバックする際は、Software Configuration で .elfファイルを選択せずにbootloopのままで、Programボタンをクリックする。

8B.Project Explorerウインドウのプロジェクト(今回はsmm_timer_test)のBinariesを展開して、.elfを右クリックする。

9B.Degub As -> Launch on Hardware を選択する。



smm_timer_testプロジェクトを作成して、smm_timer_test.c を書いた。コンパイルして実行したら、今度はうまく動いた。LEDが順番に点灯していくのが見えた。成功!!!やった~。

smm_timer_test.c を下に示す。

/* * xps_timer_test.c * *  Created on: 2011/10/02 *      Author: Masaaki *  *  65MHzクロック */

#include "xbasic_types.h"
#include "xio.h"
#include "mb_interface.h"
#include "xparameters.h"

// XPS_GPIO_LEDS_8BIT define
#define XPS_GPIO_LEDS_8BIT_DATA    XPAR_LEDS_8BIT_BASEADDR        // データ
#define XPS_GPIO_LEDS_8BIT_TRI    XPAR_LEDS_8BIT_BASEADDR+0x4    // 0 - Output, 1 - Input

int interrupt = 0;
int k;

void timer_int_handler(void * arg) {
    interrupt = 1;
    k = *(volatile unsigned int *)(XPAR_SMM_TIMER_0_BASEADDR); // 割り込みリセット
}

int main()
{
    unsigned int i;
    
    *(volatile unsigned int *)(XPS_GPIO_LEDS_8BIT_TRI) = 0;    // 出力設定
    
    // 割り込みハンドラ登録、割り込み許可
    microblaze_register_handler(timer_int_handler, (void *) 0);
    microblaze_enable_interrupts();

    for(i=1; i<256; i++){
        *(volatile unsigned int *)(XPS_GPIO_LEDS_8BIT_DATA) = i;

        *(volatile unsigned int *)(XPAR_SMM_TIMER_0_BASEADDR) = 62500000// 1秒カウントをsmm_timerにセット
        // xps_timter割り込み待ち
        interrupt = 0;
        while (interrupt==0);
    }

    return 0;
}

  1. 2011年10月13日 05:39 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

DesignSpark PCBでガーバーファイルにBoard Outlinesを追加する

ステレオカメラ基板作成3(OV7670基板3)”で基板が出来て、Fusion PCB に発注したのですが、Board Outlinesがないというメールが来てしまいました。基板の外形が無いということのようです。

早速、DesignSpark PCBで、どうしたらBoard Outlinesを追加できるか探ってみた。

1.ガーバーファイルは、DesignSpark PCBで、OutputメニューからManufacturing Plot...を選択する。

2.Output Manufacturing Plotsダイアログが開く。Plots:でTop Copperを選び、Settingsタブを選択した。この状態では、Plated Board OutlinesもUnplated Board Outlinesも選択されていない。
StereoCamBoard_11_111012.png

3.これで、Runボタンをクリックして、ガーバーファイルやドリルファイルを出力した。

4.これをKicadのGerbViewで見てみたが、Board Outlinesは表示されていない。
StereoCamBoard_12_111012.png

5.次に、Unplated Board Outlinesを選択してみた。Runボタンをクリックする。Board Outlinesが表示された。
StereoCamBoard_14_111012.png

Bottom Copperも同様にBoard Outlinesを表示させた。
WinMergeで表示した、両者の差分を下に示す。
StereoCamBoard_15_111012.png

これでFusion PCB に再度送ったのだが、どうだろう?うまくacceptしてくると良いんだが。。。

(2011/10/13:追記)
Fusion PCBから

Your order has been updated to the following status:
In production.


というメールがきました。ステータスの意味については下に引用します。

About order status:
1. Processing: Your order is being processed.
2. Shipped: Your order is collected for assignment by the forwarder.
3. Traceable: Tracking info for your order is available.
4. Waiting: Human interaction is needed for your order.
5. In production: Your PCB order is being manufactured.
6. Backorder: Your order contains at least one backordered item.
7. Combined: Your order is combined with your other orders.

Normally it takes 1-2 business days for the order status to change from
"Shipped" to "Traceable", since we need some extra time to collect tracking
information from the forwarder and update it to our system. You can track
your order at the top of website when its status reaches "Traceable".


ということで基板を作ってもらえるようです。良かったです。。。
  1. 2011年10月12日 21:22 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter KitでEDKを使ってカメラ表示26(独自にタイマーのカスタムIPを作る1)

Spartan-3A Starter KitでEDKを使ってカメラ表示25(LCD、Rotary EncoderカスタムIPの追加3)”からのつづきなのだが、”xps_timerとxps_intcの使い方2(APIを使用する)”からの続きでもある。

xps_timerの割り込みがどうしてもSpartan-3A Starter Kitでうまく動かないので、timerのカスタムIPを作ろうと思った。
Simple MicroBlazeにtimer.vhdがあるので、これを接続してみることにする。Simple MicroBlazeのファイル・アーカイブ(xapp1141.zip)

smm_timerのスレーブ・カスタムIPを作成した。
今回は一般的なスレーブ・カスタムIPの作成手順を箇条書きにして示そうと思う。

1.XPSのCreate and Import Peripheral WizardでカスタムIPのスケルトンを生成する。

2.vhdlフォルダに自作VHDLファイルを追加、またはVerilogフォルダを作って、自作Verilogソースを追加。

3.dataフォルダの.mpdファイルに外部へのポートを宣言する。

4.dataフォルダの.paoファイルに2.で追加したHDLファイルのエントリを追加する。

5.XPSでProjectメニューから> Rescan User Repositoriesを選択して、プロジェクトの変更をXPSに認識させる。

6.Add IPして、XPSのプロジェクトに追加する。

7.XPSのBus Interfacesタブで、バスを接続する。(今回はmb_plbに接続した)

8.XPSのPortsタブで、AddしたカスタムIPの必要なポートを外部ポートにする。(今回はなし)

9.内部ポートの接続がある場合には、XPSのPortsタブで接続する。

10.Addressesタブでアドレスを確認。自動的に割り当てられていない場合は、自分で割り当てる。

11.外部ポートのUCFを追加する。(今回はなし)

12.XPSを終了して、Project Navigatorでインプリメントする。

13.Project NavigatorでEDKプロジェクトを選択して、Export Hardware Design To SDK with Bitstreamをダブルクリックして、SDKを起動。

14.SDKでソフトウェアを作って、FPGAボードにダウンロードする。


以上のような手順となる。
今回のsmm_timerの場合は、xps_timerとxps_intcを削除して、microblazeのINTERRUPTと接続した。
Spa3A_SKit_OV7670_117_111012.png

アドレスは、0x840E0000から64Kバイトをマップした。
Spa3A_SKit_OV7670_118_111012.png

UCFの変更はなしなので、Project Navigatorでインプリメントした。
Spa3A_SKit_OV7670_119_111012.png

  1. 2011年10月12日 06:04 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

ステレオカメラ基板作成3(OV7670基板3)

ステレオカメラ基板作成2(OV7670基板2)”までで、DesignSpark PCBで作成した基板をFusion PCB に発注しました。発注した基板は以下の通りです。

Products
------------------------------------------------------
1 x Fusion PCB Service (PCB08511P)  = $24.90
    *onetime charges = $10.00
    PCB Qty. 10
    Layer 2
    PCB Thickness 1.6mm
    PCB Dimension 5cm Max*10cm Max
    Surface Finish Hasl
    PCB Color Yellow
    E-Test 50% E-test

------------------------------------------------------
Sub-Total: $34.90
Registered Air Parcel (Weight: 0.07 KG.Delivery Time:  10-30 Days): $3.52
Total: $38.42


日本円で、3,029円でした。
5cm x 10cmの黄色の基板です。目立ちますね。多分。黄色の基板は見たことがないので頼みました。

ガーバーデータとドリルデータも送りました。来るのが楽しみです。後ろのシルクを追加で入れて、かっこ良く?しました。
イラストを入れようと、DesignSpark PCBにイラストのDXFファイルをインポートしました。DXFのデータは読めたのですが、大きさがどうしても小さくなってしまうので、あきらめました。

デジキーでヒロセの100ピンコネクタのレセプタクルと、秋月でパスコン用の47uF 16V,と0.1uF 50Vを買いました。
基板が来るのが楽しみです。

うまく動作したら、欲しい方にMakeで、基板(300円)+ヒロセの100ピンコネクタのレセプタクル(558円)+パスコン(約20円)を実費で頒布したいと思っています。(金額は未定です)欲しい方はいるのかな?後、現在は在庫切れですが、aitendo のOV7670モジュールが2つ必要です。あくまで、サンプルをテストして動作したら?という条件付きです。。。

  1. 2011年10月10日 20:07 |
  2. プリント基板作成
  3. | トラックバック:0
  4. | コメント:0

猿の惑星、創世記(ジェネシス)を見てきました

今日は、奥さんと下の娘と私で、猿の惑星、創世記(ジェネシス)を見てきました。

猿の惑星シリーズは全部見ていると思います。やはり、初回のラストシーン、埋もれた自由の女神のシーンがとっても印象的です。
  1. 2011年10月09日 22:12 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

基板作成時の注意事項覚書

基板作成時の注意事項覚書です。

まだまだ修正中です。終わりがありませんね。適当な所で基板屋さんに出そうと思っています。

1.M3ネジの頭は5.5mm、3.2Φの穴の1.15mmまで頭が来るので、2mm程度、ベタを逃がす。

2.基板端面からベタを1mm程度逃がす。

3.小さい容量のコンデンサはICの電源端子の近くに、今回の場合ならば、基板の裏に逃がす。(Fキー)

4.サーマルに配線がかぶるので、GNDは配線を引かないで、なるべくGNDベタで接続する。

5.GNDベタが全面つながるように効果的にビアを打って配線し、GNDベタ配線領域を確保する。

6.GNDに繋がらないベタは、Removeするように設定する。
  1. 2011年10月09日 20:52 |
  2. プリント基板作成
  3. | トラックバック:0
  4. | コメント:0

ステレオカメラ基板作成2(OV7670基板2)

ステレオカメラ基板作成1(OV7670基板)”の続き。

ツイッターで、いろいろな方にアドバイスを頂いて、やっとステレオカメラ基板ができたんじゃないか?と思います。
下に基板の図を貼ります。
StereoCamBoard_4_111008.png

裏だけ、GNDベタににしてあります。

3D画面の表側です。
StereoCamBoard_5_111008.png

自分で作った部品の3Dモデルはないので、四角くなっています。

3D画面の裏側です。
StereoCamBoard_6_111008.png

私のツイッターのアカウントを入れてあります。
DesignSpark PCBはDXFファイルをインポートできるようなので、インポートしてみたのですが、インポートした図が見えなかったです。残念です、絵がシルクに入れば、娘のイラストを入れて、痛基板にしようと思っていたのですが。。。
DesignSpark PCBのShapeで書くという方法もありますが、自分でイラストをかけないというのが難点ですね。

(2011/10/09:追記)
アプロさんの助言を元に修正しました。電源ラインを太く、斜めに配線しました。2つのカメラのpclkの配線距離が違いすぎるので、片方をアコーディオン配線して、配線長を合わせました。
StereoCamBoard_7_111009.png

(もう一度追記)
表面もGNDベタを付けて、3.2Φの取付穴を付けました。小さいコンデンサを裏に回しました。
StereoCamBoard_8_111009.png

StereoCamBoard_9_111009.png

StereoCamBoard_10_111009.png
  1. 2011年10月08日 19:21 |
  2. プリント基板作成
  3. | トラックバック:0
  4. | コメント:4

DesignSpark PCB 2.02で部品を基板の裏に送る方法

DesignSpark PCB 2.02で部品を基板の裏に送る方法は、Fキー(Flip)でした。もしくは、部品を選択して右クリックメニューからFlipを選択すると部品が基板の裏に行きます。
DesignSparkPCB__111008.png

  1. 2011年10月08日 13:20 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:0

xps_timerとxps_intcの使い方2(APIを使用する)

xps_timerとxps_intcの使い方1(ソースコード・デバックができない)”で、どうやっても割り込みがかからないので、困ってしまった。xps_intcのControl/Status Register 0をMDMで見ると、LSBが1になっていて、割り込みは受け付けているみたいだ。その後、MicroBlazeに割り込みが入らないんだと思う。

独自のタイマーを付ける前に、APIを使ってタイマー割り込みを試してみようと思った。
Embedded System Tools Reference ManualEDK 12.4”の239ページのInterrupt Setup Exampleを少し改造して、やってみることにした。

ちなみに、12行目~14行目のdefine文は間にスペースがなくなっているので、下の記述に変更した。

#define TMRCTR_DEVICE_ID XPAR_TMRCTR_0_DEVICE_ID
#define INTC_DEVICE_ID XPAR_INTC_0_DEVICE_ID
#define TMRCTR_INTERRUPT_ID XPAR_INTC_0_TMRCTR_0_VEC_ID


RESET_VALUEを62500000にして、XPS_GPIO_LEDS_8BITの記述を追加した。

これで、Spartan-3A Starter KitのEDKでやってみようと思ったが、コンパイル後のELFファイルの大きさが、141,486バイトになってしまった。MicroBlazeのメモリは8Kバイトなので、入らない。仕方がないので、SP605ででも確かめて、後日追記する。
  1. 2011年10月08日 04:53 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

NetBeans IDE 7.0.1 でRubyを書く(Windows 7ではデバッカが起動できない)

”NetBeans IDE 6.8 でRubyをデバック”で、NetBeans IDEでRubyスクリプトを書いているということをブログに書いた。

RubyではパラメータからVHDLファイルを生成している。とても人力でVHDLを記述するのは無理なので、Rubyで自動生成させているわけだ。
RubyのIDEとして、NetBeans IDEを使用している。デバッカを便利に使っていたのだが、ある時から使えなくなってしまった。
今回、Windows 7 64bit版にNetBeans IDE 7.0.1をインストールして、Rubyを書きたいと思いインストールすることにした。

・ 最初にJAVA SEのJDK6をインストールした。

・ NetBeans IDE 7.0.1をここからインストールした。

・ NetBeans IDE 7.0.1では標準ではRubyをサポートしていないので、”NetBeans 7.0にRuby on Railsプラグインをインストールする手順”を見ながらRuby on Railsプラグインをインストールした。

・ JRuby 1.6.4 をダウンロードしてインストールした。

・ NetBeans IDE 7.0.1のツール・メニューからRubyプラットフォームを選択する。

・ Rubyプラットフォームマネージャーが開くので、”プラットフォームを自動検出”で自動検出させるか、”プラットフォームを追加”でjruby.exeを指定する。
NetBeans_1_111007.png

・ Rubyプラットフォームマネージャーの”Gem マネージャー”ボタンをクリックして、Gem マネージャーを開く。自動的に設定してくれるようだ。
NetBeans_2_111007.png

・ Gem マネージャーを閉じ、Rubyプラットフォームマネージャーを閉じる。

これで、設定は終了した。
今度は、デバッカの起動を試みる。

・ プログラムの先頭にブレークポイントを設定しておく。

・ NetBeans IDE 7.0.1のデバック・メニューから”ファイルをデバック”を選択する。

・ ダイアログが開く。そのまま、了解ボタンをクリックする。(プログラムの先頭にブレークポイントを設定したので、問題ないはず)
NetBeans_3_111007.png

・ デバッカが起動して、ブレークポイントで止まるはずが止まらない。
NetBeans_4_111007.png

結局、デバッカが動かなかった。
Windows 7 32ビット版でも同様だった。

次にVirtualBox 4.1.4を使用して、Windows XP SP3上に同様に、NetBeans IDE 7.0.1をインストールして、Rubyの設定を行なって、デバッカを起動したら、問題なく動作した。
NetBeans_5_111007

問題なくブレークポイントで止まっている。
Windows XP 32ビット版だと、NetBeans IDE 7.0.1のRubyデバックができるようだ。

  1. 2011年10月07日 12:24 |
  2. Ruby
  3. | トラックバック:0
  4. | コメント:0

SDKでNo source available for "" が出てソースコード・デバックできないときの対処方法

xps_timerとxps_intcの使い方1(ソースコード・デバックができない)”で、ソースコード・デバックをすることが、できなかった。
その時の対処方法をK林さんから教えていただいたので、備忘録として書いておこうと思う。K林さん、教えて頂いてありがとうございました。

現象を下に示す。

・SDKでXilinx ToolsメニューからProgram FPGAを選択した。Program FPGAダイアログが開くので、Programボタンをクリックしてビットファイルをダウンロードした。

・elfファイルで、右クリックして、右クリックメニューからDebug As -> Lanunch on Hardware を選択する。すると、No source available for "" が出てソースコード・デバックできない。。。(EDKのバージョンは13.2)
Spa3A_SKit_OV7670_116_111003.png


教えていただいたやり方を下に示す。
・SDKのXilinx ToolsメニューからGenerate linker script を選択する。
EDK_scode_debug_1_111006.png

・Generate linker scriptダイアログが開く。左上のOutput SettingsのOutput Script:のBrowseボタンをクリックして、プロジェクト名\src\lscript.ld を選択する。(私のプロジェクトだと、CamDisp_EDK_OV7670_LCD\SDK_Workspace\xps_timer_test\src)
EDK_scode_debug_2_111006.png

・Generateボタンをクリックして、lscript.ld を生成して、SDKのProjectメニューからBuild Allを行った。

・もう一度。デバックモードにした所、ソースコード・デバックが行えるようになった。
EDK_scode_debug_3_111006.png
  1. 2011年10月06日 05:57 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

ステレオカメラ基板作成1(OV7670基板)

EDKはカメラ表示回路は、カスタム・マスタIPを作成できて完成したが、そのあと、CMOSカメラの設定をMicroBlazeから変更するソフトウェアをつくるはずだった。しかし、”xps_timerとxps_intcの使い方1(ソースコード・デバックができない)”で書いたようにソースコード・デバックができないという事態が発生したので、ペンディングとすることにした。

今回は、MTM07にうまく行けばだそうかな?ということで、ステレオカメラ基板を作ることにした。Spartan-3A Starter Kitの拡張コネクタに刺さる拡張ボードとして作製する。OV7670用とOV9655用の両方を作ることにした。基板作成はFusion PCB Serviceに頼むことにする。基板厚0.8mm、大きさ5cmX10cm、色は赤にする予定だ。うまく動作すれば、基板を頒布したい。原価で頒布するか、無料で差し上げることにする。無料の場合はSpartan-3A Starter Kitを持っている方のみとしたい。

前回、”Spartan-3A Starter Kit用DVI出力拡張ボード(基板作成1)”を作っていたのだが、やはり2層基板にやるには無理があってやめてしまった。その部品を使えば比較的簡単に基板がつくれそうだ。

まずは、OV7670用のステレオカメラ基板から作ることにした。以前、練習したDesignSpark PCBで作ることにした。現在のバージョンは2.02だ。
下に回路図を示す。至ってシンプル。
StereoCamBoard_1_111005.png

これを5×10cmの基板にして、目の間隔、約6cmにカメラを離して配置して、Curve Miter TrackでAuto Routeしたのが下の図になる。1,2本手動で配線したが、ほぼ、オートルータに任せた。
StereoCamBoard_2_111005.png

まだラッツネットがあるし、基板の余白を埋めていないので完成ではないが、配線はこれで良いかな?と思っている。

初めて基板を作るので、何かおかしい所があったら教えて下さい。よろしくお願いします。
  1. 2011年10月05日 06:09 |
  2. プリント基板作成
  3. | トラックバック:0
  4. | コメント:6

xps_timerとxps_intcの使い方1(ソースコード・デバックができない)

Spartan-3A Starter KitでEDKを使ってカメラ表示25(LCD、Rotary EncoderカスタムIPの追加3)”の続きなんだが、その前に、今回はxps_timerとxps_intcの使い方を探ってみよう。

前回、”axi_timerを使う1”、”axi_timerを使う2(割り込みを使用した)”でaxi_timerの使い方を学んだ。
それより前では、”XPS_TIMERをテスト”でXMDを使って、xps_timerをテストしてみた。今回は、インタラプト・コントローラ(xps_intc) 付きの xps_timer に付いて、使い方を探ってみようと思う。

まずは、Project Navigator のProcessesウインドウのExport Hardware Design To SDK with Bitstream をダブルクリックして、SDKを立ち上げる。
SDKが立ち上がった。
Spa3A_SKit_OV7670_109_111001.png

試しに本番のlcd_rot_contプロジェクトを作ってみたが、今回は、xps_timer_testプロジェクトを作成する。これは、XilinxのCプロジェクトだ。
そこに、xps_timer_test.c を新規作成した。
Spa3A_SKit_OV7670_110_111002.png

今回は、ハードウェアを直接アクセスして制御してみようと思う。
axi_timerを使う2(割り込みを使用した)”のCコードをベースに、GPIOで接続されたLEDを点滅してみることにする。

参照データシート
”LogiCORE IP XPS Interrupt Controller (v2.01a)
LogiCORE IP XPS Timer/Counter (v1.02a)
XPS General Purpose Input/Output (GPIO) (v2.00a)

次に、XPSの設定を下に貼っておく。最初はxps_intcから。
Spa3A_SKit_OV7670_111_111002.png

ここで、Number of Interrupt Inputs が2になっているが、XPSのPortsタブで見ると、Iが1つしかないのが謎だ?
Spa3A_SKit_OV7670_112_111002.png

xps_timerの設定を下に示す。
Spa3A_SKit_OV7670_113_111002.png

xps_gpioの設定を下に示す。
Spa3A_SKit_OV7670_114_111002.png

Spa3A_SKit_OV7670_115_111002.png

・SDKでXilinx ToolsメニューからProgram FPGAを選択した。Program FPGAダイアログが開くので、Programボタンをクリックしてビットファイルをダウンロードした。

・elfファイルで、右クリックして、右クリックメニューからDebug As -> Lanunch on Hardware を選択する。すると、No source available for "" が出てソースコード・デバックできない。。。(EDKのバージョンは13.2)
Spa3A_SKit_OV7670_116_111003.png

デバック時にソースコード・デバックできないのは痛い。

今回のトラブルには関係ないが、タイマーの便利な使用方法。”11.1 EDK - Microblaze のプロセッサ実行サイクルを計算する方法”タイマーで実行サイクルを計算する方法。

バグっているのが確実だが、現在のCソースを貼っておく。

/* xps_timer_test.c * *  Created on: 2011/10/02 *      Author: Masaaki *  *  65MHzクロック */

#include "xbasic_types.h"
#include "xio.h"
#include "mb_interface.h"
#include "xparameters.h"

// XPS_INTC define
#define XPS_INTC_0_ISR        XPAR_XPS_INTC_0_BASEADDR        // Interrupt Status Register
#define XPS_INTC_0_IPR        XPAR_XPS_INTC_0_BASEADDR+0x4    // Interrupt Pending Register
#define XPS_INTC_0_IER        XPAR_XPS_INTC_0_BASEADDR+0x8    // Interrupt Enable Register
#define XPS_INTC_0_IAR        XPAR_XPS_INTC_0_BASEADDR+0xC    // Interrupt Acknowledge Register
#define XPS_INTC_0_SIE        XPAR_XPS_INTC_0_BASEADDR+0x10    // Set Interrupt Enable Bits
#define XPS_INTC_0_CIE        XPAR_XPS_INTC_0_BASEADDR+0x14    // Clear Interrupt Enable Bits
#define XPS_INTC_0_IVR        XPAR_XPS_INTC_0_BASEADDR+0x18    // Interrupt Vector Register
#define XPS_INTC_0_MER        XPAR_XPS_INTC_0_BASEADDR+0x1C    // Master Enable Register

// XPS_TIMER define
#define XPS_TIMER_0_TCSR0    XPAR_XPS_TIMER_0_BASEADDR    // Control/Status Register 0
#define XPS_TIMER_0_TLR0    XPAR_XPS_TIMER_0_BASEADDR+0x4    // Load Register 0
#define XPS_TIMER_0_TCR0    XPAR_XPS_TIMER_0_BASEADDR+0x8    // Timer/Counter Register 0
#define XPS_TIMER_0_TCSR1    XPAR_XPS_TIMER_0_BASEADDR+0x10    // Control/Status Register 1
#define XPS_TIMER_0_TLR1    XPAR_XPS_TIMER_0_BASEADDR+0x14    // Load Register 1
#define XPS_TIMER_0_TCR1    XPAR_XPS_TIMER_0_BASEADDR+0x18    // Timer/Counter Register 1

// XPS_GPIO_LEDS_8BIT define
#define XPS_GPIO_LEDS_8BIT_DATA    XPAR_LEDS_8BIT_BASEADDR        // データ
#define XPS_GPIO_LEDS_8BIT_TRI    XPAR_LEDS_8BIT_BASEADDR+0x4    // 0 - Output, 1 - Input

#define ENABLE_ALL_TIMERS                (0x1<<10)
#define ENABLE_PULSE_WIDTH_MODULATION    (0x1<<9)
#define    TIMER_INTERRUPT                    (0x1<<8)
#define ENABLE_TIMER                    (0x1<<7)
#define ENABLE_INTERRUPT                (0x1<<6)
#define LOAD_TIMER                        (0x1<<5)
#define AUTO_RELOAD_HOLD_TIMER            (0x1<<4)
#define ENABLE_EXT_CAPTURE_TRIG            (0x1<<3)
#define ENABLE_EXT_GENERATE_SIG            (0x1<<2)
#define DOWN_UP_COUNT_TIMER                (0x1<<1)
#define TIMER_MODE_CAP_GENE                (0x1)

int interrupt = 0;

void xps_intc_init() {
    *(volatile unsigned int *)(XPS_INTC_0_IER) = 0x80000000;    // int0 enable
    *(volatile unsigned int *)(XPS_INTC_0_MER) = 0x1;        // IRQ Enable
}

void xps_timer_init(){
    *(volatile unsigned int *)(XPS_TIMER_0_TLR0) = 62500000// 1秒 1000,000,000ns/16ns = 62,500,000
    // *(volatile *)(XPS_TIMER_0_TLR0) = 0x00989680; // 0.2秒
    *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | LOAD_TIMER; // TLR0へロード
    *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | DOWN_UP_COUNT_TIMER; // GenerateモードでDWONカウント、割り込みあり
}

void timer_int_handler(void * arg) {
    interrupt = 1;
}

int main()
{
    unsigned char i;

    *(volatile unsigned int *)(XPS_GPIO_LEDS_8BIT_TRI) = 0;    // 出力設定
    *(volatile unsigned int *)(XPS_GPIO_LEDS_8BIT_DATA) = 1;
    xps_intc_init();    // xps_intc の初期化
    xps_timer_init(); // xps_timerの初期化
    //*(volatile unsigned char *)(XPS_GPIO_LEDS_8BIT_TRI) = 0;    // 出力設定

    // 割り込みハンドラ登録、割り込み許可
    microblaze_register_handler(timer_int_handler, (void *) 0);
    microblaze_enable_interrupts();

    i = 1;
    while(1){
        *(volatile unsigned char *)(XPS_GPIO_LEDS_8BIT_DATA) = i;

        // xps_timter割り込み待ち
        interrupt = 0;
        while(interrupt==0);
        
        // 割り込み待ちループから抜け出す
        *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | DOWN_UP_COUNT_TIMER | TIMER_INTERRUPT;    // 割り込みクリア
        *(volatile unsigned int *)(XPS_INTC_0_IAR) = 0x80000000;    // int0 clear

        *(volatile unsigned int *)(XPS_TIMER_0_TLR0) = 62500000// 1秒 1000,000,000ns/16ns = 62,500,000
        *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | LOAD_TIMER; // TLR0へロード、割り込みクリア
        *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | DOWN_UP_COUNT_TIMER; // GenerateモードでDWONカウント、割り込みあり
    }

    return 0;
}



(2011/10/06:追記)
K林さんに間違いを指摘して頂いて、コードを修正しましたが、まだ割り込みがかかっていないようです。何でしょうか?現在のコードを貼っておきます。

/* * xps_timer_test.c * *  Created on: 2011/10/02 *      Author: Masaaki *  *  65MHzクロック */

#include "xbasic_types.h"
#include "xio.h"
#include "mb_interface.h"
#include "xparameters.h"

// XPS_INTC define
#define XPS_INTC_0_ISR        XPAR_XPS_INTC_0_BASEADDR        // Interrupt Status Register
#define XPS_INTC_0_IPR        XPAR_XPS_INTC_0_BASEADDR+0x4    // Interrupt Pending Register
#define XPS_INTC_0_IER        XPAR_XPS_INTC_0_BASEADDR+0x8    // Interrupt Enable Register
#define XPS_INTC_0_IAR        XPAR_XPS_INTC_0_BASEADDR+0xC    // Interrupt Acknowledge Register
#define XPS_INTC_0_SIE        XPAR_XPS_INTC_0_BASEADDR+0x10    // Set Interrupt Enable Bits
#define XPS_INTC_0_CIE        XPAR_XPS_INTC_0_BASEADDR+0x14    // Clear Interrupt Enable Bits
#define XPS_INTC_0_IVR        XPAR_XPS_INTC_0_BASEADDR+0x18    // Interrupt Vector Register
#define XPS_INTC_0_MER        XPAR_XPS_INTC_0_BASEADDR+0x1C    // Master Enable Register

// XPS_TIMER define
#define XPS_TIMER_0_TCSR0    XPAR_XPS_TIMER_0_BASEADDR    // Control/Status Register 0
#define XPS_TIMER_0_TLR0    XPAR_XPS_TIMER_0_BASEADDR+0x4    // Load Register 0
#define XPS_TIMER_0_TCR0    XPAR_XPS_TIMER_0_BASEADDR+0x8    // Timer/Counter Register 0
#define XPS_TIMER_0_TCSR1    XPAR_XPS_TIMER_0_BASEADDR+0x10    // Control/Status Register 1
#define XPS_TIMER_0_TLR1    XPAR_XPS_TIMER_0_BASEADDR+0x14    // Load Register 1
#define XPS_TIMER_0_TCR1    XPAR_XPS_TIMER_0_BASEADDR+0x18    // Timer/Counter Register 1

// XPS_GPIO_LEDS_8BIT define
#define XPS_GPIO_LEDS_8BIT_DATA    XPAR_LEDS_8BIT_BASEADDR        // データ
#define XPS_GPIO_LEDS_8BIT_TRI    XPAR_LEDS_8BIT_BASEADDR+0x4    // 0 - Output, 1 - Input

#define ENABLE_ALL_TIMERS                (0x1<<10)
#define ENABLE_PULSE_WIDTH_MODULATION    (0x1<<9)
#define    TIMER_INTERRUPT                    (0x1<<8)
#define ENABLE_TIMER                    (0x1<<7)
#define ENABLE_INTERRUPT                (0x1<<6)
#define LOAD_TIMER                        (0x1<<5)
#define AUTO_RELOAD_HOLD_TIMER            (0x1<<4)
#define ENABLE_EXT_CAPTURE_TRIG            (0x1<<3)
#define ENABLE_EXT_GENERATE_SIG            (0x1<<2)
#define DOWN_UP_COUNT_TIMER                (0x1<<1)
#define TIMER_MODE_CAP_GENE                (0x1)

int interrupt = 0;

void xps_intc_init() {
    *(volatile unsigned int *)(XPS_INTC_0_IER) = 0x1;    // int0 enable
    *(volatile unsigned int *)(XPS_INTC_0_MER) = 0x3;    // IRQ Enable
}

void xps_timer_init(){
    *(volatile unsigned int *)(XPS_TIMER_0_TLR0) = 62500000// 1秒 1000,000,000ns/16ns = 62,500,000
    // *(volatile *)(XPS_TIMER_0_TLR0) = 0x00989680; // 0.2秒
    *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | LOAD_TIMER; // TLR0へロード
    *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | DOWN_UP_COUNT_TIMER; // GenerateモードでDWONカウント、割り込みあり
}

void timer_int_handler(void * arg) {
    interrupt = 1;
}

int main()
{
    unsigned int i;

    *(volatile unsigned int *)(XPS_GPIO_LEDS_8BIT_TRI) = 0;    // 出力設定
    *(volatile unsigned int *)(XPS_GPIO_LEDS_8BIT_DATA) = 1;
    xps_intc_init();    // xps_intc の初期化
    xps_timer_init(); // xps_timerの初期化
    // *(volatile unsigned char *)(XPS_GPIO_LEDS_8BIT_TRI) = 0;    // 出力設定

    // 割り込みハンドラ登録、割り込み許可
    microblaze_register_handler(timer_int_handler, (void *) 0);
    microblaze_enable_interrupts();

    for(i=10; i<256; i++){
        *(volatile unsigned int *)(XPS_GPIO_LEDS_8BIT_DATA) = i;

        // xps_timter割り込み待ち
        interrupt = 0;
        while (interrupt==0);
        
        // 割り込み待ちループから抜け出す
        *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | DOWN_UP_COUNT_TIMER | TIMER_INTERRUPT;    // 割り込みクリア
        *(volatile unsigned int *)(XPS_INTC_0_IAR) = 0x1;    // int0 clear

        *(volatile unsigned int *)(XPS_TIMER_0_TLR0) = 62500000// 1秒 1000,000,000ns/16ns = 62,500,000
        *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | LOAD_TIMER; // TLR0へロード、割り込みクリア
        *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | DOWN_UP_COUNT_TIMER; // GenerateモードでDWONカウント、割り込みあり
    }

    return 0;
}



(2011/10/07:追記)
SP605で同じCコードでxps_timerのテストをしてみたのですが、問題なく動作しました。
Spartan-3A Starter Kitでは、どうしても、うまく行きません。もう1つ、新規でEDKのプロジェクトを作成してやって見ましたが、やはり、割り込みはかかってないみたいでした。
Spartan-3A Starter KitのEDKでxps_timer, xps_intcの割り込み動作がおかしいようなので、独自のタイマーを組み込んでみようと思っています。
  1. 2011年10月03日 21:05 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:5

桐の板に彫刻

木製アタッシュケースに加工しようということで、今日もFPGA-CAFEに行って、レーザー加工機で桐の板を彫刻してきました。

桐の板を一定の厚さに彫刻して、違う色の薄い木の板を同じ模様に切り取って貼付け、象嵌しようと思っていました。けれども、木の柔らかさが一定でないので、レーザーの出力が同じでもでこぼこが出来てしまって、あきらめました。
でも、彫刻がとても良い感じです。彫刻だけで十分かっこいいと思いました。下は加工サンプルです。
tyoukoku_111002.jpg

本番はもちょっと後で箱にする加工を施してからやりたいと思います。

すすたわりさん、いろいろ教えて頂いて、ありがとうございます。またよろしくお願いします。
  1. 2011年10月02日 19:31 |
  2. 木工
  3. | トラックバック:0
  4. | コメント:0
»