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

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

FPGAの部屋

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

7 シリーズ ファミリ デザインセミナに申し込みました

7月28日、29日に開催されるXilinx社の7 シリーズ ファミリ デザインセミナに申し込みました。コース スケジュールはこちら
現在、無料で受講することができます。どんな新機能があるんでしょう?楽しみです。

EDKも受講してみたいと思っています。カスタム・ペリフェラルを作ってみたいです。これからはEDKによる開発が主流なるのかも?と思っています。AXIバスになって、MicroBlaze抜きまたは、MicroBlazeが脇役でもシステムを構築できると良いと思っています。
  1. 2011年06月30日 04:55 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

SMMのシミュレーション(NetGenとData2MEMを使用する)

The Simple MicroBlaze Microcontroller 6(シミュレーション)”で”SMMの問題点はシミュレーションができないことだと思う。実機デバックはできるが、シミュレーションは出来ない。”と書いたが、ひでみさんのブログや”AQUAXIS TECHNOLOGY”を見ていたら、ヒントがあったので、自分でやってみた。

The Simple MicroBlaze Microcontroller 6(シミュレーション)”のシミュレーション環境を使って、もう一度やり直してみた。

1.Simple_MicroBlaze_xapp1141\SMM_Ref\S3A_LCD_Ref\Work フォルダにsimulationフォルダを作成した。
SMM_sim_1_110626.png

2.コマンドプロンプトを起動して、ISEのインストールフォルダ(Xilinx\13.1\ISE_DS)のsettings32.bat(64ビット版の方はsettings64.bat?)を実行して、環境関数をセットする。

3.Simple_MicroBlaze_xapp1141\SMM_Ref\S3A_LCD_Ref\simulationに移動する。

4.まずは、NetGenコマンドでsmm.ngc をVerilogファイルに変換する。コマンドプロンプトで

%XILINX%\bin\nt\netgen -sim -ofmt verilog -mhf -w ..\ise\smm.ngc


を実行する。
SMM_sim_3_110626.png

5.smm.v、lmb_bram_wrapper_sim.v、lmb_bram_elaborate_sim.vが生成された。Verilogで書かれたネットリストだ。
SMM_sim_4_110626.png

6.次にData2MEMで命令ROM用の初期化データ、つまりソフトウェアが入った初期化データを生成する。コマンドプロンプトで

%XILINX%\bin\nt\data2mem -bm ..\ise\smm_bd.bmm -bd ..\sdk\empty_application_0\Debug\empty_application_0.elf -bx ./


を実行する。”-bx”オプションを付けるとmemファイルが生成される。
SMM_sim_5_110628.png

7.4つのmemファイルが生成された。そのうちのlmb_bram_combined_0.mem の一部を下に示す。このファイルは、lmb_bram_elaborate_sim.v のRAMB16BWEに書かれている

.INIT_FILE ( "lmb_bram_combined_0.mem" ),


に従って、RAMB16BWEプリミティブの初期化データとして読み込まれる。

@00000014
    31 30 30 B9 80 B9 30 B8 E0 30 BE F9 B8 E9 F8 99 80 E8 E8 BE 30 B0 30 BC 30 99 80 30 F0 E9 B6 30


8.次にISimのプロジェクトファイル (lcd_ref_tb.prj) を作る。プロジェクトに入るHDLソースファイルとしては、lcd_ref.vhd、SMM、lcd_ctlr.vhd、timer.vhdとテストベンチのlcd_red_tb.vhd、そして先ほど生成したVerilogソースファイルだ。
SMM_sim_2_110626.png

verilog work smm.v
verilog work lmb_bram_wrapper_sim.v
verilog work lmb_bram_elaborate_sim.v
verilog work lcd_test_rom_init.v
vhdl work ../src/timer.vhd
vhdl work ../src/lcd_ctlr.vhd
vhdl work ../src/lcd_ref.vhd
vhdl work ../Work/src/Simulation/lcd_ref_tb.vhd
verilog work glbl.v


9.fuseコマンドでコンパイルを行う。下にコマンドを示す。

%XILINX%\bin\nt\fuse work.lcd_ref_tb work.glbl -L unisims_ver=K:\HDL\Xilinx\13.1\ISE_DS\ISE\verilog\hdp\nt\unisims_ver -L unisim=K:\HDL\Xilinx\13.1\ISE_DS\ISE\vhdl\hdp\nt\unisim -o lcd_ref_tb.exe -prj lcd_ref_tb.prj


10.コンパイルが正常終了したら、出来上がったlcd_ref_tb.exeを-guiモードで起動する。

lcd_ref_tb.exe -gui


SMM_sim_6_110628.png

11.ISimが立ち上がる。適当に信号を入れてみてみると、動いているようだ。下にMicroBlazeのデコード部の波形を示す。openMSP430の様にアセンブラを表示したいと思った。
SMM_sim_7_110628.png

動いていると思う。タイマーとかがあるとシミュレーション時間も長くなるし、バスモデルだけのシミュレーションの方が良い場合も多いと思う。それをクリアしたら、SDKでソフトウェアの実機デバックをする。Spartan-6、Virtex-5、Virtex-6だと、一緒にChipscope Proも使用できるので、更にデバック効率が上がることだろうと思う。

#やっとSMMのシミュレーションが物になりました。結構、いろいろなマニュアルを読んだりして、大変だったが勉強になりました。
  1. 2011年06月28日 19:56 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:0

MITR Workshop

今日はFPGA-CAFEで、いえながさんのマルチインターバルタイマーリモコンのVer.2βを購入して、作ってきました。
このために、Pentax のコンパクトデジカメOptio S1を購入して持って行きましたが、動きませんでした。
急遽、リモコンを購入して、AVRマイコンを調整していただけることになりました。いえながさん、ありがとうございます。いつでも良いのでよろしくお願いします。
下がMITR Ver.2βです。とても良く出来ています。乾電池ホルダのの穴にボルトで基板を固定することができます。AVRマイコンは預かっていただきました。
MITR_110626.jpg

1時間くらいで完成しました。基板が小さいので、基板を指で押さえながら作る必要がありましたが、部品点数もそんなに多くなく作り易かったです。
対応していないカメラがあったので、そのデバックが始まって、カメラリモコンパルスもオシロで観察できたし、ノウハウも聞けました。面白かったです。私もリモコンが来たら太陽電池に照射して波形を見てみようと思います。

皆さん、ありがとうございました。
  1. 2011年06月26日 21:05 |
  2. マイコン関連
  3. | トラックバック:0
  4. | コメント:0

座卓作成

ここのところ、木工では座卓を作っています。家では欲しい家具を作り尽くしてしまったので、妹から頼まれた座卓を作っています。
パイン合板をはいで天板を作り、今日足を付けました。
zataku_1_110625.jpg

今、ウレタンニスで塗装をしています。2回目の裏です。1回目が乾いたら、250番の紙やすりでなく、250番のスポンジヤスリで表面を整えます。紙やすりでやると、すぐ目詰まりしますが、スポンジヤスリだと目詰まりしても叩けば飛ぶので便利です。
zataku_2_110625.jpg

もう1回程度、3度塗りくらいすると完成です。
  1. 2011年06月25日 17:50 |
  2. 木工
  3. | トラックバック:0
  4. | コメント:0

SUPER8(映画)を見てきた

昨日は、奥さんが休みだったので、私も午後休暇を取って、一緒にランチ+映画に行ってきました。
映画はSUPER8、奥さんの話では、ETの続編ということでした。
ETはその昔、ロサンゼルスのユニバーサル・スタジオに行ったときにアトラクションに入ったことがあります。
楽しみにして行ったのですが、エイリアンみたいで怖かったです。私は怖い映画は嫌いなので、失敗したかな?と思いましたが、最後はハッピーエンドでよかったです。(でも何人かは食われてしまったという設定なんだろう?と思いますが。。。)
  1. 2011年06月25日 05:07 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

openMSP430のシミュレーション3(ISimでシミュレーションを試みる2)

openMSP430のシミュレーション2(ISimでシミュレーションを試みる1)”の続き。

1.前回は、バイト・イネーブル付きのRAMをSpartan-3でインプリメントしたら、SLICEMが使用されてしまった。よって、バイト・イネーブル無しの下のVerilogコードに変更した。

//
// 16ビット幅、2048ワードRAM
//

module  rom_16x2k  (clk, we,  en, addr,  din,  dout);
   parameter DATA_WIDTH = 16;
   parameter ADDR_WIDTH = 11;

   input    wire [DATA_WIDTH-1:0] din;
   input    wire [ADDR_WIDTH-1:0] addr;
   input    wire we;
   input    wire clk;
    input wire en;
   output    reg [DATA_WIDTH-1:0] dout;

   (* RAM_STYLE="BLOCK" *) reg [DATA_WIDTH-1:0] ram [2**ADDR_WIDTH-1:0];

   initial
      $readmemh("rom_16x2k.data", ram, 0, 2047);

   always @(posedge clk)
      if (en) begin
         dout  <= ram[addr];
         if (we)
            ram[addr] <= din;
      end
