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