MCU ソフト コア 3. Xilinx Artix7 での Cortex-m3 ソフト コアの実行

0. 環境

- win10 + ライブ 2018.3 + keil mdk
- jlink
- XC7A35TV12

1. ダウンロード情報

https://keilpack.azureedge.net/pack/Keil.V2M-MPS2_DSx_BSP.1.1.0.pack
https://gitee.com/whik/cortex_m3_on_xc7a100t

2.リビング2018

プロジェクトの作成 -> 次へ -> 
-> プロジェクト名: Cortex_m3
-> プロジェクトの場所: E:/Workspaces/vivado2018/XC7A35TV12/
-> 取消勾选 プロジェクトのサブディレクトリの作成
-> RTL プロジェクト
-> 次へ -> 次へ
-> xc7a35tftg256-1
-> 終了

ブロック デザインを作成するには、
[IP INTEGRATOR] で [Create Block Design] をクリックし、[デザイン名: cm3_core] -> [OK] をクリックします。

2.1 m3 IP コアの追加



mcu designstart Cortex-m3\cortex_m3_on_xc7a100t-main\cm3_coreをE:\Workspaces\vivado2018\XC7A35TV12\cortex_m3\cm3_core
コピーします。


-> [プロジェクトマネージャー] の下の [設定] をクリックします -> [IP] -> [リポジトリ] -> [追加] -> E:\Workspaces\vivado2018\XC7A35TV12\cortex_m3\cm3_core -> [適用] -> [OK
]

Cortex-M3 を追加し
、[図] の下の [+] をクリックし、[フィルター] をクリックして Cortex-M3 をダブルクリックします -> 新しいインスタンス CORTEXM3_AXI_0 をダブルクリックします -> 
-> デバッグ -> トレース レベル: 0 = トレースなし -> JTAG Port Present のチェックを外します
->命令メモリ -> ITCM サイズ: 64kB -> ITCM の初期化のチェックを外します

2.2 クロックウィザード

[図] の下の [+] をクリックして、[フィルター] をクリックし、[クロッキング ウィザード] をダブルクリックします -> 新しいインスタンス clk_wiz_0 をダブルクリックします -> -> 
クロッキング オプション -> プライマリ 50MHz -> - 
> 出力クロック -> clk_out1: 50MHz -> 
-> リセット タイプ:アクティブロー
- > OK

2.3 リセット


[ダイアグラム] -> [フィルター] の下の [+] をクリックし、[プロセッサー システムのリセット] -> [OK] をダブルクリックします。

「図」の下の「+」をクリックして、「フィルター」をクリックし、「ユーティリティー・ベクトル・ロジック」をダブルクリックします。 -> 新しいインスタンス「util_vector_logic_0」をダブルクリックします。 -> 「 
C_SIZE: 1」 -> 「not」 -> 「OK」

2.4 AXI


[Diagram] -> [Filter] の下の [+] をクリックし、[AXI Interconnect] -> [OK] をダブルクリックします。

ファイル -> ソースの追加 -> デザイン ソースの追加または作成 -> 次へ
-> ファイルの作成 -> swdiobuf -> OK
-> 完了

2.5 SWD デバッグポート


swdiobuf.v を変更し
、次の内容を追加します。

module swdiobuf(
    input swd_o,
    output swd_i,
    input swd_oe,
    inout swd_io
    );
    IOBUF swd_iobuf_inst1
    (
        .O(swd_i),
        .I(swd_o),
        .IO(swd_io),
        .T(~swd_oe)    //
        );
        
endmodule

[ソース] -> [デザイン ソース] -> -> 右クリックして [swdiobuf] を選択 -> [モジュールをブロック デザインに追加]


CORTEXM3_AXI_0 swdiobuf_0 SWDO
swd_o
SWDOEN swd_oe
SWDITMS swd_i swd_io
を右クリック -> 外部作成 -> 名前を cm3_swdio に変更します。

2.6 Cortex-m3のインターフェース構成


