目錄
- 實驗平台
- FSMC的地址映射
- STM32CubeMX生成工程
- 實驗步驟
- 實驗現象
實驗平台
硬件:銀杏科技GT7000雙核心開發板-ARM-STM32H743XIH6,銀杏科技iToolXE仿真器軟件:最新版本STM32CubeH7固件庫,STM32CubeMX v6.10.0,開發板環境MDK v5.35,TCP&UDP測試工具,串口工具putty網盤資料包:鏈接:https://pan.baidu.com/s/1Y3nwaY4SMxfoUsdqPm2R3w?pwd=inba提取碼: inba
FSMC的地址映射
FMC是Flexible memory controller的縮寫,譯為靈活的靜態存儲控制器。它可以用於驅動包括PSRAM、SDRAM以及NAND FLSAH類型的存儲器,也可以用於驅動液晶屏幕等模塊。
ARM的BANK1地址空間。就是FSMC連接好外部存儲器並初始化後,就可以直接通過訪問地址來讀寫資料。因為外接的存儲單元是映射到STM32的內部尋址空間的。FMC的地址映射如下所示。由於使用了FMC_NE1(FMC_CS)引腳作為片選信號,大家使用的
FSMC框圖剖析
如下圖所示,GT7000核心板上,FMC協議需要ARM與FPGA之間有這麼多IO相連,具體引腳的作用如下:
(1)FMC_CS(片選信號):低電平片選信號奏效,高電平失能(默認狀態為高:失能);
(2) FMC_NADV(地址有效信號):上升沿鎖存地址的低位(FSMC複用地址模式時有用,獨立地址模式時不用);
(3) FMC_RD(讀信號):讀數據信號,低電平高效,上升沿鎖存數據,高電平失能(默認狀態為高:失能);
(4) FMC_WR(寫信號):寫數據信號,低電平有效,上升沿鎖存數據,高電平失能(默認狀態為高:失能);
(5) FMC_AB[23:16]:地址總線;
(6) FMC_DB[31:0]:數據總線。
FMC複用地址模式,相較於獨立地址模式,物理上只添加了一根NADV(有時也叫NL)信號線。以NADV信號作為標誌,當NADV信號低電平時,數據總線上傳輸的是地址數據,由於bank1的尋址空間有限,當利用32bit數據位寬時,地址空間為0~2^24-1,也就是説最大佔用24根數據線傳輸地址數據;當NADV信號高電平時,數據總線上傳輸的是正常數據信息。
在複用地址模式下,地址數據在ARM端要左移2位才能被正常解析。(在STM32使用32位數據位寬時,訪問地址必須先左移2位.,才能正確輸出地址信號)詳見STM32參考手冊22.6.1章節。
FMC讀寫FPGA的時序
FMC模式A的寫時序如下。
ARM芯片中自帶FMC控制器外設,本次將通過FMC總線的複用地址模式,實現STM32與FPGA之間的通信,FPGA內部建立RAM塊,FPGA橋接STM32和RAM塊,本實驗利用FMC總線從ARM向FPGA的RAM塊中寫入內容(信息為0到2047),然後讀取RAM出來的數據並進行驗證。
STM32CubeMX生成工程
大家參考前面章節STM32H743-結合CubeMX新建HAL庫MDK工程,打開CubeMX軟件,重複步驟不再展示,我們來看配置FMC部分如下圖所示:
實驗步驟
1、依據前面相關章節所述,新建一個名為fmc_mul的工程。雙擊桌面Vivado 2020.2圖標打開Vivado開發環境,按如下操作步驟進行。
(1)起始頁——點擊Create Project;
(2)嚮導起始頁——點擊Next;
(3)Project Name界面——工程名fmc_mul,設置工程路徑,點擊Next;
(4)Project Type界面——選擇RTL Project,點擊Next;
(5)Default Part界面——Family選擇Artix-7,Speed grade選擇-2,GT7000 100T的核心板,Package選擇fgg484,在過濾後的結果中選擇目標器件為xc7a100tfgg484-2;GT7000 200T的核心板,Package選擇fbg484,在過濾後的結果中選擇目標器件為xc7a200tfbg484-2,點擊Next;
(6)New Project Summary界面——確認無誤後,點擊Finish做完。
建立好的工程如下圖所示。
2、新建工程設計文件。具體步驟如下。
(1)主窗口左側邊欄Project Manager下點擊Add Sources;
(2)Add Source彈窗選擇Add or create design sources,點擊Next;
(3)Add or Create Design Source彈窗點擊Create File;
(4)Create Source File彈窗,File name設置為fmc_ mul,其它默認,點擊OK;
(5)以相同方式添加fmc_ctrl.v和led_ctrl.v文件;
(6)Add or Create Design Source窗口點擊Finish;
(7)Define Module彈窗點擊OK,之後的彈窗點擊Yes,文檔新建完成。如下圖所示,Source窗口文件已經加入工程了。
3、添加並配置PLL IP核使其輸出100MHz時鐘。具體步驟如下。
(1)主窗口左側邊欄Project Manager下點擊IP Catalog;
(2)IP Catalog窗口搜索框內輸入CLOCK,點擊搜索;
(3)雙擊Clocking Wizard,彈出配置窗口;
(4)Clocking Options標籤頁下,Input Clock Information中clk_in1時鐘頻率修改為50;
(5)Output Clocks標籤頁下,Enable Optional Inputs/Outputs for MMCM/PLL中取消勾選reset和locked;
(6)其餘選項保持默認,點擊OK,Generate Output Products彈窗點擊Generate。
4、添加並配置RAM IP核。具體步驟如下。
(1)主窗口左側邊欄Project Manager下點擊IP Catalog;
(2)IP Catalog窗口搜索框內輸入block memory,點擊搜索;
(3)雙擊Clocking Wizard,彈出配置窗口;
(4)將IP核命名為my_ram;
(5)在Port A Options標籤頁中,設置數據位寬為32bit,設置讀寫深度為256,Operating Mode選擇No Change,取消勾選Primitives Output Register;
(6)其餘選項保持默認,點擊OK,在Generate Output Products彈窗點擊Generate。
5、接下來進行Verilog代碼的設計。
//--------------------wire---------------------------------//
wire rd = (fmc_csn | fmc_rdn);
wire wr = (fmc_csn | fmc_wrn);
//--------------------ab-----------------------------------//
reg [31:0]address;
always @ (posedge fmc_nadv or negedge rst_n)
begin
if(!rst_n)
begin
address <= 32'd0;
end
else
begin
address <= fmc_db;
end
end
//--------------------clk----------------------------------//
reg wr_clk1,wr_clk2,wr_clk3;
always @(posedge clk_100m or negedge rst_n)
begin
if(!rst_n)
begin
wr_clk1 <= 1'd1;
wr_clk2 <= 1'd1;
wr_clk3 <= 1'd1;
end
else
{wr_clk3,wr_clk2,wr_clk1} <= {wr_clk2,wr_clk1,wr}; //提取寫時鐘
end
wire clk = (!wr_clk3 | !rd);
//--------------------db_out-------------------------------//
wire [31:0]db_out;
assign fmc_db = !rd ? db_out : 32'hzzzzzzzz;
wire [31:0] db_in;
assign db_in = fmc_db;
//--------------------my_ram-------------------------------//
my_ram my_ram_inst(
.clka(clk),
.ena(1'd1),
.wea(!wr),
.addra(address),
.dina(db_in),
.douta(db_out)
);//例化ram模塊
5、將上面的設計內容進行分析和綜合直至沒有錯誤以及警告,給信號約束一下引腳,最終生成bit流檔案。
6、給板子接上下載器和電源,如下圖所示。
7、將生成的bit流檔案下載進板子。
實驗現象
(1)FPGA程序下載完成後,核心板上FPGA LED燈每隔0.5秒鐘亮一下,按住FPGA RST按鍵後復位,FPGA LED燈熄滅,鬆開後FPGA LED燈繼續閃爍;
(2)使用putty軟件打開串口,端口號在Windows設備管理器中查看,波特率設為115200,點擊“Open”打開putty串口終端。
(3)打開ARM工程,將ARM工程編譯並下載進GT7000內。能夠看到putty串口終端中打印如下信息。綠色打印的數據為ARM生成並寫入FPGA後,又從FPGA內讀出來的信息,OK 説明內容無誤。
(4)也可以在FPGA工程中添加ILA,觀察讀寫時序。