2013-10-24 (木) 08:48:25

FPGAに組み込んで使えるCPU・「Mico8」というのがあります。

今回はこれをとにかく使おうと思います。

すべてコマンドプロンプトでの操作になりますが、C言語で動かします。

ここで作成するプロジェクトファイルをダウンロードできます icon_archive.gifmico8_test3.zip

環境準備

Lattice Semiconductorのwebサイトから、開発ツール(gccとか)と、Mico8のHDLソース一式を入手します。

開発ツールの入手

tool01.png

Lattice semiconductorのwebサイトにアクセスします。

「製品」をクリックします。


tool02.png

「設計ソフトウェア」の「LatticeMicoシステム開発ツール」をクリックします。


tool03.png

今回はMicoシステムビルダ(MSB)を使わない方法で動かします。

「See Also」の「LatticeMico8」をクリックします。


tool04.png

「LatticeMico8アーカイブページ [EN]」をクリックします。


tool05.png

「LatticeMico8 Development Tools Installer for Windows - LatticeMico8 Core Revision 3.15」をクリックします。


tool06.png

ライセンス内容を確認し、チェックを入れ、「Download」をクリックします。

開発ツールのインストール

install01.png

ウィザードに従ってインストールしてください。

以降、インストールフォルダは「c:\LatticeMico8」とします。


install02.png

install03.png

install04.png

install05.png

install06.png

install07.png

HDLソースの入手

「開発ツールの入手」の「LatticeMico8アーカイブページ」にアクセスします。

source01.png

「LatticeMico8 Core Source Code Revision 3.15 Verilog Only」をクリックします。


source02.png

ライセンス内容を確認し、チェックを入れ、「Download」をクリックします。

以降、このダウンロードしたファイルは「c:\temp」以下に解凍されているものとします。

プログラム作成

ごく簡単な、プログラムを動かします。

Cソースの作成

2つの変数を加算し、結果をポートから出力します。

このポートの先に、LEDとか、液晶とかを繋げれば、組み込みシステムっぽくなります(今回はポートむき出し)。

#define EXPORT(a, b) __asm__ volatile ("export %0, %1" : : "r"(a), "n"(b))

int main()
{
  char a;
  char b;
  char c;
  
  a = 10;
  b = 20;
  
  c = a + b;
  
  EXPORT(c, 10);
  
  return 0;
}

GCCインラインアセンブラについての情報

http://caspar.hazymoon.jp/OpenBSD/annex/gcc_inline_asm.html

コンパイル

先に入手し展開してある開発ツールの「gtools\bin」フォルダ以下「lm8-elf-gcc」を使ってコンパイルします。

  • ツールの場所:「c:\LatticeMico8\gtools\bin\lm8-elf-gcc」
  • ソースの場所:「c:\test\c\main.c」

とすると、

コマンドプロンプトを立ち上げる

「スタート」−「すべてのプログラム」−「アクセサリ」−「コマンドプロンプト」をクリックします。

ソースファイルのフォルダに移動する

ソースファイルの場所を「c:\test\c\main.c」だとすると、

cd c:\test\c

と入力します(最後にEnterを入力)。

コンパイルする

コンパイラは「c:\LatticeMico8\gtools\bin\lm8-elf-gcc」にあるので、

c:\LatticeMico8\gtools\bin\lm8-elf-gcc main.c

と入力します(最後にEnterを入力)。

バイナリファイルを作成

コンパイラから出力されたファイル(a.out)はELFフォーマットです。

これを命令の羅列、バイナリフォーマットに変換します。

同じくコマンドプロンプトから、以下のコマンドを入力します

c:\LatticeMico8\gtools\bin\lm8-elf-objcopy -O binary a.out a.bin

これにより、バイナリファイル(a.bin)が作成されました。

hexファイルを作成

命令の羅列は作成されましたが、これをMico8で動かすにはテキストファイルでなければなりません。

そのため、バイナリファイルをテキストファイルに変換します。

c:\LatticeMico8\gtools\bin\bin_to_verilog --LM8 --EB a.bin prom_init.hex

シミュレーション

動作確認には、シミュレータ「Active-HDL」を使います。

プロジェクト作成

sim01.png

Active-HDLを起動します。

Lattice Diamond 1.2がインストールしてあるのなら、「スタート」−「すべてのプログラム」−「Lattice Diamond 1.2」−「Accessories」−「Active-HDL Lattice Edition」をクリックします。

「Create new workspac」にチェックを入れ「OK」をクリックします。


sim02.png

ワークスペースフォルダに「c:\test」、ワークスペース名を「sim」と入力し、「OK」をクリックします。


sim03.png

「Create an Empty Design」にチェックを入れ、「次へ」をクリックします。


sim04.png

「VERILOG」「Lattice」「XP2」を選択し、「次へ」をクリックします。


sim05.png

デザイン名に「sim01」と入力し、「次へ」をクリックします。


sim06.png

「完了」をクリックします。

ファイルの準備

simfile01.png

「Add New File」をダブルクリックします。


simfile02.png

「Add Existing File」をクリックします。


simfile03.png

ダウンロードし、解凍したHDLソースが「c:\temp\LatticeMico8_v3_15_Verilog\source」にあるので、以下のHDLソースを追加します。

このとき、「Make local copy」にチェックを入れてください

  • isp8_alu.v
  • isp8_core.v
  • isp8_flow_cntl.v
  • isp8_idec.v
  • isp8_io_cntl.v
  • timescale.v
  • isp8_cfg.v(config4フォルダ下)

simfile04.png

再度、上記手順「Add New File」のダブルクリック、「Add Existing File」のクリックをします。

「c:\temp\LatticeMico8_v3_15_Verilog\models\pmi」にある、以下のHDLソースを追加します。

