FC2カウンター FPGAの部屋 XPS入りのPlanAhead14.1プロジェクトを作る4(シミュレーション)
FC2ブログ

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

FPGAの部屋

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

XPS入りのPlanAhead14.1プロジェクトを作る4(シミュレーション)

XPS入りのPlanAhead14.1プロジェクトを作る3(SDK)”の続き。
(2012/05/23に追記しました。ソフトウェアをロードした状態でシミュレーションすることができました)

今度は自分で作ったXPS入りのPlanAhead14.1プロジェクトでシミュレーションをしてみた。普通の作り方はシミュレーションを行なってからインプリメントすると思う。しかし、XPSで作ったプロジェクトは規模が大きくなりやすいし、前回32ビット版Windowsでは(たぶん?)シミュレーションできなかったので、自作IPは単体シミュレーションしておいて、全体としてはインプリメントするほうが良いと思う。

さて、最初にテストベンチファイルを作成するのだが、PlanAheadではProject Navigator に付いていたテストベンチのテンプレートを作成する機能が見当たらない。そこで、”Vimをインストールした”でインストールしてあったVimを使用してテストベンチのテンプレートを作成することにした。

・Vimを立ちあげて、トップファイルのsystem_stub.v をオープンして、HDLメニューからVerilog Testbench を選択したらテストベンチのテンプレートが作成された。
PlanAhead141_103_120521.png

・クロックの周期の半分を32から5 に変更し、tb_system_stub.v をしてセーブした。

・PlanAheadのFileメニューのAdd Sources... を選択して出てきたダイアログのAdd or Create Simulation Sources を選択して、tb_system_stub.v をプロジェクトに追加した。
PlanAhead141_104_120521.png

・PlanAheadのプロジェクトにtb_system_stub.v が追加された。
PlanAhead141_105_120521.png

・左のウインドウでProject Manager -> Run Behavioral Simulation をクリックした。

・Launch Run Behavioral Simulationダイアログが表示された。sim1を確認して、Launchボタンをクリックした。
PlanAhead141_106_120521.png

・エラーが出てしまった。
PlanAhead141_107_120521.png

・エラーの内容を見るとclk とrst がないと言われている。clk の宣言はCLKでされていた。clk を大文字に修正した。rst はそもそも宣言がないので、RESETに修正した。Vimのテストベンチ・テンプレート作成上のバグかな?
PlanAhead141_108_120521.png

・ISimが起動してシミュレーションが実行された。更に信号を追加して100usec までシミュレーションした。
PlanAhead141_109_120521.png

sim_1の環境にaxi_timer_test.elf が入っていても、ソフトウェアをロードしていないんじゃないか?と思う。axi_timer_0のシミュレーション結果を見てもaxi4_liteバスのWriteが出ていない。ソフトウェアで初期化をしているはずなんだけど。。。

・simulation でワーニングが大量に出いた。その中で最初のワーニングに従って、コンパイル時のオプションを追加してみることにした。
PlanAhead141_110_120521.png

・Run Behavioral Simulation をクリックした後のLaunch Run Behavioral SimulationダイアログのOptions...ボタンをクリックして、CompilationタブのMore Fuse Options に-mt off -v 1 を追加した。
PlanAhead141_111_120521.png

シミュレーションをしてみたが変化なし。ELFファイルはロードしてくれないのだろうか?
Xilinxのサイトからマニュアルを漁ってみたが記述が見つからない。何か情報がある方は教えて下さい。

(2012/5/23:追記)
シミュレーションにソフトウェアがロードされていない原因がわかりました。
色々ファイルを見てみたんですが、Atlys_EDK_test_PA\Atlys_EDK_test_PA.sim\sim_1\runme.bat がPlanAheadが生成したISim simulation Script でした。見てみると、data2mem でmb_bootloop_le.elf がロードされていました。(axi_timer_test.elfではなく)

