”
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 をシミュレーション用ファイルとして、プロジェクトに追加した。
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 を設定した。
7.3us シミュレーションを行うと、openMSP430が動作しているのが見えた。
これでシミュレーションはできそうだ。この方法で行くと、data2memを実行しなくても、ソフトウェアをロードすることができる。
(2011/06/27:追記) data2memを実行しない状態での実機での動作を確認しました。
しかし、これだとソフトウェアを修正後にインプリメントが必要なので、data2memにもメリットがあると思う。
2011年06月24日 21:03 |
FPGA内蔵マイクロコントローラ
| トラックバック:0
| コメント:0
”
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
2011年06月22日 05:34 |
FPGA内蔵マイクロコントローラ
| トラックバック:0
| コメント:0
今回は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”コマンドを入力して起動した。
すると、エラーが出て停止してしまった。
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が必要のようだ。
Windows用のIcarus Verilogを、
ここからダウンロード してインストールした。(iverilog-0.9.4_setup.exe)
再々度、Cygwinから”./mps430sim leds”コマンドを入力して起動した。
今度は、BUFGやDCM等がUnknown module と言われてしまった。
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 以下にすべてのライブラリをコピーした。
そして、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でシミュレーションをやってみたい。
2011年06月16日 05:43 |
FPGA内蔵マイクロコントローラ
| トラックバック:0
| コメント:0
openMSP430のデバックは、openmsp430\trunk\tools\bin のopenmsp430-gdbproxyやopenmsp430-minidebugを使用するのだと思う。
実際の動作画面は、
openMSP430 :: Software development tools に記載されている。
tclの実行には、activetclをインストールしたが、openmsp430\trunk\tools\freewrap642のgenerate_exec.batを実行すると、実行形式のファイルが生成される。
最初に起動したときは、openmsp430-gdbproxy、openmsp430-minidebug両方が全く動作しなかったが、それは私のパソコンにシリアルポートが無かったからだ。USBシリアルケーブルを接続したら、両方共立ち上がった。
最初に、openmsp430-gdbproxyの画面。
openmsp430-minidebugの画面。
両方共、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を立ち上げ、コネクトしてみようとしたが、だめだった。
なぞだ?何処かおかしいのだと思う。
2011年06月14日 05:47 |
FPGA内蔵マイクロコントローラ
| トラックバック:0
| コメント:4
前回は、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アイコンをクリックして、コンパイルを開始した。そうしたらエラーが発生した。
最初のエラーを下に示す。
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 の下にあった。
そこで、openMSP430_fpga.v の35行目の下の行を
`include "openMSP430_defines.v"
下のように変更した。
`include "openmsp430/openMSP430_defines.v"
これでもう一度コンパイルしたら、無事にコンパイルが終了した。
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_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に増えていた。
Quartus IIのEntityウインドウのHierarchyタブを見ると、dbgがインスタンスされていて、その下にdbg_uart_0があった。
動作周波数は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動作のようだ。
2011年06月13日 05:41 |
FPGA内蔵マイクロコントローラ
| トラックバック:0
| コメント:0
”
openMSP430のSpartan3 Stater Kitへのインプリメント ”の続き。
前回で、Spartan3 Stater Kit用のopenMSP430がインプリメントできたので、今回はopenmsp430\trunk\fpga\xilinx_diligent_s3board\software\leds のソフトウェアサンプルを動作させてみる。
まずはCygwinで、ledsをmake all した。
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_fpga_rp.bit が生成される。これをiMPACTでSpartan3 Stater Kitにダウンロードする。するとLEDが点滅して、7セグメントLEDに文字が表示された。
これで、一応デモは動作した。次は、RS-232Cからダウンロードできるかどうか?GDBが使えるかどうかを調べてみたい。
2011年06月09日 21:24 |
FPGA内蔵マイクロコントローラ
| トラックバック:0
| コメント:0
今回は、OpenCoures のopenMSP430 のプロジェクトをダウンロードして、解凍した。
openMSP430 :: Overvie wのLatest version: downloadをクリックしてダウンロードした。openmsp430_latest.tar.gz がダウンロードできたので、解凍したところopenMSP430フォルダができた。
openmsp430\trunk\fpga\xilinx_diligent_s3boardにSpartan3 Stater Kit用のプロジェクトが入っているようなので、これをやってみることにした。
openmsp430\trunk\fpga\xilinx_diligent_s3board\synthesis\xilinx にcreate_bitstream.bat があるので、ISE13.1のISE Design Suteコマンド プロンプトを立上て、create_bitstream.batを起動した。
すると、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 はプロジェクトに入れないでこのままインプリメントしてみた。
インプリメントが成功した。インプリメント結果を下に示す。
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等が入っているのか。。。
2011年06月09日 05:33 |
FPGA内蔵マイクロコントローラ
| トラックバック:0
| コメント:0