喜大普奔,公司要評估用SOC做產品,我就自然而然的被安排了學習和評估的工作,於是,每天的工作就是開始研究soc了。其實,只要能靜下心來學習,一切都還是能夠弄出來的。
以前像個無頭蒼蠅一樣到處亂撞,搞了兩三個月沒把fpga和arm給聯通起來,盡然只是因為教程用的Quartus II13.1軟件和我自己電腦上裝的Quartus II14.1軟件在生成dts時調用的一個文件不一樣導致的。當然,這個只是外在原因,真正內在的原因還是因為內在對linux的恐懼,因為是零linux基礎,所以全部linux下命令都是第一次接觸,於是各種錯誤各種不通,最后就放棄了。但是,心里總是不願就這么放棄了,總想學會這門新技術。於是前兩天又花錢買了周立功的ARM9開發板,然后跟着他提供的教程慢慢學習。終於是能夠簡單的進行一些linux下的命令操作了,昨天再次上手DE1—SOC,終於成功的生成了preloader和DTS,並通過HPS控制了FPGA端的LED。
相信很多參加此次活動或者自學SOC的筒子也都有過我以上這段經歷,這里,我願意把我遇到的問題和解決方法提出來,希望那些還卡在這些問題的地方的筒子能夠快速走出困境。
我此次學習是跟着友晶提供的培訓教材一步一步來進行的,該培訓教材中,使用的是Quartus II13.1的軟件,而我在使用的時候,直接安裝的Quartus II 14.1。而也正是這樣一個選擇,讓我被坑了好幾天,最終放棄沉寂了好久,直到昨天,在網友"微末凡塵"的指導下,才執行成功。
首先,在教材的第49頁,在hps clock選項卡上,需要進行一下更改,具體我也是看了駿龍科技的一篇文章《在SoCEDS環境下編譯和更新preloader和uboot程序的方法》才知道的,原文如下:
相對於13.0主要變化是有了HPS Clocks窗口分為了Input Clocks 和Output Clocks!對比如下圖:
Quartus 13.0 HPS Clocks窗口
Quartus 14.0 HPS Clocks窗口
14.0軟件中Cyclone V 器件MPU 默認時鍾為925Mhz,而13.1版為800M。這里編譯不改變MPU的Clock,所以去掉use default MPU clock frequency選項!不用改其他的選項,Clock即為800MHz。重新generate 關閉就好了。使用Quarut編譯編譯完成后會有hps_isw_handoff中的文件會更新,這些文件時連接HPS硬件配置與preloaderr軟 件接口文件。
這里文中說的14.0,但是14.0和14.1在這一點上沒有區別,因此,直接按照文中的內容操作即可。
第53頁最后一行,說要求將pio_0重命名為led_pio,這里一定要注意並保持一致,否則生成dts時會報錯。同理,button_pio也是一樣,名字最好不要錯。個人感覺,初學,盡量不要標新立異,尤其是對環境不熟的,否則都不知道死在哪里。
第83頁最后一句話,我直接按照文檔中的命令內容敲進去,會報錯,提示我少了-hv參數,如下圖所示:
這里我也不懂是怎么回事,既然說少了個參數,就加個參數唄,於是我將命令內容改為:
mkpimage –hv 0 –o preloader_with_header.img u-boot-spl.bin
然后就能成功了。
第85頁,生成DTS的時候,這個地方是變化最大的一個地方,我就是因為這個地方,才被卡了很久。這頁的最后一段,說生成dts需要的四個文件為
-
soc_system.sopcinfo
-
hps_clock_info.xml
-
soc_system_board_info.xml
-
Makefile
那么,如果我們直接使用這三個文件,用原來的Makefile文件來生成dts和dtb,都會報錯,dts能夠生成,但是有錯誤,dtb直接無法生成。原因就在於,在Quartus II14.1的軟件中,第二個使用的不再是hps_clock_info.xml文件,而是hps_common_board_info.xml。這個文件我們可以在SOCEDS軟件安裝目錄下的examples\hardware\cv_soc_devkit_ghrd 文件夾下找到,我的電腦中的絕對位置為
D:\altera\14.1\embedded\examples\hardware\cv_soc_devkit_ghrd。
我們將其中的兩個xml文件hps_common_board_info.xml、soc_system_board_info.xml和一個Makefile復制出來,粘貼到我們自己的工程目錄下,並將原來的三個文件刪除即可。再次make dts,就能夠成功了,當然這個過程比較長,需要2到5分鍾。然后,待dts生成完成后,再次make dtb,就很快,也能成功了。
注意,如果按照第86頁最后一段來自己敲命令進行生成dts,則需要將命令中對應的
hps_clock_info.xml替換為hps_common_board_info.xml。為了簡便推薦大家直接使用"make dts"命令來操作。后面生成dtb的也是一樣,直接使用"make dtb"命令就行了,詳見教材88頁最后一段。
自此,后面的就沒有其他問題了,對着該教材一步一步的進行,最終都能運行出正確的結果。只是,在做de1_soc_sw_lab3中的實驗時,原本提供的main.c文件里面使用的fpga端的led的名字叫pio_led,而我們的Qsys系統中命名為led_pio,因此直接使用該c文件生成可執行文件時會報錯,需要將其中的第40行的"PIO_LED_BASE"改為"LED_PIO_BASE"。第59行的"PIO_LED_DATA_WIDTH"改為"LED_PIO_DATA_WIDTH"。然后就能生成成功了。
執行實驗3生成的可執行文件,能夠看到開發板上FPGA端的10個紅色LED燈流水60次,然后停止。
好了,就寫到這里,文字不夠詳細,若有疏漏或錯誤,歡迎各位指出。具體效果,就不上圖啦。