(原創) 如何讓Nios II自動抓到自己寫的IP的HAL? (SOC) (Nios II) (SOPC Builder) (DE2-70)
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。
Solution
Step 1:
在HAL\src下加入component.mk
component.mk在Quartus II 6.1時,SOPC Builder會幫我們將HAL打包成component.mk,現在只好自己手動建立。
C_LIB_SRCS += SEG7.c
ASM_LIB_SRCS +=
這僅僅是個文字檔而以,敘述HAL的*.c檔,若你有很多*.c檔,可以學UART的寫法。
C_LIB_SRCS += altera_avalon_uart_fd.c \
altera_avalon_uart_init.c \
altera_avalon_uart_ioctl.c \
altera_avalon_uart_read.c \
altera_avalon_uart_write.c
ASM_LIB_SRCS +=
INCLUDE_PATH +=
加了這個文件後,Nios II EDS在編譯時,就會將這個抓到這個*.c,再也不用再手動複製到project的目錄下了。
完整程式碼下載
此範例是以友晶科技DE2-70 CD所提供的TERASIC_SEG7 ip為基礎加以修改,配合本文的component.mk的技巧。
DE2_70_NIOS_10_seg7.16.7z
Conclusion
雖然只是一個小小的技巧,不過在友晶科技的範例與很多書上都沒提到,甚至在Altera的手冊也沒看過,或許因為這本來是SOPC Builder該做的,但無奈現在SOPC Builder將此功能拿掉,我們只好自己手動完成。