Abstract
使用Altera所提供的ip時,如UART、DMA...等,只要在SOPC Builder加進要用的ip,Nios II的C語言include正確的header file後,就可以正常使用,為什麼自己寫的ip,還必須將HAL的*.c複製到project的目錄下才能編譯呢?Introduction使用環境:Quartus II 8.1 + Nios II EDS 8.1 + DE2-70 (Cyclone II EP2C70F896C6N)
在DE2-70 CD的DE2_70_NIOS_HOST_MOUSE_VGA範例中,其實如SEG7.c與VGA.c都是友晶科技自己寫的ip:TERASIC_SEG7與TERASIC_Binary_VGA_Controller的HAL,在Nios II編譯時,還必須將HAL複製到project下,Nios II EDS的gcc才能編譯,雖然也沒什麼不妥,但總是麻煩,為什麼自己寫的ip不能如Altera提供的ip一樣,只要SOPC Builder加入後就可使用呢?
一切的原因,在於SOPC Builder在Quartus II 7.0之後的做了重大的改變:SOPC Builder不再為HAL做打包的動作!!我不清楚為什麼Altera要將這個功能拿掉,大體上來說,SOPC Builder是越改越好用,Avalon Bus也越改越強,但在HAL的支援上,卻不如Quartus II 6.1好用。不過還是得面對現實,從Quartus II 7.0到目前的Quartus II 8.1,SOPC Builder都不在支援HAL的打包,所以這個動作必須手動自己做,才能讓Nios II自動抓到HAL,而不用在手動複製*.c到project目錄下。
一個典型的ip,目錄結構入下圖所示,事實上,在C:\altera\81\ip\altera\sopc_builder_ip\目錄下,放的就是Altera所提供的ip,可以拿來研究Altera是怎麼寫HAL。
外層的inc,放的是俗稱的register map,是由macro所構成。
HAL的inc,放是HAL的header files,而src則放HAL的source code。至於要不要寫register map呢?Altera是建議你要寫,不過若你偷懶的話,可以不寫register map,只提供HAL即可,這樣Nios II一樣可以使用你寫的ip。
SolutionStep 1:在HAL\src下加入component.mk
component.mk在Quartus II 6.1時,SOPC Builder會幫我們將HAL打包成component.mk,現在只好自己手動建立。
完整程式碼下載此範例是以友晶科技DE2-70 CD所提供的TERASIC_SEG7 ip為基礎加以修改,配合本文的component.mk的技巧。
Conclusion
雖然只是一個小小的技巧,不過在友晶科技的範例與很多書上都沒提到,甚至在Altera的手冊也沒看過,或許因為這本來是SOPC Builder該做的,但無奈現在SOPC Builder將此功能拿掉,我們只好自己手動完成。