ToolsメニューからAssociate ELF Files... を選択して、ダイアログを開くとsim_1には、mb_bootloop_le.elf が関連付けられていました。
PlanAhead141_112_120523.png

Sourcesウインドウにはsim_1 にはaxi_timer_test.elf が関連付けられているように表示されていたんですが。。。
PlanAhead141_105_120521.png

必ず、Associate ELF Files... で確認する必要がありますね。

・さて、sim_1 にaxi_timer_test.elf を関連付けました。axi_timer_test.elf があるパスは、Atlys_EDK_test_PA\Atlys_EDK_test_PA.sdk\SDK\SDK_Export\axi_timer_test\Debug です。
PlanAhead141_113_120523.png

・もう一度、左のウインドウでProject Manager -> Run Behavioral Simulation をクリックしました。

・Launch Run Behavioral Simulationダイアログが表示されるので、sim1を確認して、Launchボタンをクリックしてシミュレーションのコンパイルを開始させます。

・ISimが立ちあげて、1usec シミュレーションを行いましたが、まだaxi_timer_0 にWirte するところが見えないので、更に10usec シミュレーションを行いました。

・axi_timer_0 に初期設定を書き込むところが見えました。
axi_timer_test.c のaxi_timer_0 に初期設定を行う部分のコードです。

// AXI_TIMER define
#define AXI_TIMER_0_TCSR0    XPAR_AXI_TIMER_0_BASEADDR    // Control/Status Register 0
#define AXI_TIMER_0_TLR0    XPAR_AXI_TIMER_0_BASEADDR+0x4    // Load Register 0
#define AXI_TIMER_0_TCR0    XPAR_AXI_TIMER_0_BASEADDR+0x8    // Timer/Counter Register 0
#define AXI_TIMER_0_TCSR1    XPAR_AXI_TIMER_0_BASEADDR+0x10    // Control/Status Register 1
#define AXI_TIMER_0_TLR1    XPAR_AXI_TIMER_0_BASEADDR+0x14    // Load Register 1
#define AXI_TIMER_0_TCR1    XPAR_AXI_TIMER_0_BASEADDR+0x18    // Timer/Counter Register 1

#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 axi_intc_init() {
    *(volatile unsigned int *)(MICROBLAZE_0_INTC_IER) = 0x1;    // int0 enable
    *(volatile unsigned int *)(MICROBLAZE_0_INTC_MER) = 0x3;    // IRQ Enable
}

void axi_timer_init(){
    *(volatile unsigned int *)(AXI_TIMER_0_TLR0) = 100000000// 100MHzで1秒
    *(volatile unsigned int *)(AXI_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | LOAD_TIMER; // TLR0へロード
    *(volatile unsigned int *)(AXI_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | DOWN_UP_COUNT_TIMER; // GenerateモードでDWONカウント、割り込みあり
}


axi_timer_init()がaxi_timer_0 の初期化ルーチンです。AXI_TIMER_0_TLR0にカウント値を書いてから、一度、AXI_TIMER_0_TCSR0にAXI_TIMER_0_TLR0にカウント値をロードする値を書いて、もう一度、TIMER_0_TCSR0にカウントのモードを書いています。
ISimのその部分の波形を下に示します。
PlanAhead141_114_120523.png

上の波形では、下に示す順番でaxi_timer_0 のレジスタに書き込む様子が見えると思います。
1.0x41c00004(AXI_TIMER_0_TLR0)番地に、0x05f5e100(十進数で100000000)をWrite
2.0x41c00000(TIMER_0_TCSR0)番地に、0x00000420をWrite
3.0x41c00000(TIMER_0_TCSR0)番地に、0x000004c2をWrite

これで、ソフトウェアをロードした状態で、回路全体のシミュレーションをすることができました。
  1. 2012年05月22日 05:51 |
  2. PlanAheadについて
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/2152-947fee97
この記事にトラックバックする(FC2ブログユーザー)