同じく「Make local copy」にチェックを入れます。

  • pmi_addsub.v
  • pmi_distributed_dpram.v
  • pmi_distributed_spram.v
  • pmi_ram_dp.v
  • pmi_ram_dq.v
  • pmi_rom.v

simfile05.png

さらに「Add New File」をダブルクリックし、今度は「Verilog Source Code」のアイコンをクリックし、ファイル名「tb_sim.v」を入力します。

「OK」をクリックします。

次のコードを入力します。

 `include "timescale.v"
 
 module tb_sim(
  output reg mreset,
  output reg mclock
  );
  
  initial begin
    mreset <= 1'b1;
    mclock <= 1'b0;
  end
  
  always begin
    #(10);
    mclock <= ~mclock;
  end
  
  initial begin
    @(posedge mclock);
    mreset <= 1'b1;
    @(posedge mclock);
    mreset <= 1'b0;
    @(posedge mclock);
    mreset <= 1'b1;
  end
  
endmodule
simfile06.png

「Add New File」をダブルクリックし、「tb_top.vt」を新規作成します。

次のコードを入力します。

`include "timescale.v"

module tb_top();

  wire mclock;
  wire mreset;

  tb_sim tb_sim_u (
    .mclock(mclock),
    .mreset(mreset)
  );

  isp8 isp8_u (
    .clk(mclock),
    .rst_n(mreset),

    .ext_io_din(),
    .ext_io_ready(1'b1),
    .intr(1'b1),
    .ext_addr(),
    .ext_addr_cyc(),
    .ext_io_dout(),
    .ext_io_wr(),
    .ext_io_rd(),
    .intr_ack()
  );

endmodule

コンパイル

compile01.png

「Design」−「Compiles All with File Reorder」をクリックします。


compile02.png

「File」−「New」−「Waveform」をクリックします。


compile03.png

プルダウンメニューから、トップモジュール「tb_top」をクリックします。


compile04.png

クロック信号とリセット信号を確認します。

「Structure」タブをクリックし、「tb_top」を右側の「Waveform」にドラッグします。


compile05.png

シミュレーション時間(1ms)を入力します。

「simulation」−「Run Until...」をクリックします。


compile06.png

「OK」をクリックします。

波形確認

wave01.png

クロック信号とリセット信号のシミュレーションが行われました。

信号は出ているようですが、どうも小さい……。


wave02.png

波形の拡大、縮小、移動ができます。


wave03.png

シミュレーション時間を戻します。

「Simulation」−「Restart Simulation」をクリックします。


wave04.png

「File」−「New」−「Waveform」をクリックし、波形ウィンドウを作成します。

今度は「isp8_u」をドラッグします。


wave05.png

「simulation」−「Run Until...」をクリックします。

どうやら90ns以降で信号が途絶えているようです。

信号が不定(青い線またはXX)になっています。


wave06.png

プログラムを辿ってみましょう。

「isp8_u」の左側「+」マークをクリックし、モジュールを展開していくと「u1_isp8_prom」というのがあります。これはプログラムを格納してあるROMです。

この波形を覗くために、波形ウィンドウを作成し、信号をドラッグします。

すると、信号出力(Q)がすべて不定になっているのがわかります。


wave07.png

拡大しました。

そうだったプログラムを入れていなかった。

上記「プログラムの作成」で出力された「prom_init.hex」を、ソースコードのある場所「c:\test\sim\sim01\src」にコピーします。

wave08.png

再度シミュレーションを実行します。

「simulation」−「Restart simulation」をクリックします。

「simulation」−「Run Until...」をクリックします。

不定がなくなり、プログラムカウンタ(Address)が進んでいる様子が見えます。


wave09.png

「isp8_u」のウィンドウに戻ります。

ウィンドウのバーを移動させると、8810nsのところで、ポート出力が発生している様子が見えます。

この記事は役に立ちましたか?

選択肢 投票
役に立った 6  
役に立たなかった 0  
コレジャナイ! 0  

(画像の文字列を入力して下さい)

添付ファイル: filewave06.png 870件 [詳細] filesim06.png 914件 [詳細] filesimfile04.png 823件 [詳細] filesimfile03.png 914件 [詳細] filesimfile02.png 829件 [詳細] filesimfile01.png 892件 [詳細] filewave10.png 480件 [詳細] filewave09.png 1068件 [詳細] filewave08.png 881件 [詳細] filewave07.png 823件 [詳細] filewave05.png 908件 [詳細] filewave04.png 795件 [詳細] filewave03.png 872件 [詳細] filewave02.png 845件 [詳細] filewave01.png 875件 [詳細] filetool06.png 885件 [詳細] filetool05.png 912件 [詳細] filetool04.png 1018件 [詳細] filetool03.png 908件 [詳細] filetool02.png 953件 [詳細] filetool01.png 920件 [詳細] filesource02.png 870件 [詳細] filesource01.png 904件 [詳細] filesimfile06.png 784件 [詳細] filesimfile05.png 888件 [詳細] filesim05.png 889件 [詳細] filesim04.png 817件 [詳細] filesim03.png 911件 [詳細] filesim02.png 877件 [詳細] filesim01.png 833件 [詳細] fileinstall07.png 867件 [詳細] fileinstall06.png 818件 [詳細] fileinstall05.png 875件 [詳細] fileinstall04.png 848件 [詳細] fileinstall03.png 824件 [詳細] fileinstall02.png 896件 [詳細] fileinstall01.png 1080件 [詳細] filecompile06.png 805件 [詳細] filecompile05.png 895件 [詳細] filecompile04.png 967件 [詳細] filecompile03.png 944件 [詳細] filecompile02.png 860件 [詳細] filecompile01.png 954件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-10-24 (木) 08:48:25 (2095d)