endmodule


2.上のrom_16x2k.v を使うために、openmsp430\trunk\fpga\xilinx_diligent_s3board\rtl\verilog\openMSP430_fpga.v の801行目からの”// Program Memory”をrom_8x2k_hi, rom_8x2k_lo からrom_16x2k.v にインスタンスを切り替えた。Verilogコードを下に示す。

// Program Memory
// rom_8x2k_hi rom_8x2k_hi_0 (
    // .addr         (pmem_addr),
    // .clk          (clk_sys),
    // .din          (pmem_din[15:8]),
    // .dout         (pmem_dout[15:8]),
    // .en           (pmem_cen),
    // .we           (pmem_wen[1])
// );

// rom_8x2k_lo rom_8x2k_lo_0 (
    // .addr         (pmem_addr),
    // .clk          (clk_sys),
    // .din          (pmem_din[7:0]),
    // .dout         (pmem_dout[7:0]),
    // .en           (pmem_cen),
    // .we           (pmem_wen[0])
// );

assign we_node = ~(pmem_wen[1] & pmem_wen[0]);
rom_16x2k rom_16x2k_inst (
    .addr         (pmem_addr),
    .clk          (clk_sys),
    .din          (pmem_din),
    .dout         (pmem_dout),
    .en           (~pmem_cen),
    .we           (we_node)
);


3.ISEのプロジェクトのあるopenmsp430\trunk\fpga\xilinx_diligent_s3board\synthesis\Synth131にrom_16x2k の初期化データファイルrom_16x2k.dataをコピーした。

4.openmsp430\trunk\fpga\xilinx_diligent_s3board\bench\verilog\tb_openMSP430_fpga.v を以下のように変更した。

4.1 126行目から137行目までの元のROMの初期化データをコメントアウトした。

//initial
// begin
//    // Read memory file
//    #10 $readmemh("./pmem.mem", pmem);
//
//    // Update Xilinx memory banks
//    for (i=0; i<2048; i=i+1)
//    begin
//       dut.rom_8x2k_hi_0.inst.mem[i] = pmem[i][15:8];
//       dut.rom_8x2k_lo_0.inst.mem[i] = pmem[i][7:0];
//    end
//end


4.2 シミュレーションが100psで止まってしまうので、357行目から377行目までをコメントアウトした。

// initial // Normal end of test
  // begin
     // @(inst_pc===16'hffff)
     // $display(" ===============================================");
     // if (error!=0)
       // begin
      // $display("|               SIMULATION FAILED               |");
      // $display("|     (some verilog stimulus checks failed)     |");
       // end
     // else if (~stimulus_done)
       // begin
      // $display("|               SIMULATION FAILED               |");
      // $display("|     (the verilog stimulus didn't complete)    |");
       // end
     // else 
       // begin
      // $display("|               SIMULATION PASSED               |");
       // end
     // $display(" ===============================================");
     // $finish;
  // end


5.openmsp430\trunk\fpga\xilinx_diligent_s3board\bench\verilogのtb_openMSP430_fpga.v とmsp_debug.v をシミュレーション用ファイルとして、プロジェクトに追加した。
openMSP430_26_110624.png

6.ISimのプロパティの-i(インクルード)に、K:\HDL\FndtnISEWork\openmsp430\trunk\fpga\xilinx_diligent_s3board\rtl\verilog\openmsp430|K:\HDL\FndtnISEWork\openmsp430\trunk\fpga\xilinx_diligent_s3board\rtl\verilog\openmsp430\periph|K:\cygwin\home\Masaaki\xilinx_diligent_s3board\sim\rtl_sim\run を設定した。
openMSP430_27_110624.png

7.3us シミュレーションを行うと、openMSP430が動作しているのが見えた。
openMSP430_28_110624.png

これでシミュレーションはできそうだ。この方法で行くと、data2memを実行しなくても、ソフトウェアをロードすることができる。

(2011/06/27:追記)
data2memを実行しない状態での実機での動作を確認しました。
しかし、これだとソフトウェアを修正後にインプリメントが必要なので、data2memにもメリットがあると思う。
  1. 2011年06月24日 21:03 |
  2. FPGA内蔵マイクロコントローラ
  3. | トラックバック:0
  4. | コメント:0

カメラ表示用プラットフォームが完成

XilinxのXUPV5-LX110Tを使用したカメラ表示用プラットフォームが完成した。これをベースにいろいろな実験的な回路を実装する予定だ。
カメラはアプティナ社のMT9T031をカメラモジュールとして使用したカメラを購入して使用している。MT9T031は48MHzで動作している。2048x1536ピクセルのCMOSカメラだ。
DVI表示用ICは、XUPV5-LX110Tに搭載されているCH7301Cを使用している。出力画面は、1024x768のXGAでRGB各8ビットずつになっている。
CamDispPH_1_110624.jpg

CamDispPH_2_110624.jpg

画像はMIGを使用して、DDR2-SDRAMのSO-DIMMモジュールにバッファしている。
CamDispPH_3_110624.jpg
(注:ディスプレイ画面は一部、ガウスフィルタでぼかしてあります)

綺麗に映っていると思う。
なお、カメラからのクロックはDCMに入力してはおかしくなるようだ。現在は、BUFGを通して直接内部クロックの1つとして使用している。
  1. 2011年06月24日 04:44 |
  2. XUPV5-LX110T
  3. | トラックバック:0
  4. | コメント:0

openMSP430のシミュレーション2(ISimでシミュレーションを試みる1)

openMSP430のシミュレーション1”ではopenMSP430のシミュレーションスクリプトを試してみたが、動作させることが出来なかった。今回はISimでのシミュレーションを試みる。

VerilogでXSTにBlock RAMを推論させる”で最後に試したバイト・イネーブル付きのRAMを実装することにした。そのrom_16x2k.v を下に示す。(注:Spartan-3ではバイト・イネーブル付きRAMはSLICEMに実装されるのでだめでした。バイト・イネーブル無しRAMに後で変更します)(”VerilogでXSTにBlock RAMを推論させる”のもう一度追記参照)

//
//  16ビット幀048ワードRAM
//

module  rom_16x2k  (clk, we,  en, addr,  din,  dout);
   parameter DATA_WIDTH = 16;
   parameter ADDR_WIDTH = 11;

   input    wire [DATA_WIDTH-1:0] din;
   input    wire [ADDR_WIDTH-1:0] addr;
   input    wire [1:0] we;
   input    wire clk;
    input wire en;
   output    reg [DATA_WIDTH-1:0] dout;

   (* RAM_STYLE="BLOCK" *) reg [DATA_WIDTH-1:0] ram [2**ADDR_WIDTH-1:0];
   reg [(DATA_WIDTH/2)-1:0] di0, di1;

   //  The following code is only necessary if you wish to initialize the RAM 
   //  contents via an external file (use $readmemb for binary data)
   initial
      $readmemh("rom_16x2k.data", ram, 0, 2047);

   always @(we, din) begin
      if (we[0])
         di0 = din[(DATA_WIDTH/2)-1:0];
      else
         di0 = ram[addr][(DATA_WIDTH/2)-1:0];
      if (we[1])
         di1 = din[DATA_WIDTH-1:DATA_WIDTH/2];
      else
         di1 = ram[addr][DATA_WIDTH-1:DATA_WIDTH/2];
   end

   always @(posedge clk)
      if (en) begin
         dout  <= {di1,di0};
         ram[addr] <= {di1,di0};
      end
endmodule


さて、これにelfファイルのソフトウェアを初期値として入力する方法を考える。

Spartan3 Stater KitのMSP430は、どうやってシミュレーションをしようとしているかを見ていこう。
シミュレーション用のスクリプトの”xilinx_diligent_s3board\sim\rtl_sim\bin\msp430sim"は、make で作成したelfファイルを、

msp430-objcopy -O ihex pmem.elf pmem.ihex


で、Intel Hex形式に直している。その後、ihex2mem.tclで、memファイルに変換している。

../bin/ihex2mem.tcl -ihex pmem.ihex -out pmem.mem -mem_size $pmemsize


この、pmem.memの代わりに、rom_16x2k.dataとして、出力するようにihex2mem.tclを修正し、ihex2data.tclとした。ihex2data.tclで変更した部分を下に示す。141行目からを以下のように変更した。

# Writing memory array to file
for {set i 0} {$i <= ($num_word-1)} {incr i} { 
    puts -nonewline $f_out "[format "%02s" $mem_arr($i) ]\n"
}

puts  $f_out "\n"
close $f_out

exit 0


修正したihex2data.tcl で以下のようにCygwin上でコマンドを実行してrom_16x2k.data を作成した。

