作者lihgong (人生,是一句引用句)
看板Electronics
標題[心得] NIOS II 心得 -- 簡單使用心得
時間Sat Aug 11 20:54:31 2007
先謝謝在我上一篇文章給意見的板友 :)
----
我先把 NIOS 的地位簡單的說一下, 如下圖
NIOS ---- Avalon BUS ----+--- HW Accelerator1
|
+--- HW Accelerator2
|
+--- other peripherals
以通訊系統而言, 假設前端的 ADC 跑 10Mhz
PHY (實體層) 信號處理用 CPU 去算, 大概來不及算, 一般會用 HW 直接做
MAC 需要的彈性大, 適合跑 SW 而不用 HW 直接合成
HW 的部分, 就是上圖的 Accelerator (加速器)
輸出再透過 NIOS 做進一步的處理
所以在系統裡放一顆 NIOS, 等於同時有 HW 和 SW 可用, 用適當的設備做適當的事
一般的產品也是用
ARM + HW-Accelerators 或
MIPS + HW-Accelerators 這類架構
----
不過話說回來... 把 NIOS 單獨當作一顆 MCU 來玩, 還真的不錯玩 ^^"
我手邊的板子是 Altera 出的 NIOS 實驗板
上面的 FPGA 是 Stratix EP1S40
玩了幾個禮拜, 我把我的所見所聞跟大家分享
----
0. Document
先抓開發板的文件, 看手邊是哪一張, 全部抓回去
http://www.altera.com/support/ip/processors/kits/ips-nios2-dev-kits.html
Altera 也提供了很豐富的文件, 有個包成 .zip 的, 直接抓回去
http://www.altera.com/literature/lit-nio2.jsp
這些文件真的寫得不錯
幾乎所有的問題都可以在文件上找到答案
----
1. Quartus II
NIOS 裝好以後, 我需要一個簡單的程式, 來讓我熟悉整個環境
我選的範例是下面的, 全功能的好像比較厲害
C:\altera\71\nios2eds\examples\verilog\niosII_stratix_1s40\full_featured
裡頭是一個 Quartus II 的 project, 一打開來會有個 readme.txt
他提到說, 這個 project 會展示所有炫麗的功能
建議把這個檔案讀一讀, 然後把 SOPC Builder 打開來看看
看不懂沒關係, 反正以後會常常打開
這個 project 可以編譯, 編譯出來的檔案叫 NiosII_stratix_1s40_full_featured.sof
編譯有點久, 不過是該跑一次流程看一看...
這個檔案請 download 到 FPGA 上
----
2. NIOS II IDE (Hello World)
就像寫第一個 C 程式一樣, 從 Hello World 出發總是好事
NIOS II 提供寫好的 Hello World 範例
想辦法建立這個 project 並且執行吧
畫面的左手邊, 應該會有兩個 project:
hello_world_0
hello_world_0_syslib
hello_world_0_syslib 底下的
Debug/ system_description
Device Drivers [NIOS II]
Device Drivers [Sopc Builder]
這三個以後會常常打交道, 看看底層的 library 是怎麼寫的
在 Hello World 的程式裡, 有個 #include "system.h"
請到 hello_world_0_syslib 裡面找這個檔案, 看看寫些什麼
----
3. GPIO -- LED
玩 MCU 一定會跟周邊打交道, 我最喜歡 GPIO + LED, 因為最簡單
剛好 NIOS 也附送了一份 LED 的範例程式, 把他跑起來玩看看吧
LED 程式的說明我覺得不錯, 裡面描述 NIOS 的開機流程, 下面是我的 note
首先開機會先執行
<NiosII-Kit-Install-Dir>/components/altera_nios2/HAL/src/crt0.S
裡面有一行...
call alt_main
所以 alt_main() 是一個很重要的程式 at
syslib/ Device Driver [Nios II]/ altera_hal/ HAL/ src/ alt_main.c
alt_irq_init (ALT_IRQ_BASE); // initialize interrupt
ALT_OS_INIT(); // initialize OS
alt_sys_init(); // initialize system
_do_ctors (); // C++ constructors
main (alt_argc, alt_argv, alt_envp); // 呼叫 main()
值得注意的是 alt_sys_init() at
syslib/ Debug/ system_description/ alt_sys_init.c
看一下裡面寫什麼, 以後玩到對應的 device 也看一下
總結一下, 開機流程是 crt0.S -> alt_main() -> alt_sys_init() -> main()
----
4. GPIO -- LED (CONT)
前面的範例裡, 有示範怎麼控制 LED, 不過那樣實在有點不夠
正確的態度應該是 LED 控制和 NIOS 之間的關連摸清楚...
1. 把前面抓的文件打開, 在 Schematic 裡找出 LED 連到 FPGA 哪根腳
在該電路下, FPGA 輸出 H/L, LED 分別是亮暗?
2. 打開 Quartus II, 看一下 pin-assignment, 裡面有沒有這根腳 ?
Quartus II 是怎麼命名這根腳的 ?
3. 打開 SOPC Builder, 找到 LED_PIO, 原來 LED 控制模組是用 PIO 來實作
在 LED_PIO 上點兩下, 閱讀 data sheet
4. 上述的 Data sheet 從下面這份文件裡出來的...
Quartus II V7.1 Handbook, Volumn 5: Embedded Peripheral
在前面抓的文件裡也有, 裡面的內容相當多, 原來 NIOS 有很多周邊可以玩
5. 另外還有一份文件也很有用, 也是下載回來的
NIOS II Software Developer's Handbook
有個東西叫 HAL, 這東西值得閱讀他的 source 看裡面在做什麼
6. 在 system.h 裡, 找到 LED 相關的設定
7. 閱讀下面程式碼
syslib/ Device Driver [Sopc Builder]/ altera_avalon_pio/
inc/ altera_avalon_pio_regs.h
syslib/ Device Driver [Nios II]/ altera_nios2/ HAL/ inc/ io.h
第一個檔案可以熟悉 Altera 控制 register 的 style
把他對著 data sheet一起看, 看看在做什麼
第二個檔案有底層的 IO 控制函數, 把 IORD 和 IOWR 看一看
8. 上面是所有和 LED 控制相關的東西
分析一下範例程式的code, 到底執行時做了哪些事
----
5. Other Peripherals
下面是一些我玩過的周邊(按順序), 我習慣挑簡單的周邊玩起
如果有板友也正在玩, 下面這份清單也許可以幫得上忙
SystemID Core
JTAG_UART
UART
BUTTON (IRQ Architecture -> Button PIO)
LCD-display
Timer (sys_clk_timer, 底層的 API 怎麼寫徹底追蹤)
DMA
----
TODO.
想試試看 uC/OS-II 這樣的 OS
看看在 embedded system 跑 OS 是怎麼回事
有沒有板友知道什麼資料, 適合初學者看的
麻煩介紹一下, 謝謝 :)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.236.184
推 MasterChang:推...寫這種文章最麻煩了... 08/11 21:33
推 luckyBF:我也推這篇~我最近在弄~麻煩死了orz 08/11 21:54