「図」の下の「+」をクリックして、「フィルター」をダブルクリックし、「定数」をダブルクリックします。「新しく作成したインスタンス xlconstant_0 をダブルクリックします。」「定数幅: 1」→「ConstVal: 0」→「OK」→「出力接続 NMI」をクリックします。「図」の下の「+」をクリックして、「フィルター」をダブルクリックします。 -> Constant をクリック
-> 新しいインスタンス xlconstant_1 をダブルクリック -> Const width: 2 -> ConstVal: 1 -> OK -> 名前を cfg_itc に変更 -> 接続 CFGITCMEN を出力し、Diagram の下の + をクリック -> Filter をダブル
クリックConstant -> 新しいインスタンス xlconstant_2 をダブルクリック -> Const width: 1 -> ConstVal: 1 -> OK -> 名前を cfg_itc に変更 -> 出力接続 IRQ

 

2.7 周辺機器


[ダイアグラム] の下の [+] をクリックし、[フィルター] をクリックして [AXI GPIO] をダブルクリックします -> 新しいインスタンス axi_gpio_0 をダブルクリックします -> 
-> GPIO -> [すべての出力] をチェックします -> [GPIO 幅: 4]
-> [デュアル チャネルを有効にする] をチェックします 
-> [GPIO 2] -> 「すべての入力を選択」にチェックを入れます -> GPIO 幅: 4
-> OK

[ダイアグラム] -> [フィルター] の下の [+] をクリックし、[AXI Uartlite] をダブルクリックします -> 新しいインスタンス axi_uartlite_0 をダブルクリックします -> 
-> ボー レート: 115200
-> OK

2.8 ペリフェラルベースアドレスの割り当て


アドレスエディタ -> アドレスの自動割り当て

 

2.9 検証


空白スペースを右クリック -> デザインの検証

2.10 梱包


点击 IP INTEGRATOR 下のブロック デザインの生成 -> グローバル ->
ソースの生成 -> 右键 microblaze_core -> HDL ラッパーの作成 -> 生成されたラッパーをコピーしてユーザー編集を許可 -> OK

2.11 パッケージ上部


ソース -> ソースの追加 -> 右クリックして wdiobuf を選択 -> ブロック デザインにモジュールを追加

ファイル -> ソースの追加 -> デザイン ソースの追加または作成 -> 次へ
-> ファイルの作成 -> top_hdl -> OK
-> 完了

module top_hdl(
    //Inputs
    input clk,
    input rst_n,
    input swclk,
    input uart_rxd,
    input [3:0] sw,
    
    //Outputs
    output [3:0] led,
    output uart_txd,

    //Inouts
    inout swdio
);

cm3_core_wrapper cm3_core_wrapper_ut0(
    //Inputs
    .cm3_clk(clk),
    .cm3_resetn(rst_n),
    .cm3_gpio_in_tri_i(sw[3:0]),
    .cm3_swclk(swclk),
    .cm3_uart0_rxd(uart_rxd),
    
    //Outputs
    .cm3_gpio_out_tri_o(led[3:0]),
    .cm3_uart0_txd(uart_txd),
    
    //Inouts
    .cm3_swdio(swdio)
);

endmodule   //top_hdl end


2.12 コンパイル


RTL 分析 -> 回路図
-> I/O ポート
-> 保存... -> Cortex_m3.xdc

2.13 制約ファイル Cortex_m3.xdc を変更する

set_property PACKAGE_PIN D4 [get_ports clk_50m]
set_property IOSTANDARD LVCMOS33 [get_ports clk_50m]

set_property PACKAGE_PIN C4 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]

set_property PACKAGE_PIN K12 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]

set_property PACKAGE_PIN L14 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]

set_property PACKAGE_PIN L13 [get_ports {led[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}]

set_property PACKAGE_PIN M14 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}]

set_property PACKAGE_PIN D11 [get_ports {key[0]}]
set_property IOSTANDARD SSTL15 [get_ports {key[0]}]

set_property PACKAGE_PIN G11 [get_ports {key[1]}]
set_property IOSTANDARD SSTL15 [get_ports {key[1]}]