./ihex2data.tcl -ihex pmem.ihex -out rom_16x2k.data -mem_size 4098


すると、rom_16x2k.data が作成された。rom_16x2k.data の一部を下に示す。

4031
0300
40B2
5A80
0120
403F
0000
930F
2405
832F


  1. 2011年06月22日 05:34 |
  2. FPGA内蔵マイクロコントローラ
  3. | トラックバック:0
  4. | コメント:0

VerilogでXSTにBlock RAMを推論させる

以前にVHDLでBlock RAMを推論させて、外部ファイルの初期化データをロードする方法をやってみたが(”VHDLでのブロックRAMや分散RAMの初期化(16進数で書かれた外部データファイル)”)、今回はVerilogで同様のことをやってみた。

XSTユーザーガイド(Virtex-4、Virtex-5、Spartan-3 および CPLD デバイス用) UG627 (v 12.4) 2010年 12月14日の254ページのv_rams_20cを参考に、バス幅などを変更した。使用したISEは13.1。FPGAはVirtex-5 LX110T-1。ソースコードを下に示す。

//
//  Initializing  Block  RAM  from  external  data  file
//

module  v_rams_20c  (clk, we,  addr,  din,  dout);
    input  clk;
    input  we;
    input  [4:0]    addr;
    input  [15:0]    din;
    output  [15:0]    dout;
    reg  [15:0]  ram  [0:31];
    reg  [15:0]  dout;
    
    initial begin
        $readmemh("rams_20c.data",ram,  0,  31);
    end
    
    always  @(posedge  clk) begin
        if  (we)
            ram[addr]  <=  din;
            
        dout  <=  ram[addr];
    end
endmodule


rams_20c.dataを下に示す。

AABB
CCDD
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000


これでインプリメントして、FPGA Editorで見てみた。結果は、Block RAMがインスタンスされずに、SLICEMで実装された。
Verilog_BRAM_1_110621.png

これで、困っていたところ、ツイッターで@osamu_takeuchiさんに(* RAM_STYLE="BLOCK" *)を教えていただいた。

reg [15:0] ram [0:31];



(* RAM_STYLE="BLOCK" *) reg [15:0] ram [0:31];


に変更して、もう一度インプリメントしてみた。FPGA Editorで見たところ、Block RAMがインスタンスされていた。
Verilog_BRAM_2_110621.png

初期値も代入されていた。
Verilog_BRAM_3_110621.png

VHDLでは、デフォルトでBlock RAMが推定されたが、Verilogでは、(* RAM_STYLE="BLOCK" *)制約を追加する必要があった。

ちなみに、下のようにバイトイネーブルをつけたところ、(これが本命だったのですが。。。)

//
//  Initializing  Block  RAM  from  external  data  file
//

module  v_rams_20c  (clk, we,  addr,  din,  dout);
    input  clk;
    input  [1:0]    we;
    input  [4:0]    addr;
    input  [15:0]    din;
    output  [15:0]    dout;
    (* RAM_STYLE="BLOCK" *) reg  [15:0]  ram  [0:31];
    // reg  [15:0]  ram  [0:31];
    reg  [15:0]  dout;
    
    initial begin
        $readmemh("rams_20c.data",ram,  0,  31);
    end
    
    always  @(posedge  clk) begin
        dout  <=  ram[addr];
            
         if  (we[0])
             ram[addr][7:0]  <=  din[7:0];
            
         if  (we[1])
             ram[addr][15:8]  <=  din[15:8];
    end
endmodule


SLICELなどのロジックに推論されてしまった。
Verilog_BRAM_4_110621.png

(2011/06/22:追記)
ツイッターで@osamu_takeuchiさんに教えていただいたが、Project Navigatorのテンプレートにバイト・イネーブルを使用したRAMの例が載っているそうだ。たびたびありがとうございます。
EditメニューのLanguage Templates...を選ぶと出てくるLanguage TemplatesのVerilog -> Synthesis Constructs -> Coding Examples -> RAM -> Block RAM -> Single Port -> Byte-wide Write Enable -> No Change Mode w/ 2bit write enable(for device familes older than Virtex-6 and Spartan-6)を参考にして、v_rams_20c.v を書き換えてみた。
Verilog_BRAM_5_110622.png

v_rams_20c.v のVerilogソースを下に示す。

//
//  Initializing  Block  RAM  from  external  data  file
//

module  v_rams_20c  (clk, we,  addr,  din,  dout);
   parameter DATA_WIDTH = 16;
   parameter ADDR_WIDTH = 5;

   input    wire [DATA_WIDTH-1:0] din;
   input    wire [ADDR_WIDTH-1:0] addr;
   input    wire [1:0] we;
   input    wire clk;
   output    reg [DATA_WIDTH-1:0] dout;

   wire ram_ena;

   assign ram_ena = 1'b1;
   
   (* RAM_STYLE="BLOCK" *) reg [DATA_WIDTH-1:0] ram [2**ADDR_WIDTH-1:0];
   reg [(DATA_WIDTH/2)-1:0] di0, di1;

   //  The following code is only necessary if you wish to initialize the RAM 
   //  contents via an external file (use $readmemb for binary data)
   initial
      $readmemh("rams_20c.data", ram, 0, 31);

   always @(we, din) begin
      if (we[0])
         di0 = din[(DATA_WIDTH/2)-1:0];
      else
         di0 = ram[addr][(DATA_WIDTH/2)-1:0];
      if (we[1])
         di1 = din[DATA_WIDTH-1:DATA_WIDTH/2];
      else
         di1 = ram[addr][DATA_WIDTH-1:DATA_WIDTH/2];
   end

   always @(posedge clk)
      if (ram_ena) begin
         dout  <= {di1,di0};
         ram[addr] <= {di1,di0};
      end
endmodule


インプリメントしたところ、Block RAMに割り当てられていた。
Verilog_BRAM_6_110622.png

Block RAMを拡大してみたところ、WEAL0~3にwe_0_IBUF, we_1_IBUFが割り当てられていた。INT_01_Lには初期化データが入っていることが確認できた。
Verilog_BRAM_7_110622.png

(もう一度追記:重要)
バイト・イネーブル付きRAMですが、Spartan-3はBlock RAMを使用しないでSLICEMで実装されました。下にBlock RAMで実装されたか、SLICEMで実装されたか?を表にします。

Spartan-3 SLICEM
Spartan-3E SLICEM
Spartan-3A Block RAM
Virtex-4 Block RAM
Virtex-5 Block RAM
Spartan-6 Block RAM
Virtex-6 Block RAM


確か、Spartan-3A辺りからBlock RAMにバイト・イネーブルが付いたんじゃなかったかな?
  1. 2011年06月21日 15:34 |
  2. 入門Verilog
  3. | トラックバック:0
  4. | コメント:2

SMMのSDKデバックとChipscope Pro Inserter を同時に使用する

SMM(the Simple Microblaze Microcontroller)を使用すると、FPGA内のBSCANユニットが使用されて、Chipscope Proで信号を観測することができなかった。

Virtex-5やSpartan-6では、複数個のBSCANユニットが入っているので、SDKデバックしながら、Chipscope Inserterが使用できるのでは?と考えられるので、試してみることにした。(多分、Virtex-6も同様だろう)
(SMMについては、”The Simple MicroBlaze Microcontroller 2 (概要)”を参照のこと。SMM(The Simple MicroBlaze Microcontroller)も参照ください)

SMMのVirtex-6のリファレンス・デザイン(SMM_Ref\ML605_LCD_Ref)をXUPV5-LX110T用に変更した。具体的には、66MHzクロックを使用するようになっていたので、100MHzのクロックからDCMで66MHzに変換した。後は当然ながら制約ファイルを書き換えた。
サンプルプロジェクトでやることは、”The Simple MicroBlaze Microcontroller 4(リファレンスデザイン2)”と同様に、ボタンを押すとLCDに”Thank You!”と表示することだ。
Chipscope Inserterコアを入れて、インプリメントしたらインプリメントができた。
SMM_SDK_1_110616.png

FPGA Editorで見ると、Chipscope用とSMMのMDM用のBSCANユニットが2つ入っていた。
SMM_SDK_2_110616.png

1.SDKを立ち上げて、SDKのProgram FPGAダイアログから、FPGAボードにビットファイル(download.bit)をダウンロードした。(”The Simple MicroBlaze Microcontroller 4(リファレンスデザイン2)”参照)
2.Chipscope AnalyzerをProject Navigatorから立ち上げて、sdk\SMM_noDBG_noUART_hw_platform\download.bitを指定して、もう一度、FPGAボードにダウンロードした。
3.SDKをデバッグモードにした。スイッチを押したときのタイマーイベントでChipscopeのトリガをかけた。

うまくSDKデバックとChipscopeの波形観測の両方を行うことができた。
SMM_SDK_3_110616.png

