手把手教你蜂鳥e203移植(以Nexys4DDR為例)

敲好聽的名字捏發表於2023-03-09

準備工作:(網盤連結:)
1.蜂鳥e203的RTL原始碼;
2.一段分頻程式碼;
3.頂層設計檔案(system.v)
4.開發板檔案;
5.Nexys4DDR電路圖;
6.Nexys4DDR管腳約束模板;
7.Nexys4DDR官方文件。

1.

在Vivado中建立工程,命名隨意,路徑隨意;

手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
2.

這裡可以選擇是否新增原始檔等,我們先不新增;

手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
3.選擇我們目標要移植到的板子

這裡我們選擇的是Nexys4DDR,若Vivado庫中沒有此板載檔案,可以新增對應板載檔案到Vivado\2018.2\data\boards\board_files目錄下,這裡我們給出了Nexys4DDR的開發板檔案;

手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
  等待建立中~
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
4.新增原始檔:

建立工程完成後,單擊"+",新增原始檔,這裡我們選擇新增的是資料夾e203(路徑為e203_hbirdv2/rtl/e203),Finish完成新增,那兩個勾建議可以勾選,會將新增的原始檔複製到我們的工程目錄下,防止對原始檔案造成改動;

手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
5.新增標頭檔案:

同上操作,找到對應想要移植板子的system.v檔案(路徑為e203_hbirdv2-master\fpga\mcu200t\system.v),這裡選擇的是MCU;

手把手教你蜂鳥e203移植(以Nexys4DDR為例)
6.設定標頭檔案:

新增完成後,右鍵點選system.v將其設定為標頭檔案;

手把手教你蜂鳥e203移植(以Nexys4DDR為例)
7.呼叫IP核:

這時,我們會觀察到有兩個檔案有問題,這是由於e203中呼叫了相應的IP核,我們也要在工程中對應新增;

手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
8.新增reset_sys:

在IP目錄中找到對應IP核Processor System Reset,雙擊將名字改為system.v中的對應名字reset_sys。注意!這裡一定要保持名稱一致!後修改其復位的優先順序為最高,即可完成IP核的呼叫;

手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
9.新增clk:

在IP目錄中找到對應IP核Clocking Wizard,同上操作,將名改為mmcm,修改生成時脈頻率為16M,改變復位方式為低電平復位,即可完成IP核的呼叫;同時應注意這裡IP核呼叫的例化名稱應與system.v中保持一致。

手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
10.新增分頻時鐘模組:

新增原始檔程式碼,若無可以在資料中找到對應的,呼叫該模組生成CLK32768KHZ的時鐘

手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
11.修改頂層定義檔案:

