3 系統軟件設計
本系統主要的開發調試工具有SOPC Builder、Quartus II和 NIOS II IDE。SOPC Builder是一個自動化的系統開發工具,它能夠極大地簡化高性能SOPC的設計工作;Quartus II是Altera公司推出的CPLD/FPGA開發工具,Quartus II提供了完全集成且與電路結構無關的開發包環境,具有數字邏輯設計的全部特性,主要用于system-on-a-programmable-chip (SOPC)的設計環境;NIOS II IDE是NIOS II系列嵌入式處理器的基本軟件開發工具。所有軟件開發任務都可以NIOS II IDE下完成,包括編輯、編譯和調試程序。
3.1.系統軟件配置
采用NIOS處理器開發設計與采用傳統的處理器開發設計不同,開發者必須先配置處理器結構、設置接口等內容。也就是說,開發者必須根據實際需求構建一個處理器,而傳統的處理器具有固定接口、片內RAM和外部設備。系統設計所需的具體軟件配置如下:
?。?)用SOPC Builder系統綜合軟件來進行NIOS軟核的軟件配置,包括NIOS CPU配置、片上ROM及RAM設置、FLASH設置、SDRAM設置、JTAG調試配置、加入定時器、加入外部RAM總線——Avalon三態總線橋、通訊接口、按鍵PIO與LED PIO設置、指定基地址和配置NIOS軟核,這樣整個NIOS軟核已經配置完畢,之后需要編譯,并生成圖形文件,成為Quartus II設計的一部分。
?。?)使用Quartos II軟件來選取具體的Altera可編程器件系列,并對SOPC Builder生成的HDL設計文件進行布局布線;再使用Quartos II軟件選取目標器件并對NIOS II系統上的各種I/O口分配管腳,另外還要根據要求進行硬件編譯選項或時序約束的設置。在編譯的過程中,Quartos II從HDL源文件綜合生成一個適合目標器件的網表。最后生成配置文件。
?。?)使用Quartos II編程器和Altera下載電纜,將配置文件下載到開發板上。當校驗完當前硬件設計后,再將新的配置文件下載到開發板上的非易失存儲器里。
3.2.嵌入式實時操作系統MicroC/OS-II的應用設計
目前比較流行的嵌入式操作系統主要有MicroC/OS-II , MicroCLinux,VxWorks等,考慮到系統資源以及NIOS II IDE 開發環境包含MicroC/OS-II實時操作系統,為設計者提供快速地搭建基于NIOS II處理器的MicroC/OS-II應用程序的能力,, 故本系統的操作系統選用MicroC/OS-II 。MicroC/OS-II 是一種可固化、可剪裁、占先式的多任務實時操作系統內核。它為每個任務分配單獨的堆棧, 提供多種系統服務可進行中斷管理。
創建一個基于NIOS II處理器的MicroC/OS-II軟件過程包含以下步驟:創建一個新的NIOS II IDE工程;設定MicroC/OS-II軟件工程庫;建立并運行NIOS II 下的MicroC/OS-II軟件工程。
一、 創建一個新的NIOS II IDE工程
創建一個新的NIOS II IDE工程的方法比較簡單,基本上按照向導就能完成,要注意的是在 Project Template(工程模板)選擇中, 要選擇 the MicroC/OS-II Tutorial,在New System Library Dialog Box 頁面中的Select Type of system library欄中要選擇MicroC/OS-II。
二、設定MicroC/OS-II的步驟
?。?). 在NIOS II IDE的C/C++ Projects視圖中,右鍵在系統庫上單擊std_system_lib。
?。?). 在彈出的菜單中選擇Properties打開Properties對話框。
?。?). 單擊System Library顯示system library選項。
?。?).單擊在RTOS 下面的RTOS Options。彈出MicroC/OS-II RTOS Options對話框。
?。?).單擊“+”在在左邊的面板中,展開MicroC/OS-II目錄。MicroC/OS-II是高度映射可設定的。你選定的對話框中的選項被保存在os_cfg.h文件中。選定的MicroC/OS-II選項被包含在二進制中。通過單擊MicroC/OS-II下每一個選項檢查你所能選擇的選項。
?。?).選擇默認設置單擊OK。你將返回系統庫選項對話框,然后單擊OK完成設置。
三、建立并運行NIOS II 下的MicroC/OS-II軟件工程
在這一部分,在嵌入式系統中設計并運行一個MicroC/OS-II程序,通過在嵌入式操作系統MicroC/OS-II下編寫2個互相調用任務來測試本系統的運行情況。
1.打開ucosii_tutorial.c
2.頭文件加入如下代碼
#include “system.h”
#include “altera_avalon_pio_regs.h”
#include “alt_types.h”
3.加入相關定義
#define TASK_STK_SIZE 1024
#define TaskStart_ID 0
#define Task1_ID 1
#define Task2_ID 2
#define TaskStart_Prio 1
#define Task1_Prio 4
#define Task2_Prio 3
OS_STK TaskStk[N_TASKS][TASK_STK_SIZE];
OS_EVENT *AckMbox;
OS_EVENT *TxMbox
4.在初始化函數 initCreateTasks函數中加入如下代碼
OSTaskCreateExt(TaskStart, 0, &TaskStk[0][TASK_STK_SIZE-1], TaskStart_Prio, TaskStart_ID, &TaskStk[0][0], TASK_STK_SIZE, 0, OS_TASK_OPT_STK_CHK );
OSTaskCreateExt(Task1, 0, &TaskStk[1][TASK_STK_SIZE-1], Task1_Prio, Task1_ID, &TaskStk[2][0], TASK_STK_SIZE, 0, OS_TASK_OPT_STK_CHK );
OSTaskCreateExt(Task2, 0, &TaskStk[2][TASK_STK_SIZE-1], Task2_Prio, Task2_ID, &TaskStk[3][0], TASK_STK_SIZE, 0, OS_TASK_OPT_STK_CHK );
5.增加執行2任務互相調用的代碼
void Task1(void * pParam)
{ //往接收消息隊列發送A
char txmsg;
INT8U err;
txmsg = ‘A’;
while(1)
{
OS_ENTER_CRITICAL();
printf( “Hello from task1\n” );
OS_EXIT_CRITICAL();
OSMboxPost(TxMbox, &txmsg);
OSMboxPend(AckMbox, 0, &err);
OSTimeDly(2);
}
}
void Task2(void * pParam)
{
char *rxmsg;
INT8U err;
while(1)
{
rxmsg = OSMboxPend(TxMbox, 0, &err);
OS_ENTER_CRITICAL();
printf( “Hello from task2\n” );
OS_EXIT_CRITICAL();
OSTimeDly(2);
OSMboxPost(AckMbox, (void*)1);
}
}
6、 選擇Run As 》 NIOS II Hardware (Run menu中)創建程序,下載它到試驗板中并運行。下載完成后,當執行這兩個任務時,任務一返回:“Hello from task1”;而任務二返回:“Hello from task2”,兩個任務之間互相調用。
得到測試結果如圖2:
圖2 MicroC/OS系統測試結果
從測試結果中可以看出,任務一和任務二被反復的調用,這與預期中執行的結果相同,說明系統能夠在FPGA中穩定運行。
四、結束語
本文介紹的基于FPGA的嵌入式系統設計達到了預期效果, CPU 本身是以軟核的方式實現, 其功能可根據需要進行定制, 非常靈活。嵌入式MicroC/OS-II 操作系統的32 位嵌入式微處理器進行核心控制,利用它強大的運算處理能力,不僅減少了系統所用的器件數量和系統的尺寸,更提高了系統的可靠性和靈活性。該設計為嵌入式系統設計提供了一條新思路,體現了FPGA的靈活性、高集成性等特性,大大降低了成本,縮短了開發時間。
評論
查看更多