SMM_SDK_4_110616.png

これで、Virtex-5以上では心置きなくSMMを使うことができる。(ただし、BSCANが2つ以上あることが前提)
ISEからEDKをIPとして使用して、Chipscope Inserterを使うこともできると思う。
なお、Virtex-4は試していない。
  1. 2011年06月16日 17:21 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:0

openMSP430のシミュレーション1

今回はSpartan3 Stater KitでインプリメントしたopenMSP430のシミュレーションを試みた。

シミュレーションの方法が書いていないので、よくわからないが、どうやらopenmsp430\trunk\fpga\xilinx_diligent_s3board\sim\rtl_sim\bin\msp430sim を動かせば良いみたいに見える。
シェル・スクリプトなので、例によって、openmsp430\trunk\fpga\xilinx_diligent_s3boardから下をCygwinの自分のhomeディレクトリにコピーした。そして、Cygwinから”./mps430sim leds”コマンドを入力して起動した。
openMSP430_19_110616.png

すると、エラーが出て停止してしまった。
pmem.elfがおかしいと言われている。xilinx_diligent_s3board\sim\rtl_sim\runのpmem.elfは76バイトしかない。これは、leds.elfをシンボリック・リンクしたものなので、こうなってしまったのか?でもmps430simのスクリプト中のlnをcpに変えても変わらなかった。そこで、leds.elfをWindowsのエクスプローラーでコピーして、pmem.elfに書き換えた。
xilinx_diligent_s3board\sim\rtl_sim\bin\msp430sim の107行目から109行目の以下のスクリプトを

# Create links
ln -s $elffile pmem.elf
ln -s $verfile stimulus.v


下のcp に書き換えた。

# Create links
cp -f $elffile pmem.elf
cp -f $verfile stimulus.v


これでもう一度、”./mps430sim leds”コマンドを入力して起動した。
iverilogコマンドが見つかりませんと出た。Icarus Verilogが必要のようだ。
openMSP430_20_110617.png

Windows用のIcarus Verilogを、ここからダウンロードしてインストールした。(iverilog-0.9.4_setup.exe)
再々度、Cygwinから”./mps430sim leds”コマンドを入力して起動した。
今度は、BUFGやDCM等がUnknown module と言われてしまった。
openMSP430_21_110617.png

msp430sim の最後に、

../bin/rtlsim.sh stimulus.v pmem.mem $submitfile


というコマンドが書かれていた。rtlsim.shを起動しているようだ。
rtlsim.shを見てみると、submit.f というコマンドファイルをIcarus Verilogで実行するようだ。
submit.fを見てみると、-yオプションのライブラリパスにunisims, XilinxCoreLibなどのライブラリが存在しないことに気がついた。K:\cygwin\opt\Xilinx\13.1\ISE_DS\ISE\Verilog\src 以下にすべてのライブラリをコピーした。
openMSP430_22_110620.png

そして、submit.f の51,52,53行目の以下の部分を

-y /opt/Xilinx/12.2/ISE_DS/ISE/verilog/src/unisims/
-y /opt/Xilinx/12.2/ISE_DS/ISE/verilog/src/simprims/
-y /opt/Xilinx/12.2/ISE_DS/ISE/verilog/src/XilinxCoreLib/


下の記述に書き換えた。

-y /opt/Xilinx/13.1/ISE_DS/ISE/verilog/src/unisims/
-y /opt/Xilinx/13.1/ISE_DS/ISE/verilog/src/simprims/
-y /opt/Xilinx/13.1/ISE_DS/ISE/verilog/src/XilinxCoreLib/


これでもう一度、Cygwinから”./mps430sim leds”コマンドを入力して起動した。
しかしやはり、BUFGやDCM等がUnknown module と言われてしまった。

Icarus Verilogは良くわからないので、今度はISimでシミュレーションをやってみたい。
  1. 2011年06月16日 05:43 |
  2. FPGA内蔵マイクロコントローラ
  3. | トラックバック:0
  4. | コメント:0

openMPS430のデバック

openMSP430のデバックは、openmsp430\trunk\tools\bin のopenmsp430-gdbproxyやopenmsp430-minidebugを使用するのだと思う。
実際の動作画面は、openMSP430 :: Software development tools に記載されている。
tclの実行には、activetclをインストールしたが、openmsp430\trunk\tools\freewrap642のgenerate_exec.batを実行すると、実行形式のファイルが生成される。
openMSP430_16_110614.png

最初に起動したときは、openmsp430-gdbproxy、openmsp430-minidebug両方が全く動作しなかったが、それは私のパソコンにシリアルポートが無かったからだ。USBシリアルケーブルを接続したら、両方共立ち上がった。
最初に、openmsp430-gdbproxyの画面。
openMSP430_17_110614.png

openmsp430-minidebugの画面。
openMSP430_18_110614.png

両方共、Spartan3 Stater KitにopenMSP430をコンフィグして、シリアルポートにUSBシリアルケーブルを接続してパソコンのUSBポートにつないで、コネクトしてようとしてもできかなった。
シリアルのボーレートが違うのかと思い、設定するところを探したところ、openMSP430_defines.vにあるようだった。521行目からを115200bpsになるように変更した。下のリストを参照。

// Debug UART interface data rate
// In order to properly setup the UART debug interface, you
// need to specify the DCO_CLK frequency (DBG_DCO_FREQ) and
// the chosen BAUD rate from the UART interface.
//
// `define DBG_UART_BAUD 9600
//`define DBG_UART_BAUD 19200
//`define DBG_UART_BAUD 38400
//`define DBG_UART_BAUD 57600
`define DBG_UART_BAUD 115200
//`define DBG_UART_BAUD 230400
//`define DBG_UART_BAUD 460800
//`define DBG_UART_BAUD 576000
//`define DBG_UART_BAUD 921600
// `define DBG_UART_BAUD 2000000
`define DBG_DCO_FREQ 20000000
`define DBG_UART_CNT ((`DBG_DCO_FREQ/`DBG_UART_BAUD)-1)


これで、ISEでインプリメントして、再度Spartan3 Stater Kitにダウンロードして、openmsp430-gdbproxy、openmsp430-minidebugを立ち上げ、コネクトしてみようとしたが、だめだった。
なぞだ?何処かおかしいのだと思う。
  1. 2011年06月14日 05:47 |
  2. FPGA内蔵マイクロコントローラ
  3. | トラックバック:0
  4. | コメント:4

openMSP430のDE1へのインプリメント

前回は、openMSP430をSpartan3 Stater Kitで動作させたが、実はAlteraとLatticeのFPGA用のプロジェクトも入っている。今回は、AlteraのDE1用のプロジェクトをインプリメントしてみた。だが、DE1を持っていないので、実際に試すことは出来ない。試してみた方がいたら教えてください。

DE1用のプロジェクトは、openmsp430\trunk\fpga\altera_de1_board\synthesis\altera にある。このフォルダの中のOpenMSP430_fpga.qpf がQuartus IIのプロジェクトだ。
最初に、まだインストールしていなかったQuartus II 11.0をダウンロードしてインストールした。ダウンロードするときに何も聞かれなかったが、AlteraのQuartus IIはダウンロードするときに、何も聞かれないでダウンロードすることができるようになったのだろうか?それともすでにクッキーに入っていたのか?

さて、準備が終了したので、OpenMSP430_fpga.qpf をダブルクリックしてQuartus II 11.0を立ち上げた。Start Compilationアイコンをクリックして、コンパイルを開始した。そうしたらエラーが発生した。
openMSP430_9_110613.png

最初のエラーを下に示す。

Error (10054): Verilog HDL File I/O error at openMSP430_fpga.v(35): can't open Verilog Design File "openMSP430_defines.v"


openMSP430_defines.vがないと言われている。下の図に示すように確かにopenMSP430_fpga.v のあるところにopenMSP430_defines.v が存在しない。
openMSP430_10_110613.png

それじゃ何処にあるかというと、その下のopenmsp430 の下にあった。
openMSP430_11_110613.png

そこで、openMSP430_fpga.v の35行目の下の行を

`include "openMSP430_defines.v"


下のように変更した。

`include "openmsp430/openMSP430_defines.v"


これでもう一度コンパイルしたら、無事にコンパイルが終了した。
openMSP430_12_110613.png

Quartus IIのEntityウインドウのHierarchyタブはXilinxと違って、インスタンスしたモジュールを表示しているみたいだ。Xilinxの方が見やすいと思っていたが、ifdefでモジュールを切り分けるプロジェクトでは、Quartus IIの方が見やすいと思った。どのモジュールをインスタンスしたかが一目瞭然だ。

さて、Total logic elementsは2,594だった。これは、前回のSpartan-3の3,136 LUTs よりも少ない。
だが、Quartus IIのEntityウインドウのHierarchyタブを見ると、デバック用のdbg_UARTがインスタンスされていない。
openMSP430_13_110613.png

