【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing @163.com】
? ? ? ? 學編程的時候,大家一般都比較重視第一個項目的創建和執行。第一個fpga程序一般是led閃爍,第一個c程序一般就是hello world程序。今天就介紹下,zynq下面的hello world應該怎么編寫。和其他soc程序不一樣,zynq編寫c代碼之前,需要先創建一個block design,這就是最大的不同。整個流程稍微多了一點,不過熟能生巧就好。
1、創建zynq工程
? ? ? ? 第一步還是創建zynq工程。這一步和之前fpga沒有什么區別,唯一需要注意的地方就是對zynq芯片的選擇。我們習慣于直接用020clg400-1搜索,搜到的最后一個結果就是我們需要的芯片。
2、創建block design,添加cpu
? ? ? ? fpga開發是添加verilog代碼和約束文件。而zynq的軟件,則是需要先添加block design,這是一個頂層設計的框架,這個框架里面有cpu、有總線、有復位,還有可能有各種各樣的外設。當然目前為止,作為入門,我們一開始不弄那么復雜。添加block design之后,直接添加cpu即可。
3、去除不必要的ps連接線
? ? ? ? 因為沒有ps之外的其他外設,所以可以去除下面三部分內容,
? ? ? ? 1)FCLK_RESET0_N;
? ? ? ? 2)M_AXI_GP0 interface;
? ? ? ? 3)FCLK_CLK0。
? ? ? ? 去除之后,就是這樣的形式,即只有ddr和54個fixed io,這些接口是不需要添加端口約束的。
4、添加打印串口,配置ddr參數
? ? ? ? 既然是hello world程序,那么串口肯定是少不了的。這里我們選擇了uart0串口,作為輸出的接口。但是uart0本身可以放在很多其它的位置,所以我們首先需要通過電路圖,來確認最終的位置。
????????這里,我們把uart0放在了pin14、15引腳上面,即MIO14、MIO15。
? ? ? ? 除了uart之外,ddr也是少不了的。因此哪怕用zynq做純mcu開發,ddr也是很大的優勢。一般來說,這里配置的是ddr3控制器。通常只要選擇好ddr芯片型號即可,最多設置一下數據位。我們這里選用的是最后一個選項,即MT41J256M16 RE-125,數據寬度是16。大家可以根據自己的開發板,靈活做出選擇。
5、保存block design,開始生成文件
? ? ? ? block design保存好之后,最好利用validate 按鈕確認下、保存下。接下來生成的文件有兩個,一個是右擊,選擇“Generate Output Products”生成文件。結束之后,繼續右擊,選擇“Create HDL Wrapper”生成文件。兩個都ok之后,代表block designer就創建結束了。
6、導出硬件環境,打開sdk軟件
? ? ? ? 這里導出硬件環境比較簡單,直接單擊“File”-》“Export”-》"Export Hardware"即可,不用包含bitstream文件,因為沒涉及到pl開發。完畢之后,繼續單擊“File”-》“Launch SDK”,即可打開sdk軟件。
7、創建hello world軟件
? ? ? ? 打開sdk之后,一般已經有一個design_1_wrapper_hw_platform_0工程了。我們只需要繼續創建hello world工程即可。創建的過程中,系統會幫我們自動匹配一個bsp工程。而且工程創建以后,sdk會自動編譯好,幫助生成elf文件。如果我們需要用jtag運行程序,只需要單擊這個elf,右擊選擇“”Run as”-》“Launch on hardware(System Debug)”即可,這樣程序就可以跑起來,用mobaxterm看到串口打印了。
? ? ? ? 當然在此之前,需要連接好兩根type c線,一根是jtag,一根是usb轉串口。
8、可能會出現的問題
? ? ? ? 假設ddr沒有初始化好的話,可能會出現write memory 0x100000 error這樣的錯誤。出現錯誤之后,有兩種解決辦法,一種是繼續去尋找ddr配置失敗的原因。還有一種就是修改link file,刪掉原來的ps7_ddr_0,把現在的ps7_ram_1修改成ps7_ddr_0,這樣程序也是可以跑起來的。
? ? ? ? 大家不知道的是,zynq內部也有一段ram空間,同樣可以跑代碼、執行程序,不一定非得運行在ddr上面。改了之后,不需要初始化ddr,重新run一下jtag,自然就可以跑起來了。
9、jtag做了哪些工作
? ? ? ? 我們發現程序啟動的時候,本身是運行在ddr上面的,那么ddr是誰初始化的? 答案就是jtag。jtag不僅可以初始化ddr,還可以初始化其他外設,甚至可以幫助debug程序。但是如果程序需要發布給客戶的話,就不能依賴jtag了,這個時候就需要準備fsbl程序了。當然,這就是后面的話題了。