SOPC開發流程之NIOS II 處理器運行 UC/OS II
這里以在芯航線FPGA學習套件的核心板上搭建 NIOS II 軟核並運行 UCOS II操作系統為例介紹SOPC的開發流程。
第一步:建立 Quartus II 工程
建立 Quartus II 工程時需要注意以下幾點
1、 器件選擇為 EP4CE10F17C8N;
2、 工程路徑中不得出現非法字符(空格和中文字符);
3、 開發工具選擇 Quartus II 11.0及以上,這里我選擇的版本為 Quartus II 15.1。
4、 由於我們最終的軟件工程也是建立在 Quartus II 工程目錄下的,而軟件工程有一個最讓人崩潰的地方就是,軟件工程在建立時,很多包含文件是以據對路徑存在的,如果你更改了工程路徑,那么當你再次編譯工程時,就會報錯。所以這里我在建立工程時,直接在 E 盤根目錄下建立了一個 mysystem 的文件夾,並將工程建立在此文件夾中。這樣可以避免路徑太深,以后切換電腦時,只需要將工程直接拷貝到新的電腦的 E 盤下即可。只要 QII 軟件安裝位置相同,再次編譯軟件工程就不會報錯。
第二步:打開 Qsys 工具
在 Quartus II 軟件中,依次點擊 tools/Qsys,以打開 Qsys 工具。
第三步:在 Qsys 系統中添加 NIOS II 處理器
在左側的 IP Catalog 的搜索框中,輸入 nios,在搜索結果中,選擇並添加 NIOS II(Classic) Processor 到右側的 System Contents 中來。添加時,選擇 NIOS II/f 型 CPU。添加完成后,在
System Contents 中修改其名字為 mycpu。
添加完成后,會報如下錯誤
這個是因為目前只添加了CPU,還沒有添加對應的存儲器,因此會報錯。這里不用理會,在后面的步驟中,只要按照操作來,這些錯誤最好都會消失的。后續操作中如果遇上其他錯誤也不要驚慌,最后只要系統搭建完成,錯誤都是會消失的。
第四步:在 Qsys 中添加 UCOS 系統所需定時器
在左側的 IP Catalog 的搜索框中,輸入 timer,在搜索結果中,選擇並添加 Interval timer 到右側的 System Contents 中來。添加時,將 timeout period 設定為 10ms。添加完成后,修改其名字為 ucosii_timer。
第五步:在 Qsys 中添加 SDRAM
在左側的 IP Catalog 的搜索框中,輸入 sdram,在搜索結果中,選中並雙擊 SDRAM Control,在打開的參數配置選項卡中,按照如下圖所示的配置進行設置:
添加完成后,修改其名字為 sdram。
第六步:在 Qsys 系統中添加 JTAG_UART
在左側的 IP Catalog 的搜索框中,輸入 uart,在搜索結果中,選擇並添加 JTAG UART 到右側的 System Contents 中來。添加時,所有參數默認即可。添加完成后,修改其名字為 JTAG_ UART_0。
第七步:在 Qsys 系統中添加 sysid
在左側的 IP Catalog的搜索框中,輸入 sys,在搜索結果中,選擇並添加 System ID Peripheral 到右側的 System Contents 中來。添加時,設定 32bit system id 為自定義值,我這里設定為0x00000002。添加完成后,修改其名字為 sysid0。
第八步:連線和導出端口
自此,所有的外設添加就已經完成了,接下來,需要將每個模塊的端口連接到對應的總線上,這里不一一介紹,詳情請參看下圖:
其中,clk_100M 模塊的 clk_in 和 clk_reset,以及 sdram 模塊的 wire 需要 export。 將 ucosii_timer 和 jtag_uart_0 的 irq 連接到 mycpu 的 d_irq 上,在右側的 IRQ 一欄中, ucosii_timer 的中斷號設置為 0,jtag_uart_0 的中斷號設置為 1。 注意,在Quartus II13.0及以前的版本中,所有部件第二列name欄中並不會有d_irq或irq這樣一個信號,這個無需在意,只是沒顯示而已。只需要直接點擊右側的IRQ一欄中的空心圈並輸入序號即可完成中斷的分配,如下圖所示:
第九步:設定 sdram 基地址
在 Base 一欄中,將 sdram 模塊的起始地址設置為 0,然后點擊地址前面很小的那個鎖的符號,使其變為鎖定狀態。
第十步:自動分配所有模塊地址
在 Qsys 系統中,依次點擊菜單欄中的 sysytem/Assign Base Address,系統即可自動為我們分配各個模塊的基地址。由於 sdram 的基地址本身處於鎖定狀態,所以在此過程中,可能其他模塊的基地址會因為自動修改而發生變化,但是 sdram 的基地址將保持不變。
第十一步:設定 CPU 的復位向量地址和異常向量地址
雙擊 mycpu 模塊,在打開的參數設置中,將 Reset Vector 和 Exception Vector 都選擇為 sdram.s1。
以上,我們就完成了完整 Qsys 系統的搭建,接下來,我們就可以生成 Qsys 系統的 RTL 代碼了。
第十二步:保存設計
點擊 file/save,將我們的系統保存,我這里命名為“cpu”。
第十三步:生成 Qsys 系統的 HDL 代碼
在 Qsys 系統中,依次點擊 Generate/Generate HDL,在彈出的窗口中,點擊 Generate 來完成 HDL 代碼的生成。此過程根據電腦配置的不同,大約需要 3 到 5 分鍾。
第十四步:在 Quartus II 系統中添加並例化 QSYS 系統
在 Qsys 系統中,依次點擊 Generate/HDL Example,在打開的界面中,將 HDL Example 中的代碼選中並復制,如下圖中紅線圈起來的內容:
回到 Quartus II 工程中,新建一個 Verilog HDL 文件,將剛剛復制的內容粘貼進去,將文件保存,命名為 mysystem。
第十五步:添加鎖相環
在 Quartus II 軟件中,依次點擊 tools/IP Catalog,在右側彈出的窗口中,在搜索欄輸入 pll,然后雙擊打開搜索結果中的 Altera PLL,在打開的窗口中,選擇 Verilog 格式,並保存名為 sys_pll。然后點擊 OK。等待大於 10 秒鍾左右,會彈出 PLL 的配置窗口,在配置窗口中,按下圖所示的內容進行配置:
第十六步:添加 Qsys 系統到 Quartus II 工程中
第十四步中,只是完成了 Qsys 系統的例化,實際並沒有將 Qsys 系統添加到 Quartus II 工程中來。這里,我們雙擊 Quartus II 軟件中 Project Navigator 窗口中 Files 選項卡中的 Files
在彈出的窗口中,找到 E:\mysystem\cpu\synthesis 路徑下的 cpu.qip 文件,加入到工程中。
第十七步:完善 mysystem.v 模塊
將 mysystem.v 中的內容完善如下:
module mysystem( refclk, rst_n, sdram_addr, sdram_ba, sdram_cas_n, sdram_cke, sdram_cs_n, sdram_dq, sdram_dqm, sdram_ras_n, sdram_we_n, sdram_clk ); input refclk; input rst_n; output [12:0]sdram_addr; output [1:0]sdram_ba; output sdram_cas_n; output sdram_cke; output sdram_cs_n; inout [15:0]sdram_dq; output [1:0]sdram_dqm; output sdram_ras_n; output sdram_we_n; output sdram_clk; wire cpu_clk; wire sdram_clk; wire cpu_reset_n; wire pll_locked; assign cpu_reset_n = pll_locked; cpu u0 ( .clk_clk (cpu_clk), // clk.clk .reset_reset_n (cpu_reset_n), // reset.reset_n .sdram_addr (sdram_addr), // sdram.addr .sdram_ba (sdram_ba), // .ba .sdram_cas_n (sdram_cas_n), // .cas_n .sdram_cke (sdram_cke), // .cke .sdram_cs_n (sdram_cs_n), // .cs_n .sdram_dq (sdram_dq), // .dq .sdram_dqm (sdram_dqm), // .dqm .sdram_ras_n (sdram_ras_n), // .ras_n .sdram_we_n (sdram_we_n) // .we_n ; sys_pll_0002 sys_pll_inst ( .refclk (refclk), // refclk.clk .rst (~rst_n), // reset.reset .outclk_0 (cpu_clk), // outclk0.clk .outclk_1 (sdram_clk), // outclk1.clk .locked (pll_locked) // locked.export ); endmodule
第十八步:分析和綜合;
第十九步:分配引腳
引腳分配如下表所示:
第二十步:全編譯
此過程大約需要 6 到 10 分鍾左右;
第二十一步:配置固件到FPGA芯片中
將生成的 SOF 文件配置到芯航線開發板中。
第二十二步:打開 NIOS II EDS 軟件
在 Quartus II 軟件中,依次點擊 tools/NIOS II software Buil tools for Eclipse,在打開的
Workspace Launcher 中,設定 Workspace 為 E:\mysystem,然后點擊 OK。
第二十三步:建立 UC/OS II 模版工程
在打開的開發環境中,點擊 File/New/Nios II Application and BSP from Template。
在打開的窗口中,按下圖所示的內容進行選擇:
然后系統便能為我們自動生成完整的系統,生成后的界面如下所示:
第二十四步:編譯軟件工程
此時,我們按下鍵盤上的組合鍵“ctrl + B”,就能夠對軟件工程全編譯。
第二十五步:下載並運行
編譯完成后,點擊 Run/Run Configurations,在打開的窗口中,
雙擊 Nios II Hardware,在彈出的界面中,選擇 Project Name 為 myucosii(注:圖中我的工程名為 myucos,只是工程名字不同而已,無其他影響)。
選擇完成后,切換到 Target_Connection 選項卡中,如下圖:
若 1 處和 2 處無內容,則點擊 3 處的 Refresh Connections,直到 1 和 2 中出現我們的 Cable 和 Device 為止。選中 4 處的兩個選項。然后點擊 5 處的 apply,最后點擊 6 處的 Run,則系統將啟動軟件燒寫過程,並在燒寫完成后啟動 FPGA 中的 Nios II 處理器。
此時,我們在Eclipse 的 Nios II Console 窗口中便能看到 Nios II 處理器通過串口發送到 PC 上的內容,如下圖所示:
自此,整個在芯航線FPGA上搭建 NIOS II 處理器並運行 UC/OS-II 系統告一段落。
本文主要通過一個最簡單的例子介紹了常見的SOPC簡單開發流程,后續詳細的SOPC開發教程敬請關注小梅哥后續視頻教程。