set_property PACKAGE_PIN H11 [get_ports {key[2]}]
set_property IOSTANDARD SSTL15 [get_ports {key[2]}]

set_property PACKAGE_PIN K13 [get_ports {key[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {key[3]}]

set_property PACKAGE_PIN E6 [get_ports uart_txd]
set_property IOSTANDARD LVCMOS33 [get_ports uart_txd]

set_property PACKAGE_PIN C7 [get_ports uart_rxd]
set_property IOSTANDARD LVCMOS33 [get_ports uart_rxd]

set_property PACKAGE_PIN M15 [get_ports swclk]
set_property IOSTANDARD LVCMOS33 [get_ports swclk]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets swclk_IBUF]

set_property PACKAGE_PIN R16 [get_ports swdio]
set_property IOSTANDARD LVCMOS33 [get_ports swdio]

#set_property BITSTREAM.CONFIG.UNUSEDPIN Pulldown [current_design]
#set_property BITSTREAM.CONFIG.UNUSEDPIN Pullup [current_design]
set_property BITSTREAM.CONFIG.UNUSEDPIN Pullnone [current_design]

set_property BITSTREAM.CONFIG.SPI_32BIT_ADDR NO [current_design]
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
set_property BITSTREAM.CONFIG.SPI_FALL_EDGE YES [current_design]


説明
-> 合成の実行
-> 実装の実行
-> ビットストリームの生成

ダウンロード
ハードウェア マネージャーを開く -> ターゲットを開く -> 自動接続 -> ハードウェア列で xc7a35t_0 を右クリック -> プログラム デバイスをクリック -> ビットストリーム ファイル: E:
/Workspaces/vivado2018/XC7A35TV12/cortex_m3/vivado/cortex_m3.runs/impl_1 /top_hdl .bit

固化
ツール -> メモリ構成ファイルの生成 -> 
-> MCS
-> 128MB
-> ファイル名: E:/Workspaces/vivado2018/XC7A35TV12/cortex_m3/vivado/cortex_m3.runs/impl_1/cortex_m3.mcs
-> インターフェイス: SPIx4
->段階選択 ビットストリーム ファイルをロード 
-> ビットファイル: E:/Workspaces/vivado2018/XC7A35TV12/cortex_m3/vivado/cortex_m3.runs/impl_1/top_hdl.bit


E:/Workspaces/vivado2018/XC7A35TV12/cortex_m3/vivado/cortex_m3.runs/impl_1
の下の
led_test.mcs
led_test.prmを手動で削除してください。

-> OK
-> 構成メモリデバイスの追加 -> n25q128-3.3v と入力 -> OK

烧写
-> 構成ファイル: E:/Workspaces/vivado2018/XC7A35TV12/cortex_m3/vivado/cortex_m3.runs/impl_1/cortex_m3.mcs
-> PRM ファイル: E:/Workspaces/vivado2018/XC7A35TV12/cortex_m3/vivado/cortex_m3.runs /impl_1/cortex_m3.prm
-> OK

3.ケイル


3.1 デバイスライブラリのインストール


Keil.V2M-MPS2_DSx_BSP.1.1.0.pack を直接ダブルクリックしてインストールします。

3.2 新築


プロジェクト -> 新しい uVision プロジェクト -> E:\Workspaces\vivado2018\XC7A35TV12\cortex_m3\mdk\ds_cm3
-> ターゲットのデバイスを選択 -> ARM -> ARM Cortex M3 -> DS_CM3 -> OK -
> CMSIS で CORE を確認
-> Device
-> OKFile -> New で Startup を確認し
、次の内容を追加します

#include "DS_CM3.h"
#include "system_DS_CM3.h"

int main(void)
{
    while(1)
    {

    }
}



E:\Workspaces\vivado2018\XC7A35TV12\cortex_m3\mdk\src\main.cに保存します。

RAM および ROM アドレスを設定します。
プロジェクト オプションで、オンチップ ITCM 開始アドレス 0x0、サイズ 64K、およびオンチップ DTCM 開始アドレス 0x20000000、サイズ 64K を設定します:
ターゲット -> ターゲット -> 
-> IROM1 のオプション: 開始: 0x0、サイズ: 0x10000、
-> IRAM1: 開始: 0x20000000、サイズ: 0x10000、

 

3.3 main.c を変更する


main.c は、mcu designstart Cortex-m3\cortex_m3_on_xc7a100t-main\mdk_prj\application\main.c を直接使用します。

3.4 フラッシュプログラミングアルゴリズムの生成


ファイル ブラウザで D:\Keil\mdk5\ARM\Flash を開き
、 
D:\Keil\mdk5\ARM\Flash\_TemplateをD:\Keil\mdk5\ARM\Flash\DS_CM3
にコピーします。


D:\Keil\mdk5\ARM\Flash\DS_CM3\NewDevice.uvprojx をダブルクリックしてFlashDev.cを開き、

struct FlashDevice const FlashDevice  =  {
   FLASH_DRV_VERS,             // Driver Version, do not modify!
   "New Device 256kB Flash",   // Device Name 
   ONCHIP,                     // Device Type
   0x00000000,                 // Device Start Address
   0x00040000,                 // Device Size in Bytes (256kB)
   1024,                       // Programming Page Size
   0,                          // Reserved, must be 0
   0xFF,                       // Initial Content of Erased Memory
   100,                        // Program Page Timeout 100 mSec
   3000,                       // Erase Sector Timeout 3000 mSec

// Specify Size and Address of Sectors
   0x002000, 0x000000,         // Sector Size  8kB (8 Sectors)
   0x010000, 0x010000,         // Sector Size 64kB (2 Sectors) 
   0x002000, 0x030000,         // Sector Size  8kB (8 Sectors)
   SECTOR_END
};


着替える:

struct FlashDevice const FlashDevice  =  {
   FLASH_DRV_VERS,             // Driver Version, do not modify!
   "MyCM3onFPGA",              // Device Name 
   ONCHIP,                     // Device Type
   0x00000000,                 // Device Start Address
   0x00010000,                 // 修改为64KB
   1024,                       // Programming Page Size
   0,                          // Reserved, must be 0
   0xFF,                       // Initial Content of Erased Memory
   100,                        // Program Page Timeout 100 mSec
   3000,                       // Erase Sector Timeout 3000 mSec

// Specify Size and Address of Sectors
   0x010000, 0x000000,         // 只有一个扇区,起始地址为0
   SECTOR_END
};

D:\Keil\mdk5\ARM\Flash\DS_CM3\NewDevice.FLM をコンパイルして生成し、
このファイルを
D:\Keil\mdk5\ARM\Flash\DS_CM3.FLMにコピーします。

ds_cm3.uvprojx プロジェクトに戻ります
-> ターゲット 1 を右クリック -> ターゲットのオプション -> デバッグ -> J-LINK を使用 -> 設定 -> -> 
フラッシュ ダウンロード -> 追加 -> MyCM3onFPGA -> 追加

3.5 ダウンロードテスト

ダウンロード時には、jlink の swdio、swclk、gnd を使用して、fpga ボード上の対応する 3 つの線を接続します。

ダウンロードする際は、keilのFlash→ダウンロードからダウンロードを開始してください。


 ダウンロード後、実行する前にリセットを押す必要がある場合があります。


 
 参考

[1]在FPGA上搭建Cortex-m3软核,https://blog.csdn.net/m0_50735735/article/details/124253664
[2]手把手教你在FPGA上运行一个ARM Cortex-M3软核,https://zhuanlan.zhihu.com/p/489213515
[3]ARM Cortex M3 verilog源代码 Cortex-M3 DesignStart评估,https://www.amobbs.com/thread-5756149-1-1.html
[4]如何用FPGA实现一个ARM Cortex-M3软核,https://blog.csdn.net/whik1194/article/details/123784346


 

おすすめ

転載: blog.csdn.net/qq_27158179/article/details/132856744