右鍵單擊e203_defines.v,將其設為global define,並在其檔案頭新增語句:`define FPGA_SOURCE。完成後檢視Elaborated Design,若此時報錯無法開啟e203_defines.v檔案,可以在SourceFileProperties中將其對應檔案型別改為Verilog Header

手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
12.完成管腳約束:

這裡提供資料有Nexys4DDR的電路原理圖及其約束檔案模板,可據此對時鐘管腳,SPI引腳,PMU引腳等必要的引腳進行一定約束來簡單驗證我們能否移植成功。對於管腳約束的完成,我們可以劃分成兩個模組:xdc約束檔案的編寫system.v頂層檔案的對應修改

手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
  • xdc約束檔案的修改: 主要模組包括:時鐘生成及引腳繫結、電源PMU、SPI、JTAG除錯,也就是說只要保證了這四個基本模組的引腳約束,就能夠實現最基礎核心的移植,後續外設的新增可以再自行修改,這裡給出約束程式碼示例如下:
# Clock signal
set_property -dict {PACKAGE_PIN E3 IOSTANDARD LVCMOS33} [get_ports CLK100MHZ]
# set_property -dict { PACKAGE_PIN F15    IOSTANDARD LVCMOS33 } [get_ports { CLK32768KHZ }];
create_clock -period 10.000 -name sys_clk_pin -waveform {0.000 5.000} -add [get_ports CLK100MHZ]
# set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets dut_io_pads_jtag_TCK_i_ival]
# set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets IOBUF_jtag_TCK/O]

# Reset
set_property -dict {PACKAGE_PIN C12 IOSTANDARD LVCMOS33} [get_ports fpga_rst]
set_property -dict {PACKAGE_PIN M18 IOSTANDARD LVCMOS33} [get_ports mcu_rst]

# QSPI interface
set_property -dict {PACKAGE_PIN K17 IOSTANDARD LVCMOS33} [get_ports {qspi0_dq[0]}]
set_property -dict {PACKAGE_PIN K18 IOSTANDARD LVCMOS33} [get_ports {qspi0_dq[1]}]
set_property -dict {PACKAGE_PIN L14 IOSTANDARD LVCMOS33} [get_ports {qspi0_dq[2]}]
set_property -dict {PACKAGE_PIN M14 IOSTANDARD LVCMOS33} [get_ports {qspi0_dq[3]}]
set_property -dict {PACKAGE_PIN L13 IOSTANDARD LVCMOS33} [get_ports qspi0_cs]

# JTAG connection
# set_property -dict { PACKAGE_PIN E13   IOSTANDARD LVCMOS33 } [get_ports { mcu_TDO }];
# set_property -dict { PACKAGE_PIN E10   IOSTANDARD LVCMOS33 } [get_ports { mcu_TCK }];
# set_property -dict { PACKAGE_PIN E11   IOSTANDARD LVCMOS33 } [get_ports { mcu_TDI }];
# set_property -dict { PACKAGE_PIN E12   IOSTANDARD LVCMOS33 } [get_ports { mcu_TMS }];

# pmu_wakeup
set_property -dict {PACKAGE_PIN H17 IOSTANDARD LVCMOS33} [get_ports pmu_paden]
set_property -dict {PACKAGE_PIN K15 IOSTANDARD LVCMOS33} [get_ports pmu_padrst]
set_property -dict {PACKAGE_PIN N17 IOSTANDARD LVCMOS33} [get_ports mcu_wakeup]

set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
set_property BITSTREAM.CONFIG.SPI_FALL_EDGE YES [current_design]
  • system.v中對應檔案的修改:頂層模組中程式碼功能劃分十分規整,對於不需要的模組如GPIO等直接註釋掉即可。

  • 如恰好我們移植的是同一塊板子,那麼恭喜你,我已經在資料包裡準備好了兩份檔案,直接匯入工程即可?

13.綜合並生成位元流檔案:

點選implementation 進行工程的綜合,這個時間會比較漫長,可以先去吃個晚飯?!

手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
  綜合完成後點選**Generate Bitstream**生成位元流檔案,這步是將我們的工程檔案生成二進位制位元流檔案,以便後續燒入板子。
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
14.連線開發板:

將開發板與PC正確連線並供電,在Vivado中開啟HardwareManager,使用Auto Connect自動連線板子,如此步報錯,或一直無法連線成功,可能是由於電腦未安裝相關驅動造成,可以在 \Xilinx\Vivado\2018.3\data\xicom\cable_drivers\nt64 目錄下找到install_diligent.exe雙擊安裝,如果此時還不能自動連線,就下載一個驅動精靈什麼的讓他解決一下吧~(雖然那個軟體看起來很“金山毒霸”\doge)

手把手教你蜂鳥e203移植(以Nexys4DDR為例)
  連線成功後的結果如下圖所示。
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
15.生成MCS檔案:

單擊Vivado上方工具欄的Tools->Generate Memory Configuration Files,彈出的視窗如下所示,進行如圖所示的配置,即可在當前工程目錄下生成MCS檔案。

手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
16.匯入flash裝置:

在左側功能欄最末尾找到Add Configuration Memory Device,填出的視窗如圖所示,進行如圖所示的配置,即可匯入相應的開發板flash。

手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
17.燒入開發板:

完成裝置選擇後,將會自動彈出一個詢問你是否現在就要Program的一個視窗,選擇是,則來到以下介面,新增入我們前面生成的MCS檔案即可,等待---,即完成了我們的核心固化過程。

手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)
手把手教你蜂鳥e203移植(以Nexys4DDR為例)

寫在最後的話
花了很多精力才完成了整個的移植,在網上也找了很多教程,或是因為版本不一致,或是一些細緻之處沒有說明,踩了很多坑,走了很多彎路。寫這篇教程時,已經是我第五次嘗試移植了,可能還存在不夠細緻之處,或者上下文邏輯不連貫之處,如有問題指出,歡迎大家留言,我每天都會看的!!大家一起進步!!

相關文章