openMSP430_defines.v を見ると、96行目でDBG_ENのdefineがコメントアウトされていた。

// Include/Exclude Serial Debug interface
//`define DBG_EN


これを下のように変更した。

// Include/Exclude Serial Debug interface
`define DBG_EN


これで、もう一度コンパイルした。
今度は、Total logic elementsが3,027に増えていた。
openMSP430_15_110613.png

Quartus IIのEntityウインドウのHierarchyタブを見ると、dbgがインスタンスされていて、その下にdbg_uart_0があった。
openMSP430_14_110613.png

動作周波数は10MHzと出ていたが、どうやってクロックの制約を設定するんだっか忘れてしまった。自分のブログ記事を読み返してやってみたい。

(2011/06/14:追記)

# Original Clock Setting Name: klok
create_clock -period "33.333 ns" \
-name {CLOCK_24[0]} {CLOCK_24[0]}


上の制約でコンパイルしたところ通ったので、DE1では30MHzで動作するようだ。本来は24MHz動作のようだ。
  1. 2011年06月13日 05:41 |
  2. FPGA内蔵マイクロコントローラ
  3. | トラックバック:0
  4. | コメント:0

息子の高校の学園祭2011

今日は、息子の高校の文化祭なので車を石下駅に置いて常総線に乗って、高校の文化祭を見てきました。
高校についたらかなり賑やかでした。
binkasai_1_110611.jpg

今年で学校創立100周年だそうです。焼き鳥や焼きそばの屋台が出ていました。
校舎の中に入って息子のクラスへ。息子のクラスの出し物は喫茶店で、ベビーカステラと飲み物で250円でした。
binkasai_2_110611.jpg

ベビーカステラと銘打ってありますが、実はベビーホットケーキで、暖かくとっても美味しかったです。私は黒蜜掛けベビーカステラとミルクティー、奥さんはキャラメルベビーカステラとアイスコーヒーでした。
binkasai_3_110611.jpg

その後は吹奏楽部の演奏を聞きたかったのですが、残念ながら終了していました。後は、美術部の作品と書を見ましたが、素晴らしかったです。他は見ても…なんなので、常総線で帰って、下妻イオンに行きました。実は、はま寿司の広告がとてもおいしそうだったからです。はま寿司で寿司を食べました。生ハムとアボガドの寿司が一番美味しかったかな?一皿105円なので、それなりですが、美味しかったです。寿司に行くといつもそうですが、奥さんと1貫ずつ寿司を食べると種類が食べられて良いですね。。。

その後は、父の日なので、両方の父親に洋服を買ったので、奥さんの実家に持って行きました。
4時ころ家に帰って、奥さんと犬の散歩へ。この頃、職場でも昼休みにほんの少しですが、走っているので、最初は犬と走りましたよ。初めの頃は歩くだけだったのですが、段々走れるようになってきました。奥さんは休みの日は10Km位走っているので余裕みたいです。
  1. 2011年06月11日 21:05 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Spartan-3E 1600に実装されたCray-1

以前話題になっていたSpartan-3E 1600にCray-1を実装した方のホームページ”Homebrew Cray-1A”が、ツイッターの@XilinxIncで紹介されていた。
そこからVerilog ソースがダウンロードできたので試してみた。2つのzipファイル、cray1.zip と cray1_r2.zipがあった。
最初に、cray1.zipから試してみた。
ISE13.1のProject Navigatorでプロジェクトを作ってインプリメントした。clkの周波数は50MHzにした。内部で1/2分周されているので、動作周波数は25MHzだ。使用LUTは72%だった。各使用リソースは下図を参照して欲しい。
Cray1_1_110610.png

Place & Route後のPlanAheadを下に示す。
Cray1_5_110610.png

最大のSETUPが34.796nsec で、約28MHzで動作が可能であることがわかった。

ボードを持っていないので、確かめることは出来ない。だが、プリミティブも使っていないようだし、入出力ポートもシリアルくらいで少ないので、Spartan-6用に書き換えるのはそんなに難しくなさそうだ。ソフトウェアはPythonで書いてあるみたいだ。


次にcray1_r2.zipを試してみた。
同様に、ISE13.1のProject Navigatorでプロジェクトを作ってインプリメントした。clkの周波数は50MHzにした。このバージョンでは内部で1/2されていないので、50MHzで動作する。
Place & Routeでエラーになってしまった。
Cray1_2_110610.png

エラーの内容を下に示す。

ERROR:Place:665 - The design has 20 block-RAM components of which 20 block-RAM components require the adjacent multiplier site to remain empty. This is because certain input pins of adjacent block-RAM and multiplier sites share routing ressources. In addition, the design has 19 multiplier components. Therefore, the design would require a total of 39 multiplier sites on the device. The current device has only 36 multiplier sites.


Xilinxアンサーを検索すると、”PAR、LogiCORE MAC FIR、FFT、FIR Compiler - Virtex-II、Virtex-II Pro、Spartan-3、または Spartan-3E デバイスに MAC FIR または FFT を配置配線しようとすると、「ERROR:Place:419」、「ERROR:Place:341」、または 「ERROR:Place:665」というエラー メッセージが表示される”がヒットした。
どうやら、乗算器と BRAM が共有するインターコネクトが影響しているようだ。

FPGAを変更してみることにした。変更したのは、Spartan-6のSLX45Tだ。変更してインプリメントしたところ、LUT使用率は49%だった。
Cray1_3_110610.png

下に、MAPリポートの一部を示す。

elease 13.1 Map O.40d (nt)
Xilinx Mapping Report File for Design 'cray_sys_top'

Design Information
------------------
Command Line   : map -intstyle ise -p xc6slx45t-fgg484-3 -w -logic_opt off -ol
high -t 1 -xt 0 -register_duplication off -r 4 -global_opt off -mt off -ir off
-pr off -lc off -power off -o cray_sys_top_map.ncd cray_sys_top.ngd
cray_sys_top.pcf 
Target Device  : xc6slx45t
Target Package : fgg484
Target Speed   : -3
Mapper Version : spartan6 -- $Revision: 1.55 $
Mapped Date    : FRI 10 JUN 20:44:2 2011

Design Summary
--------------
Number of errors:      0
Number of warnings:   41
Slice Logic Utilization:
  Number of Slice Registers:                 7,489 out of  54,576   13%
    Number used as Flip Flops:               7,366
    Number used as Latches:                    113
    Number used as Latch-thrus:                  0
    Number used as AND/OR logics:               10
  Number of Slice LUTs:                     13,418 out of  27,288   49%
    Number used as logic:                   12,549 out of  27,288   45%
      Number using O6 output only:          11,111
      Number using O5 output only:             135
      Number using O5 and O6:                1,303
      Number used as ROM:                        0
    Number used as Memory:                     699 out of   6,408   10%
      Number used as Dual Port RAM:            176
        Number using O6 output only:             0
        Number using O5 output only:             0
        Number using O5 and O6:                176
      Number used as Single Port RAM:            0
      Number used as Shift Register:           523
        Number using O6 output only:            73
        Number using O5 output only:             0
        Number using O5 and O6:                450
    Number used exclusively as route-thrus:    170
      Number with same-slice register load:    158
      Number with same-slice carry load:        12
      Number with other load:                    0

Slice Logic Distribution:
  Number of occupied Slices:                 5,273 out of   6,822   77%
  Number of LUT Flip Flop pairs used:       14,928
    Number with an unused Flip Flop:         8,330 out of  14,928   55%
    Number with an unused LUT:               1,510 out of  14,928   10%
    Number of fully used LUT-FF pairs:       5,088 out of  14,928   34%
    Number of unique control sets:             165
    Number of slice register sites lost
      to control set restrictions:             268 out of  54,576    1%

  A LUT Flip Flop pair for this architecture represents one LUT paired with
  one Flip Flop within a slice.  A control set is a unique combination of
  clock, reset, set, and enable signals for a registered element.
  The Slice Logic Distribution report is not meaningful if the design is
  over-mapped for a non-slice resource or if Placement fails.

IO Utilization:
  Number of bonded IOBs:                         5 out of     296    1%

Specific Feature Utilization:
  Number of RAMB16BWERs:                        20 out of     116   17%
  Number of RAMB8BWERs:                          0 out of     232    0%
  Number of BUFIO2/BUFIO2_2CLKs:                 0 out of      32    0%
  Number of BUFIO2FB/BUFIO2FB_2CLKs:             0 out of      32    0%
  Number of BUFG/BUFGMUXs:                       3 out of      16   18%
    Number used as BUFGs:                        3
    Number used as BUFGMUX:                      0
  Number of DCM/DCM_CLKGENs:                     0 out of       8    0%
  Number of ILOGIC2/ISERDES2s:                   0 out of     376    0%
  Number of IODELAY2/IODRP2/IODRP2_MCBs:         0 out of     376    0%
  Number of OLOGIC2/OSERDES2s:                   0 out of     376    0%
  Number of BSCANs:                              0 out of       4    0%
  Number of BUFHs:                               0 out of     256    0%
  Number of BUFPLLs:                             0 out of       8    0%
  Number of BUFPLL_MCBs:                         0 out of       4    0%
  Number of DSP48A1s:                           18 out of      58   31%
  Number of GTPA1_DUALs:                         0 out of       2    0%
  Number of ICAPs:                               0 out of       1    0%
  Number of MCBs:                                0 out of       2    0%
  Number of PCIE_A1s:                            0 out of       1    0%
  Number of PCILOGICSEs:                         0 out of       2    0%
  Number of PLL_ADVs:                            0 out of       4    0%
  Number of PMVs:                                0 out of       1    0%
  Number of STARTUPs:                            0 out of       1    0%
  Number of SUSPEND_SYNCs:                       0 out of       1    0%

Average Fanout of Non-Clock Nets:                4.58



最後に、Place & Route後のPlanAheadを下図に示す。
Cray1_4_110610.png

最大のSETUPが 19.875nsec で約50MHzで動作することがわかった。
  1. 2011年06月10日 21:41 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:2

openMSP430をSpartan3 Stater Kitで動作させた

openMSP430のSpartan3 Stater Kitへのインプリメント”の続き。

前回で、Spartan3 Stater Kit用のopenMSP430がインプリメントできたので、今回はopenmsp430\trunk\fpga\xilinx_diligent_s3board\software\leds のソフトウェアサンプルを動作させてみる。

まずはCygwinで、ledsをmake all した。
openMSP430_7_110609.png

led.elfができた。後は、openmsp430\trunk\fpga\xilinx_diligent_s3board\synthesis\xilinx に入っていたmemory.bmm を使用する。
led.elfとmemory.bmm をSynth131フォルダに持ってきて、ISE Design Sute コマンド プロンプトで、下のコマンドを入力した。

data2mem -bm memory.bmm -bd leds.elf -p xc3s200-4ft256 -bt openmsp430_fpga.bit


data2mem の使い方については、この辺を参照のこと。
openMSP430_8_110609.png

コマンドを実行するとopenmsp430_fpga_rp.bit が生成される。これをiMPACTでSpartan3 Stater Kitにダウンロードする。するとLEDが点滅して、7セグメントLEDに文字が表示された。


これで、一応デモは動作した。次は、RS-232Cからダウンロードできるかどうか?GDBが使えるかどうかを調べてみたい。

  1. 2011年06月09日 21:24 |
  2. FPGA内蔵マイクロコントローラ
  3. | トラックバック:0
  4. | コメント:0

openMSP430のSpartan3 Stater Kitへのインプリメント

今回は、OpenCoures のopenMSP430 のプロジェクトをダウンロードして、解凍した。
openMSP430 :: OverviewのLatest version: downloadをクリックしてダウンロードした。openmsp430_latest.tar.gz がダウンロードできたので、解凍したところopenMSP430フォルダができた。
openmsp430\trunk\fpga\xilinx_diligent_s3boardにSpartan3 Stater Kit用のプロジェクトが入っているようなので、これをやってみることにした。
openMSP430_4_110609.png

openmsp430\trunk\fpga\xilinx_diligent_s3board\synthesis\xilinx にcreate_bitstream.bat があるので、ISE13.1のISE Design Suteコマンド プロンプトを立上て、create_bitstream.batを起動した。
openMSP430_5_110609.png

すると、BATファイルが実行されたが、エラーで止まってしまった。../../../rtl/verilog/openmse430/periph/omsp_timerA.v でomsp_timerA_define.vが見つからないそうだ。

次に、Project Navigatorでプロジェクトを作成してやってみることにした。

1.Project Navigatorで3S200FT256-4のプロジェクトを作成した。
2.openmsp430\trunk\fpga\xilinx_diligent_s3board\rtl\verilogにあるVerilogファイルを大体 Add Source した。
3.penmsp430\trunk\fpga\xilinx_diligent_s3board\synthesis\xilinx にあるopenMSP430_fpga.ucfもプロジェクトにAdd Sourceした。
4.openmsp430\trunk\fpga\xilinx_diligent_s3board\rtl\verilog\coregenにある4つのIPをAdd Copy of Source した。


とりあえず、penmsp430\trunk\fpga\xilinx_diligent_s3board\synthesis\xilinx にあるmemory.bmm はプロジェクトに入れないでこのままインプリメントしてみた。

インプリメントが成功した。インプリメント結果を下に示す。
openMSP430_6_110609.png

ROMへのパスがクリティカルパスになっていて、動作周波数は25MHz程度のようだ。
Number of 4 input LUTsが81%使用されている。かなりの占有率だ。結構リソースを消費する。下にMAPのリポートを示す。

Design Information
------------------
Command Line   : map -intstyle ise -p xc3s200-ft256-4 -cm area -ir off -pr off
-c 100 -o openMSP430_fpga_map.ncd openMSP430_fpga.ngd openMSP430_fpga.pcf 
Target Device  : xc3s200
Target Package : ft256
Target Speed   : -4
Mapper Version : spartan3 -- $Revision: 1.55 $
Mapped Date    : THU 9 JUN 5:6:4 2011

Design Summary
--------------
Number of errors:      0
Number of warnings:   40
Logic Utilization:
  Number of Slice Flip Flops:         1,060 out of   3,840   27%
  Number of 4 input LUTs:             3,136 out of   3,840   81%
Logic Distribution:
  Number of occupied Slices:          1,862 out of   1,920   96%
    Number of Slices containing only related logic:   1,862 out of   1,862 100%
    Number of Slices containing unrelated logic:          0 out of   1,862   0%
      *See NOTES below for an explanation of the effects of unrelated logic.
  Total Number of 4 input LUTs:       3,244 out of   3,840   84%
    Number used as logic:             3,136
    Number used as a route-thru:        108

  The Slice Logic Distribution report is not meaningful if the design is
  over-mapped for a non-slice resource or if Placement fails.

  Number of bonded IOBs:                 65 out of     173   37%
  Number of RAMB16s:                      4 out of      12   33%
  Number of MULT18X18s:                   1 out of      12    8%
  Number of BUFGMUXs:                     2 out of       8   25%
  Number of DCMs:                         1 out of       4   25%
  Number of STARTUPs:                     1 out of       1  100%

Average Fanout of Non-Clock Nets:                3.95


The Simple MicroBlaze Microcontroller(SMM) は、SMM + UART + DebugのSpartan3で、使用LUTsは1770なので、SMMよりopenMSP430の方が約2倍LUTリソースを消費している。
しかも、SMMは32ビットプロセッサで、openMSP430は16ビットプロセッサなんだよね。。。一応、Spartan3 Stater Kitドライブ用にtimerやgpio, 7segment driver等が入っているのか。。。

  1. 2011年06月09日 05:33 |
  2. FPGA内蔵マイクロコントローラ
  3. | トラックバック:0
  4. | コメント:0

openMSP430のGCC toolchain

FPGAボードのLCDを制御する用途にSMM(The Simple MicroBlaze Microcontroller)を使用したが、SMMはno_Debugの物でも、BSCANが使用されていてChipScopeが使用できなかった
これは非常に残念だ。ソフトウェアのデバックを捨てても、Chipscopeが入らないのでSMMを使用している状態では、Chipscopeが使用できない。EDKを使って本格的にやればBSCANを共有してChipscopeを入れることができると思われる。(やってみたことがないので多分)ちなみになぜEDKを使わないかなのだが、プロセッサはLCDを制御したりのサブ的なことにのみ使用するので、プロセッサがメインになるEDKでは、使いづらいからだ。それにWebPACKでは使用することが出来ない。
そこで、16ビットくらいのマイクロコントローラを探していたところ、ツイッターで@kawanamioさんにopenMSP430を奨めていただいた。openMSP430は、OpenCoresのLGPLのプロセッサだ。LGPLということで、openMSP430を使って作った回路のソースコード開示義務はないはずなので、都合が良い。
問題はtoolchainで、このところCygwinやFedora、Ubuntuなどでいろんなプロセッサのtoolchainをビルドしようとして失敗続きだ。(OpenRISC1000はGDBを除いてビルド出来ました。OpenRISC1000はUbuntuのコンパイル済みtoolchainもあって便利なのだが、回路規模が大きいので対象外となった)
openMSP430のtoolchianは、”The GCC toolchain for the Texas Instruments MSP430 MCUs”の mspgcc-win32/snapshots/のmspgcc-20081230.exe をダウンロードしてWindowsにインストールした。これはインストーラでWindows上でインストールすることができた。
私はKドライブにインストールしたところ、mspgccフォルダが出来て、その中にフォルダが作られていた。binフォルダの下にGCCの実行ファイルがあった。
openMSP430_1_110608.png

mspgccを使うには、makeなどのコマンドが必要なので、Cygwinベースでやることを考えた。Cygwinの/optディレクトリにmspgcc全体をコピーした。移動するとスタートメニューからのリンクもあるので、やめにした。
Cygwinの.bashrc に/opt/mspgcc/binへのパスを追加した。

export PATH=/opt/mspgcc/bin:$PATH


これで、Cygwinでサンプルをmakeしてみた。/opt/mspgcc/examples/bufferedUSART で
openMSP430_2_110608.png

make all


コマンドを実行したところ、test.elf が生成された。
openMSP430_3_110608.png

その他に、ツイッターで@keytanさんにCode Composer Studio IDEを教えていただいた。Freeの物があるが、登録が面倒だったので、とりあえず、mspgccを使おうと思う。
  1. 2011年06月08日 05:20 |
  2. FPGA内蔵マイクロコントローラ
  3. | トラックバック:0
  4. | コメント:0

XUPV5-LX110Tでキャラクタ・ディスプレイ・コントローラのラッパー・ソースファイル2

XUPV5-LX110Tでキャラクタ・ディスプレイ・コントローラのラッパー・ソースファイル”の続き。

(2011/06/02:追加)でdvi_de, dvi_hsync, dvi_vsync の出力用FFがIOBにマップされるように変更したが、やはりDVI出力がでない。
dvi_scl, dvi_sdaのCH7301CのI2C関連ピンは、DDR2 SDRAMと同一のFPGAバンクにつながっているので、電圧は1.8Vなのだが、LVCMOS18に設定するとDVI出力がでない。しかし、LVCMOS33に設定するとDVI出力が出る。でもLVCMOS33にしておいてDDR2 SDRAMのピン配置をすると、MAPでIO電圧が違うとErrorになってしまう。非常に困った。
もう一度、1からI2C回路を検証してみると、OmniVison社のCMOSカメラ用のI2CのSCCBはデータシートでSDAのHOLD Timeは0nsに指定されていたので、クロック2つ分の余裕を持たせた。
SCCB_block_fig_3_091216.png

HOLD Timeが少ないのではないか?と考えた。ちなみにCH7301C Full Data Sheetにも、CH7301 Registers Read/Write Operation, AN-41.pdf にもI2Cのタイミングの記述はなかった。
試しに、SRL16Eで16クロック分遅延させてみたら、LVCMOS18に指定しても動作するようになった。やはりSCLに対するSDAのHOLD Timeが足りなかったようだ。16クロック×15.38nsec = 246nsec(画面サイズはXGA、ピクセルクロックは65MHz)遅延させた。今回書き加えた分を下に示す。

    -- SLC, SDA を遅延させる
    process(clk) begin
        if clk'event and clk='1' then
            if reset='1' then
                SDA_Delay <= (others => '1');
                SDA_ena_Delay <= (others => '1');
                SCL_Delay <= '1';
            else
                SDA_Delay(2) <= SDA_shift_reg(8);
                SDA_Delay(1) <= SDA_Delay(2);
                SDA_Delay(0) <= SDA_Delay(1);
                SDA_ena_Delay(1) <= SDA_enable;
                SDA_ena_Delay(0) <= SDA_ena_Delay(1);
                SCL_Delay <= SCL_shift_reg(17);
            end if;
        end if;
    end process;
    
    SRL16E_SDA : SRL16E generic map(
        INIT => X"0000")
    port map(
        Q => SDA_Delay_SRL16,
        A0 => '1',
        A1 => '1',
        A2 => '1',
        A3 => '1',
        CE => '1',
        CLK => clk,
        D => SDA_Delay(0)
    );    
    
    SRL16E_SDA_ena : SRL16E generic map(
        INIT => X"0000")
    port map(
        Q => SDA_ena_Delay_SR16,
        A0 => '1',
        A1 => '1',
        A2 => '1',
        A3 => '1',
        CE => '1',
        CLK => clk,
        D => SDA_ena_Delay(0)
    );    
    
    SDA <= SDA_Delay_SRL16 when SDA_ena_Delay_SR16='0' else 'Z';
    SCL <= SCL_Delay;


下にCH7301C関連のUCFを示す。

NET "dvi_d[0]" IOSTANDARD = LVDCI_33;
NET "dvi_d[1]" IOSTANDARD = LVDCI_33;
NET "dvi_d[2]" IOSTANDARD = LVDCI_33;
NET "dvi_d[3]" IOSTANDARD = LVDCI_33;
NET "dvi_d[4]" IOSTANDARD = LVDCI_33;
NET "dvi_d[5]" IOSTANDARD = LVDCI_33;
NET "dvi_d[6]" IOSTANDARD = LVDCI_33;
NET "dvi_d[7]" IOSTANDARD = LVDCI_33;
NET "dvi_d[8]" IOSTANDARD = LVDCI_33;
NET "dvi_d[9]" IOSTANDARD = LVDCI_33;
NET "dvi_d[10]" IOSTANDARD = LVDCI_33;
NET "dvi_d[11]" IOSTANDARD = LVDCI_33;
NET "dvi_de" IOSTANDARD = LVCMOS33;
NET "dvi_hsync" IOSTANDARD = LVDCI_33;
NET "dvi_reset_b" IOSTANDARD = LVCMOS33;
NET "dvi_vsync" IOSTANDARD = LVDCI_33;
NET "dvi_xclk_n" IOSTANDARD = LVCMOS33;
NET "dvi_xclk_p" IOSTANDARD = LVCMOS33;
NET "dvi_xclk_n" DRIVE = 24;
NET "dvi_xclk_p" DRIVE = 24;
NET "dvi_xclk_n" SLEW = FAST;
NET "dvi_xclk_p" SLEW = FAST;
NET "reset_sw" IOSTANDARD = LVCMOS33;
NET "dvi_scl" LOC = U27;
NET "dvi_sda" LOC = T29;
NET "dvi_scl" IOSTANDARD = LVCMOS18;
NET "dvi_sda" IOSTANDARD = LVCMOS18;
NET "dvi_scl" SLEW = FAST;
NET "dvi_sda" SLEW = FAST;
NET "dvi_scl" DRIVE = 24;
NET "dvi_sda" DRIVE = 24;
NET "dvi_scl" TIG;
NET "dvi_sda" TIG;
NET "dvi_scl" PULLUP;
NET "dvi_sda" PULLUP;
INST "dvi_de" IOB = FORCE;
INST "dvi_hsync" IOB = FORCE;
INST "dvi_vsync" IOB = FORCE;


  1. 2011年06月06日 14:19 |
  2. XUPV5-LX110T
  3. | トラックバック:0
  4. | コメント:0

手塚治虫のブッダを見てきました

今日は手塚治虫のブッダを見てきました。奥さんと2人で行ったのですが、奥さんつまらなそう。。。ビクビクしていました。私は手塚治虫が好きなので、面白かったです。人というものを考えさせるアニメだと思います。ただ、王様の声優さんが棒読みでひどかったです。後で見ると声優さんじゃないんですね。声優さんを使って欲しかったです。最後の頃はましでしたが、最初はひどかった。。。
帰りの車では、奥さん、映画の趣味が合わないのでご機嫌斜め。ご機嫌を取っていました。こうなると思ってひとりで行くと言ったんですが。。。
  1. 2011年06月05日 20:37 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

Verilatorを試してみる9(DPI-C:SystemVerilogからCの関数を呼び出す)

VerilatorでDPI-Cがうまくいかないとツイッターに書いたら、武内さんからVerilatorでDPI-Cが動いたよとツイッターで教えていただいた。ありがとうございます。いつもお世話になっております。
武内さんの”電気回路/HDL/Verilator で DPI-C”を参考にさせていただいて、やってみた。

私はVerilator ManualのDPI Sample記述をそのままにやっていた。下にそのDPI Sampleを引用する。
まずはVerilogサンプルから。

module test;
import "DPI-C" function integer add (input integer a, input integer b);

   initial begin
      $display("%x + %x = %x", 1, 2, add(1,2));
   end
endmodule


次にC++のサンプルを下に引用する。

    #include "svdpi.h"
    #include "Vour__Dpi.h"
    int add (int a, int b) { return a+b; }


これでコンパイルした。

verilator -cc our.v --exe sc_main.cpp


しかし、Inernal Errorになってしまった。
Verilator_26_110605.png

どうやら、$display("%x + %x = %x", 1, 2, add(1,2));で$displayの中にadd(1,2)を書くのがダメそうだ。そこで、int c;を定義して、$displayの前にadd()をコールしてみた。下に修正後のVerilogソースを示す。ついでに$finish;も追加した。

module test;
import "DPI-C" function integer add (input integer a, input integer b);

   int c;
   initial begin
      c = add(1, 2);
      $display("%x + %x = %x", 1, 2, c);
      $finish;
   end
endmodule


これでコンパイルしたら通った。次にobj_dirにcd して、makeを実行した。

make -j -f Vour.mk Vour


今度は ld がステータス1で終了してしまった。
Verilator_27_110605.png

電気回路/HDL/Verilator で DPI-C”をよく見ながら考えた。そうだC++にmain()が書いていない。。。おマヌケだった。。
他も修正した結果を下に示す。

#include <verilated.h> 
#include "Vour.h"
#include "svdpi.h"
#include "Vour__Dpi.h"

extern "C" int add (int a, int b) { return a+b; }

unsigned int main_time = 0;     // Current simulation time

double sc_time_stamp () {       // Called by $time in Verilog
    return main_time;
}

int main(int argc, char** argv) {
    Verilated::commandArgs(argc, argv);   // Remember args

    Vour *top = new Vour();   // Create instance

    while (!Verilated::gotFinish()) {

        top->eval();    // 評価

        main_time++;
    }

    top->final();        // シミュレーション終了
}


これで、コンパイル、makeして、実行ファイルができたので、実行した。
Verilator_28_110605.png

うまく行きました。良かった。。。

次に、Verilogでadd()をtask としてresultを出力として返すようにVerilogファイルを変更した。

module test;

import "DPI-C" task add (input int a, input int b, output int result);

   integer a, b, result;
   initial begin
      a = 1;
      b = 2;
      add(a, b, result);
      $display("%x + %x = %x", a, b, result);
      $finish;
   end
endmodule


C++の方も示す。

#include <verilated.h> 
#include "Vour2.h"
#include "Vour2__Dpi.h"

extern "C" int add (int a, int b, int *result) { 
    *result = a + b;
    return (0); 
}
    
unsigned int main_time = 0;     // Current simulation time

double sc_time_stamp () {       // Called by $time in Verilog
    return main_time;
}

int main(int argc, char** argv) {
    Verilated::commandArgs(argc, argv);   // Remember args

    Vour2 *top = new Vour2();   // Create instance

    while (!Verilated::gotFinish()) {

        top->eval();    // 評価

        main_time++;
    }

    top->final();        // シミュレーション終了
}


同様にコンパイル、make、実行したら、うまく行った。
Verilator_29_110605.png
  1. 2011年06月05日 07:59 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

今まで書いた技術論文

今まで書いた技術論文を下に示す。お恥ずかしい書き方のあるが、書いておいてよかったと思う。

1.KUE―CHIP2マイクロプロセッサ用エミュレータの開発
2.EDO制御モジュールの実現
3.バスプロトコル変換チップの実現
4.MIPSプロセッサ実験システムの開発
5.クラスタ計算機用ネットワークインターフェースの実現
6.Altera社CPLDとその設計事例
7.Maestro2 ネットワークインターフェースの開発
8.Maestro2 スイッチボックスの開発
9.Maestro3 クラスタネットワーク用基板の設計
10.FPGA による PCI バス・インターフェース回路の実装
11.Spartan3A Starter Kit による DDR2 SDRAM コントローラの実装
12.FPGAを使用したCMOSカメラ・ディスプレイ回路の製作
13.2次元Max-Plusウェーブレット変換・逆変換実証回路の作製(2012年に発表)
14.DDR2 SDRAM をフレームバッファに使用した CMOS カメラ表示回路の実装
15.夏休み自由研究お助け隊の新規テーマ作成と運用について
16.ニューラルネットワークを使用した HD から 4K2K への解像度変換ボケ復元回路の実装
17.ソフトウェアとハードウェア性能比較実験装置の開発

後は、トランジスタ技術とFPGA技術6号に書かせていただいた。
FPGAマガジン No.14FPGAマガジン No.15 に書かせて頂いた。
ほとんどCPLD、FPGA関係です。
  1. 2011年06月02日 21:43 |
  2. 回顧録
  3. | トラックバック:0
  4. | コメント:0

Verilatorを試してみる8(SystemCモード4:CharDispCtrlerプロジェクト)

今度は、キャラクタ・ディスプレイ・コントローラ(CharDispCtrler.v) をVerilatorでシミュレーションしてみることにした。
"キャラクタ・ディスプレイ・コントローラ"、”キャラクタ・ディスプレイ・コントローラの構成”を参照のこと。

ここでの問題は、char_gen_rom.v でXilinxのプリミティブのRAMB16_S9とframe_buffer.v で同じくRAMB16_S2_S2を使用していることだ。果たしてXilinx社製のプリミティブがVerilatorでシミュレーション出来るかが問題だと思った。
Webで検索してみると、Verilatorのフォーラムの”Simulating Xilinx Projects”を発見して、この通りにやってみることにした。(結論としてはうまくいきませんでした)

まずは、Xilinx社のプリミティブのソースのうちのRAMB16_S9.v, RAMB16_S2_S2.v, glbl.v を現在のフォルダにコピーした。(もうすでにCharDispCtrler_tb_sc.cppを作成してある)
Verilator_24_110602.png

SystemCのテストベンチ、CharDispCtrler_tb_sc.cppを作成した。CharDispCtrler_tb_sc.cppを下に示す。

// CharDispCtrler_tb_sc.cpp

#include "VCharDispCtrler.h"
#include "verilated_vcd_sc.h"

int sc_main(int argc, char **argv) {

    Verilated::commandArgs(argc, argv);   // Remember args

    sc_clock clk ("clk"40, SC_NS);
    sc_signal<bool> reset;
    sc_signal<uint32_t> processor_addr;
    sc_signal<uint32_t> processor_din;
    sc_signal<bool> processor_we;
    sc_signal<bool> VGA_RED, VGA_GREEN, VGA_BLUE;
    sc_signal<bool> VGA_HSYNC, VGA_VSYNC;
    int clk_count;
    
    VCharDispCtrler *top;
    
    top = new VCharDispCtrler("top");
    
    top->clk(clk);
    top->reset(reset);
    top->processor_addr(processor_addr);
    top->processor_din(processor_din);
    top->processor_we(processor_we);
    top->VGA_RED(VGA_RED);
    top->VGA_GREEN(VGA_GREEN);
    top->VGA_BLUE(VGA_BLUE);
    top->VGA_HSYNC(VGA_HSYNC);
    top->VGA_VSYNC(VGA_VSYNC);
    
    Verilated::traceEverOn(true);
    VerilatedVcdC* tfp = new VerilatedVcdC;
    top->trace (tfp, 99);
    tfp->open ("simx_sc.vcd");
    
    processor_addr = 0;
    processor_din = 0;
    processor_we = 0;
    reset = 1;
    
    sc_start(45, SC_NS);
    reset = 0;
    
    sc_start(160, SC_NS);
    processor_din = 0x3B0;    // RGB=111(最上位), キャラクタ0
    
    sc_start(40, SC_NS);
    processor_we = 1;
    processor_addr = 80;    // 画面の2行1列目のキャラクタのアドレス
    
    sc_start(40, SC_NS);
    processor_we = 0;
    processor_din = 0x3C1;    // RGB=111(最上位), キャラクタA
    
    sc_start(40, SC_NS);
    processor_we = 1;
    processor_addr = 81;    // 画面の2行2列目のキャラクタのアドレス
    
    sc_start(40, SC_NS);
    processor_we = 0;
    
    sc_start(20000000, SC_NS);
    
    tfp->close();
    delete top;
    
    exit(0);        // シミュレーション終了
}    


最初に、とりあえずそのままの状態でコンパイルを試みた。コマンドを下に示す。

verilator -Wno-lint -sc --trace CharDispCtrler.v --exe CharDispCtrler_tb_sc.cpp


そうすると予想通りエラー。
Verilator_23_110601.png

Verilatorのフォーラムの”Simulating Xilinx Projects”に従って、RAMB16_S9.v, RAMB16_S2_S2.v, glbl.vを書き換えてみることにした。

1.glbl.vをWebサイトからダウンロードしたファイルに交換(これでglbl.vは終了)
2.module文の下に、// verilator tracing_offを挿入した
3.tri0 GSRを含むラインを消去した
4.GSRをglbl.GSRに置換した
5.initial文内の<= を= に置換した
6.遅延を表す#100 などを消去した
7.char_gen_rom.v, frame_buffer.v にglbl glbl;文を追加した


上記の対策を取ってみたが、やはりエラーが出る。可能なかぎり対策をとてみたがInternal Errorが出てしまった。
Verilator_25_110602.png

ここで諦めることにする。Verilatorのフォーラムの”Simulating Xilinx Projects”でもBlock RAMの変換は成功していないそうだ。残念。。。

Verilatorは、Verilogの論理合成記述のみが変換可能なのが残念だ。XilinxのIPは自分で書きなおさないと使用することが出来ないようだ。
  1. 2011年06月02日 05:26 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:4