1 前言
近年來,隨著嵌入式核心芯片的飛速發(fā)展,改變了傳統(tǒng)嵌入式系統(tǒng)的設(shè)計(jì)方法,嵌入式系統(tǒng)逐漸由板級(jí)向芯片級(jí)過渡,即片上系統(tǒng)——SOC。片上系統(tǒng)是追求產(chǎn)品系統(tǒng)最大包容的集成器件,是當(dāng)前嵌入式應(yīng)用領(lǐng)域的技術(shù)熱點(diǎn)。SOC的出現(xiàn)使集成電路發(fā)展成為集成系統(tǒng),整個(gè)電子整機(jī)的功能可以集成到一塊芯片中,降低了設(shè)計(jì)成本,縮短了開發(fā)周期。因此,本文設(shè)計(jì)了一個(gè)基于FPGA的嵌入式系統(tǒng),既能滿足嵌入式系統(tǒng)教學(xué)實(shí)驗(yàn)的需要,同時(shí)也可作為嵌入式產(chǎn)品開發(fā)平臺(tái)。
2 系統(tǒng)硬件設(shè)計(jì)
本系統(tǒng)要實(shí)現(xiàn)的功能包括:可以運(yùn)行嵌入式操作系統(tǒng);支持NIOS II開發(fā);支持USB通訊;支持RS-232串口通訊;支持以太網(wǎng)通訊;支持JTAG接口在線調(diào)試與下載。
2.1 系統(tǒng)硬件框圖
針對(duì)所需的功能,設(shè)計(jì)出系統(tǒng)的相應(yīng)硬件平臺(tái),硬件平臺(tái)主要是由嵌入式處理器模塊、存儲(chǔ)器模塊、包括以太網(wǎng)接口、USB接口和電源等外部接口電路模塊組成。系統(tǒng)硬件結(jié)構(gòu)框圖如圖1 所示。
圖1 系統(tǒng)硬件結(jié)構(gòu)圖
2.2 嵌入式處理器模塊
嵌入式處理器是整個(gè)系統(tǒng)的控制管理中心,主要功能是實(shí)現(xiàn)整個(gè)系統(tǒng)的控制和任務(wù)調(diào)試管理。在本系統(tǒng)中嵌入式處理器采用ALTERA公司的Cyclone系列的EP1C12Q240C8芯片,其采用QFP封裝,擁有12060個(gè)邏輯單元(LE)、52個(gè)M4K 存儲(chǔ)塊、全部RAM位數(shù)為239616、兩個(gè)鎖相環(huán),以及249個(gè)可用的I/O腳, 其配置存儲(chǔ)器采用EPCS1,編譯后系統(tǒng)速度可以達(dá)到100MHz,支持ALTERA 公司的SOPC內(nèi)核NIOS II系統(tǒng)的開發(fā),NIOS II開發(fā)環(huán)境編譯后的可執(zhí)行文件可以通過JTAG接口下載到開發(fā)板上的FLASH中去,可以支持一些嵌入式操作系統(tǒng),比如MicroC/OS操作系統(tǒng)和mClinux操作系統(tǒng)。
2.3存儲(chǔ)器模塊
2.3.1 專用串行配置器件EPCS1接口電路
EPCS系列器件是Altera公司提供的一種基于FLASH存儲(chǔ)器的專用串行配置器件,其具有串行接口,接口只需要四個(gè)引腳,能夠存儲(chǔ)Stratix II 系列、Cyclone系列的FPGA的配置信息,并在系統(tǒng)上電或者需要重新配置FPGA時(shí),向FPGA發(fā)送配置信息。本系統(tǒng)用的串行配置器件EPCS1大小為1M字節(jié),反復(fù)擦寫次數(shù)可多達(dá)十萬,可以輕松實(shí)現(xiàn)掉電保護(hù)
2.3.2 Flash存儲(chǔ)器接口電路
Flash存儲(chǔ)器具有低功耗、大容量、擦寫速度快、可整片或分扇區(qū)在系統(tǒng)編程(燒寫)、擦除等特點(diǎn),因而在各種嵌入式系統(tǒng)中得到了廣泛的應(yīng)用。
系統(tǒng)中用了一片AMD29LV320D FLASH存儲(chǔ)器,其單片存儲(chǔ)容量為32M位(4M字節(jié)),工作電壓為2.7V~3.6V,16位數(shù)據(jù)寬度。AMD29LV320D僅需3V電壓即可完成在系統(tǒng)的編程與擦除操作,通過對(duì)其內(nèi)部的命令寄存器寫入標(biāo)準(zhǔn)的命令序列,可對(duì)Flash進(jìn)行編程(燒寫)、整片擦除、按扇區(qū)擦除以及其他操作。
Flash存儲(chǔ)器在系統(tǒng)中通常用于存放程序代碼,系統(tǒng)上電或復(fù)位后從此獲取指令并開始執(zhí)行,由于,在進(jìn)行系統(tǒng)整體設(shè)計(jì)時(shí),可以通過使用Quartus II對(duì)引腳進(jìn)行配置,所以對(duì)于AMD29LV320D FLASH的三個(gè)功能引腳nCE、nOE、nWE,可以各接一個(gè)EP1C12Q240C8的通用I/O腳即可。
2.3.3 SDRAM存儲(chǔ)器接口電路
與Flash存儲(chǔ)器相比較,SDRAM不具有掉電保持?jǐn)?shù)據(jù)的特性,但其存取速度大大高于Flash存儲(chǔ)器,且具有讀/寫的屬性,因此,SDRAM在系統(tǒng)中主要用作程序的運(yùn)行空間、數(shù)據(jù)及堆棧區(qū)。當(dāng)系統(tǒng)啟動(dòng)時(shí),CPU首先從復(fù)位地址0x0處讀取啟動(dòng)代碼,在完成系統(tǒng)的初始化后,程序代碼調(diào)入SDRAM中運(yùn)行,以提高系統(tǒng)的運(yùn)行速度。同時(shí),系統(tǒng)及用戶堆棧、運(yùn)行數(shù)據(jù)也都放在SDRAM中。
系統(tǒng)中用了一片HY57V641620 SDRAM存儲(chǔ)器,其存儲(chǔ)容量為4組x16位(8M字節(jié)),工作電壓為3. 3V,常見封裝為54腳TSOP,兼容LVTTL接口,支持自動(dòng)刷新(Auto-Refresh)和自刷新(Self-Refresh), 16位數(shù)據(jù)寬度。可滿足運(yùn)行MicroC/OS操作系統(tǒng)、或者mClinux操作系統(tǒng)及各種相對(duì)較復(fù)雜的算法的運(yùn)行要求。
要在系統(tǒng)中使用SDRAM,要求微處理器具有刷新控制邏輯,或在系統(tǒng)中另外加入刷新控制邏輯電路。通過Altera公司提供的NIOS II開發(fā)工具可以將SDRAM控制器添加到NIOS CPU中,然后下載到EP1C12Q240C8中運(yùn)行,因此可以方便地使用EP1C12Q240C8的通用I/O口與SDRAM相連接,同樣在進(jìn)行系統(tǒng)整體設(shè)計(jì)時(shí)通過Quartus II定義引腳。
2.4 外部接口模塊
2.4.1以太網(wǎng)接口設(shè)計(jì)
系統(tǒng)采用realteck公司推出多年RTL8019AS網(wǎng)絡(luò)芯片。RTL8019AS芯片是一款應(yīng)用廣泛的10M網(wǎng)絡(luò)芯片,支持以太網(wǎng)II 和IEEE802.3 10Base5,10Base2,10BaseT、支持可編程輸出的4-診斷 LED。利用RTL8019AS可以在NIOS II系統(tǒng)中方便的建立起完整的網(wǎng)絡(luò)服務(wù)器,可以通過網(wǎng)絡(luò)從FPGA芯片構(gòu)成的軟嵌入式系統(tǒng)中收發(fā)數(shù)據(jù)。
RTL8019AS與EP1C12Q240C8通過外部總線進(jìn)行連接。主要是把RTL8019AS的數(shù)據(jù)總線(SDO~SD15)、地址總線(SAO~SA5,SA8)、讀使能(IORB)、寫使能(IOWB)、中斷輸出信號(hào)(INTO)和中斷輸入信號(hào)(RSTDRV)與EP1C12Q240C8的通用I/O腳連接即可。
2.4.2 USB接口設(shè)計(jì)
系統(tǒng)采用Cypress公司的SL811HS芯片作為USB接口芯片,它是一種USB主機(jī)控制器,它能與全速或低速USB外圍設(shè)備通信。SL811HS能與各種微處理器、微控制器、FPGA以及DSP,ISA等各種總線進(jìn)行接口,適用于各種要求配置USB主機(jī)或設(shè)備的嵌入式系統(tǒng)。
在USB接口電路設(shè)計(jì)中,SL811HS的8位數(shù)據(jù)線直接和FPGA芯片的8位數(shù)據(jù)線相連。其中需要注意的是,SL811HS的AO引腳和低8位地址線的最低位AO相連,即與鎖存器的地址輸出端的最低位相連。
2.4.3 串行接口設(shè)計(jì)
RS232是應(yīng)用最為廣泛的UART接口,可以方便的實(shí)現(xiàn)與計(jì)算機(jī)的數(shù)據(jù)通訊;同時(shí)在調(diào)試基于FPGA的嵌入式操作系統(tǒng)時(shí)候,可以作為輔助調(diào)試接口,結(jié)果輸出到主機(jī)的超級(jí)終端上面。因?yàn)镕PGA的通用I/O引腳可以在后期通過Quartus II軟件定義,所以只需選取EP1C12Q240C8的任意四個(gè)引腳與電平轉(zhuǎn)換器MAX3232C相連,通過MAX3232C 接RS232標(biāo)準(zhǔn)串行接口(DB9),可與PC機(jī)進(jìn)行串行通信。
2.4.4 電源接口設(shè)計(jì)
系統(tǒng)需要使用1.5V、3.3V和5V三種直流電源,其中,EP1C12Q240C8內(nèi)核使用1.5V電源,EP1C12Q240C8的I/O口、MAX3232C、LCD接口等器件使用3.3V電源,RTL8019AS使用5V電源。為簡化系統(tǒng)電源電路的設(shè)計(jì),要求整個(gè)系統(tǒng)的輸入電壓為高質(zhì)量的5V直流電壓電源,本系統(tǒng)采用電壓轉(zhuǎn)換芯片B1117來得到1.5V和3.3V的電壓。
2.4.5 系統(tǒng)時(shí)鐘電路設(shè)計(jì)
系統(tǒng)時(shí)鐘模塊為試驗(yàn)系統(tǒng)提供時(shí)鐘信號(hào),使其工作在指定的頻率下,是系統(tǒng)不可缺少的部分。本系統(tǒng)的時(shí)鐘信號(hào)由50MHz的有源晶振產(chǎn)生,為了使系統(tǒng)有穩(wěn)定的時(shí)鐘輸入,要對(duì)晶振的輸入電壓通過簡單的LC濾波電路做濾波處理,使其電壓更加穩(wěn)定,盡可能減小干擾。
2.4.6 復(fù)位電路設(shè)計(jì)
在系統(tǒng)中,復(fù)位電路主要完成系統(tǒng)的上電復(fù)位和系統(tǒng)在運(yùn)行時(shí)用戶的按鍵復(fù)位功能。本系統(tǒng)根據(jù)實(shí)際需要,通過Quartus II軟件對(duì)復(fù)位信號(hào)進(jìn)行延時(shí)設(shè)計(jì),然后在外部再加以需要簡單的電路來實(shí)現(xiàn)。
2.4.7 JTAG接口設(shè)計(jì)
JTAG(Joint Test Action Group)是一種國際標(biāo)準(zhǔn)測試協(xié)議,主要用于芯片內(nèi)部測試及對(duì)系統(tǒng)進(jìn)行仿真、調(diào)試 。JTAG技術(shù)是一種嵌入式調(diào)試技術(shù),它在芯片內(nèi)部封裝了專門的測試電路,可以通過專用的JTAG測試軟件對(duì)芯片內(nèi)部節(jié)點(diǎn)進(jìn)行測試。EP1C12Q240C8有四個(gè)專用引腳TMS、TDI、TCK、TDO與Altera公司的專用下載電纜——Byte Blaster II通過一個(gè)十針的插座相連,用于下載以及在線調(diào)試。
3 系統(tǒng)軟件設(shè)計(jì)
本系統(tǒng)主要的開發(fā)調(diào)試工具有SOPC Builder、Quartus II和 NIOS II IDE。SOPC Builder是一個(gè)自動(dòng)化的系統(tǒng)開發(fā)工具,它能夠極大地簡化高性能SOPC的設(shè)計(jì)工作;Quartus II是Altera公司推出的CPLD/FPGA開發(fā)工具,Quartus II提供了完全集成且與電路結(jié)構(gòu)無關(guān)的開發(fā)包環(huán)境,具有數(shù)字邏輯設(shè)計(jì)的全部特性,主要用于system-on-a-programmable-chip (SOPC)的設(shè)計(jì)環(huán)境;NIOS II IDE是NIOS II系列嵌入式處理器的基本軟件開發(fā)工具。所有軟件開發(fā)任務(wù)都可以NIOS II IDE下完成,包括編輯、編譯和調(diào)試程序。
3.1.系統(tǒng)軟件配置
采用NIOS處理器開發(fā)設(shè)計(jì)與采用傳統(tǒng)的處理器開發(fā)設(shè)計(jì)不同,開發(fā)者必須先配置處理器結(jié)構(gòu)、設(shè)置接口等內(nèi)容。也就是說,開發(fā)者必須根據(jù)實(shí)際需求構(gòu)建一個(gè)處理器,而傳統(tǒng)的處理器具有固定接口、片內(nèi)RAM和外部設(shè)備。系統(tǒng)設(shè)計(jì)所需的具體軟件配置如下:
?。?)用SOPC Builder系統(tǒng)綜合軟件來進(jìn)行NIOS軟核的軟件配置,包括NIOS CPU配置、片上ROM及RAM設(shè)置、FLASH設(shè)置、SDRAM設(shè)置、JTAG調(diào)試配置、加入定時(shí)器、加入外部RAM總線——Avalon三態(tài)總線橋、通訊接口、按鍵PIO與LED PIO設(shè)置、指定基地址和配置NIOS軟核,這樣整個(gè)NIOS軟核已經(jīng)配置完畢,之后需要編譯,并生成圖形文件,成為Quartus II設(shè)計(jì)的一部分。
?。?)使用Quartos II軟件來選取具體的Altera可編程器件系列,并對(duì)SOPC Builder生成的HDL設(shè)計(jì)文件進(jìn)行布局布線;再使用Quartos II軟件選取目標(biāo)器件并對(duì)NIOS II系統(tǒng)上的各種I/O口分配管腳,另外還要根據(jù)要求進(jìn)行硬件編譯選項(xiàng)或時(shí)序約束的設(shè)置。在編譯的過程中,Quartos II從HDL源文件綜合生成一個(gè)適合目標(biāo)器件的網(wǎng)表。最后生成配置文件。
?。?)使用Quartos II編程器和Altera下載電纜,將配置文件下載到開發(fā)板上。當(dāng)校驗(yàn)完當(dāng)前硬件設(shè)計(jì)后,再將新的配置文件下載到開發(fā)板上的非易失存儲(chǔ)器里。
3.2.嵌入式實(shí)時(shí)操作系統(tǒng)MicroC/OS-II的應(yīng)用設(shè)計(jì)
目前比較流行的嵌入式操作系統(tǒng)主要有MicroC/OS-II , MicroCLinux,VxWorks等,考慮到系統(tǒng)資源以及NIOS II IDE 開發(fā)環(huán)境包含MicroC/OS-II實(shí)時(shí)操作系統(tǒng),為設(shè)計(jì)者提供快速地搭建基于NIOS II處理器的MicroC/OS-II應(yīng)用程序的能力,, 故本系統(tǒng)的操作系統(tǒng)選用MicroC/OS-II 。MicroC/OS-II 是一種可固化、可剪裁、占先式的多任務(wù)實(shí)時(shí)操作系統(tǒng)內(nèi)核。它為每個(gè)任務(wù)分配單獨(dú)的堆棧, 提供多種系統(tǒng)服務(wù)可進(jìn)行中斷管理。
創(chuàng)建一個(gè)基于NIOS II處理器的MicroC/OS-II軟件過程包含以下步驟:創(chuàng)建一個(gè)新的NIOS II IDE工程;設(shè)定MicroC/OS-II軟件工程庫;建立并運(yùn)行NIOS II 下的MicroC/OS-II軟件工程。
一、 創(chuàng)建一個(gè)新的NIOS II IDE工程
創(chuàng)建一個(gè)新的NIOS II IDE工程的方法比較簡單,基本上按照向?qū)Ь湍芡瓿?,要注意的是?Project Template(工程模板)選擇中, 要選擇 the MicroC/OS-II Tutorial,在New System Library Dialog Box 頁面中的Select Type of system library欄中要選擇MicroC/OS-II。
二、設(shè)定MicroC/OS-II的步驟
?。?). 在NIOS II IDE的C/C++ Projects視圖中,右鍵在系統(tǒng)庫上單擊std_system_lib。
?。?). 在彈出的菜單中選擇Properties打開Properties對(duì)話框。
?。?). 單擊System Library顯示system library選項(xiàng)。
?。?).單擊在RTOS 下面的RTOS Options。彈出MicroC/OS-II RTOS Options對(duì)話框。
?。?).單擊“+”在在左邊的面板中,展開MicroC/OS-II目錄。MicroC/OS-II是高度映射可設(shè)定的。你選定的對(duì)話框中的選項(xiàng)被保存在os_cfg.h文件中。選定的MicroC/OS-II選項(xiàng)被包含在二進(jìn)制中。通過單擊MicroC/OS-II下每一個(gè)選項(xiàng)檢查你所能選擇的選項(xiàng)。
?。?).選擇默認(rèn)設(shè)置單擊OK。你將返回系統(tǒng)庫選項(xiàng)對(duì)話框,然后單擊OK完成設(shè)置。
三、建立并運(yùn)行NIOS II 下的MicroC/OS-II軟件工程
在這一部分,在嵌入式系統(tǒng)中設(shè)計(jì)并運(yùn)行一個(gè)MicroC/OS-II程序,通過在嵌入式操作系統(tǒng)MicroC/OS-II下編寫2個(gè)互相調(diào)用任務(wù)來測試本系統(tǒng)的運(yùn)行情況。
1.打開ucosii_tutorial.c
2.頭文件加入如下代碼
#include “system.h”
#include “altera_avalon_pio_regs.h”
#include “alt_types.h”
3.加入相關(guān)定義
#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.在初始化函數(shù) initCreateTasks函數(shù)中加入如下代碼
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.增加執(zhí)行2任務(wù)互相調(diào)用的代碼
void Task1(void * pParam)
{ //往接收消息隊(duì)列發(fā)送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中)創(chuàng)建程序,下載它到試驗(yàn)板中并運(yùn)行。下載完成后,當(dāng)執(zhí)行這兩個(gè)任務(wù)時(shí),任務(wù)一返回:“Hello from task1”;而任務(wù)二返回:“Hello from task2”,兩個(gè)任務(wù)之間互相調(diào)用。
得到測試結(jié)果如圖2:
圖2 MicroC/OS系統(tǒng)測試結(jié)果
從測試結(jié)果中可以看出,任務(wù)一和任務(wù)二被反復(fù)的調(diào)用,這與預(yù)期中執(zhí)行的結(jié)果相同,說明系統(tǒng)能夠在FPGA中穩(wěn)定運(yùn)行。
四、結(jié)束語
本文介紹的基于FPGA的嵌入式系統(tǒng)設(shè)計(jì)達(dá)到了預(yù)期效果, CPU 本身是以軟核的方式實(shí)現(xiàn), 其功能可根據(jù)需要進(jìn)行定制, 非常靈活。嵌入式MicroC/OS-II 操作系統(tǒng)的32 位嵌入式微處理器進(jìn)行核心控制,利用它強(qiáng)大的運(yùn)算處理能力,不僅減少了系統(tǒng)所用的器件數(shù)量和系統(tǒng)的尺寸,更提高了系統(tǒng)的可靠性和靈活性。該設(shè)計(jì)為嵌入式系統(tǒng)設(shè)計(jì)提供了一條新思路,體現(xiàn)了FPGA的靈活性、高集成性等特性,大大降低了成本,縮短了開發(fā)時(shí)間。
評(píng)論