FC2カウンター FPGAの部屋 FPGA内蔵マイクロコントローラ

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

FPGAの部屋

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

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

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

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

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
»