SoC系統(tǒng)設(shè)計(jì),基于OR1200開(kāi)源32位軟核處理器wishbone總線系統(tǒng),實(shí)現(xiàn)uart gpio 定時(shí)器
摘要
?????SoC是在單個(gè)芯片上集成數(shù)字、模擬電路、CPU、DSP等各種模塊,實(shí)現(xiàn)一個(gè)系統(tǒng)的功能,集成度高、可靠性好、成本低。本設(shè)計(jì)為一個(gè)基于OR1200的系統(tǒng)設(shè)計(jì),各模塊之間采用wishbone總線連接,所使用的主要模塊有GPIO、on chip memory、PLL、定時(shí)器模塊(PTC)、串口(uart16550)、外部中斷模塊。系統(tǒng)軟件實(shí)現(xiàn)的功能為通過(guò)按鍵控制LED燈,通過(guò)中斷,在中斷服務(wù)函數(shù)中通過(guò)串口發(fā)送數(shù)據(jù),通過(guò)定時(shí)器產(chǎn)生一個(gè)PWM波,來(lái)調(diào)節(jié)LED燈的亮度。
設(shè)計(jì)工程源碼聯(lián)系 企鵝號(hào)?3270516346
一、系統(tǒng)總體功能概述
1、系統(tǒng)硬件模塊
???①?OR1200處理器
???②?wishbone總線
???③?定時(shí)/計(jì)數(shù)器模塊(PTC)
???④?串口模塊(UART)
???⑤?鎖相環(huán)模塊(PLL)
???⑥?GPIO接口模塊
???⑦?片上存儲(chǔ)器模塊(on chip memory)
2、各模塊連接

3、系統(tǒng)總體功能
?????將GPIO配置為雙向端口,將GPIO的低8位定義為輸出,并連接到LED燈上,高八位定義為輸入并連接到按鍵上,通過(guò)按鍵控制LED的亮滅。啟用外部中斷,當(dāng)輸入為上升沿時(shí)觸發(fā)中斷,在中斷服務(wù)函數(shù)中,通過(guò)串口向終端發(fā)送數(shù)據(jù)。啟用定時(shí)器,使用定時(shí)器產(chǎn)生PWM波,將定時(shí)器PWM的輸出連接到LED上,控制LED的亮度。通過(guò)PLL模塊來(lái)調(diào)節(jié)系統(tǒng)時(shí)鐘頻率為25MHz。
二、最小系統(tǒng)模塊設(shè)計(jì)
1、OR1200
1、OR1200是OR1000的一種實(shí)現(xiàn),源于OpenRISC項(xiàng)目,免費(fèi)開(kāi)源。
2、OR1200采用數(shù)據(jù)和指令分離的哈佛體系結(jié)構(gòu),為32位RISC處理器,所以O(shè)R1200占用兩個(gè)主端口,rim和rdm端口,分別為指令和數(shù)據(jù)總線。
3、OR1200支持中斷、電源管理燈多種功能
2、wishbone
1、wishbone總線是Silicore公司推出的片上總線標(biāo)準(zhǔn),被opencore組織采用并維護(hù)。
2、wishbone支持8個(gè)主設(shè)備和16個(gè)從設(shè)備,內(nèi)置仲裁器,允許多個(gè)主從設(shè)備進(jìn)行通信
3、存儲(chǔ)器
1、可以使用寄存器來(lái)實(shí)現(xiàn)存儲(chǔ)器,也可以使用FPGA嵌入式存儲(chǔ)塊來(lái)實(shí)現(xiàn)
2、存儲(chǔ)器生成以后,要采用wishbone總線進(jìn)行封裝,使其符合wishbone總線標(biāo)準(zhǔn)
三、各功能模塊軟硬件設(shè)計(jì)
1、GPIO
1、模塊主要特征:
①用戶可以從1到32之間選擇通用IO信號(hào)的個(gè)數(shù),更多信號(hào)可以采用多個(gè)GPIOP核并用。
②包含三態(tài)使能端或開(kāi)漏使能端(需要三態(tài)或漏級(jí)開(kāi)路IO單元)。
③設(shè)為輸入的通用O信號(hào)可對(duì)CPU產(chǎn)生中斷請(qǐng)求。
④設(shè)為輸入的通用I/O信號(hào)能記錄在系統(tǒng)時(shí)鐘的上升沿或外部時(shí)鐘的用戶編程邊沿。
2、GPIO模塊主要由WISHBONE主機(jī)接口、GPIO寄存器、輔助輸入輸出端口、外部單元接口組成。GPIO核結(jié)構(gòu)如下所示:

3、GPIO模塊接口采用wishbone接口,在本設(shè)計(jì)中GPIO連接到wishbone總線的從接口14上,基地址定義為“GPIO_BASE ?0xE0000000”。
4、GPIO的寄存器定義如下:

按照如上的定義定義寄存器的地址:
5、在初始化GPIO時(shí),設(shè)置高8位為輸入,低8位為輸出,開(kāi)啟外部中斷,開(kāi)啟GPIO高8位輸入的中斷,并設(shè)置為上升沿觸發(fā)中斷。相應(yīng)的GPIO初始化程序?yàn)椋?/span>
6、將GPIO配置為雙向端口,OE為輸入輸出控制端。將GPIO端口定義為“inout”類型,相應(yīng)的模塊結(jié)構(gòu)如下:

對(duì)于每一位都可以單獨(dú)設(shè)置為輸入輸出,相應(yīng)的HDL描述為:
2、UART配置
1、UART為異步串行接口,數(shù)據(jù)在單條傳輸線上一位一位的傳輸,節(jié)省通信總線,碼率低,本設(shè)計(jì)采用opencore上開(kāi)源的UART?16550 IP模塊。
2、在UART16550模塊中,我們約定數(shù)據(jù)為8個(gè)數(shù)據(jù)位、1個(gè)停止位、無(wú)效驗(yàn)位,波特率設(shè)置位115200.
3、UART控制器表示如下:

UART接口控制器設(shè)計(jì)中只支持TXD和RXD兩個(gè)信號(hào)。
4、設(shè)置串行通信的波特率為115200,波特率設(shè)置方式為“(輸入時(shí)鐘速度)/(除數(shù)鎖存值)= 16 x 通信
波特率“。
5、在設(shè)計(jì)時(shí)我們通常只使用“void uart_putc(char c)”函數(shù)來(lái)發(fā)送數(shù)據(jù),使用“void uart_init(void)”函數(shù)來(lái)初始化。
3、定時(shí)器、看門狗和PWM(PTC)
1、PTC的主要功能為:
①32位計(jì)時(shí)、計(jì)數(shù)功能;
②次或連續(xù)計(jì)時(shí)、計(jì)數(shù);
③可編程PWM模式;
④系統(tǒng)時(shí)鐘核外部時(shí)鐘兩種選擇;HI/LO參考和捕獲寄存器;
⑤PWM輸出三態(tài)控制;
⑥PWM計(jì)時(shí)器/計(jì)數(shù)器計(jì)時(shí)中斷;
⑦WISHBONE?接口兼容。
?
2、PTC模塊的結(jié)構(gòu)如下:

PTC通過(guò)WISHBONE接口連接到系統(tǒng)并與系統(tǒng)通信,PTC有4個(gè)與外部連接的端口。ptc_ecgt為當(dāng)使用外部輸入時(shí)鐘時(shí)的時(shí)鐘輸入端;ptc_capt為使用捕獲輸入模式模式時(shí),當(dāng)輸入下降沿或上升沿時(shí),捕獲當(dāng)前的計(jì)數(shù)值;ptc_pwm為使用輸出比較模式時(shí),pwm波輸出接口。
3、PTC的寄存器定義為:

PTC共有4個(gè)寄存器,我們將PTC連接到WISHBONE從模塊的15端口,對(duì)于寄存器的定義為:
4、我們使用PTC模塊來(lái)產(chǎn)生pwm波形,在初始化時(shí),首先使能PTC模塊,然后使能pwm輸出功能,配置定時(shí)器為自動(dòng)循環(huán)計(jì)數(shù)方式,然后設(shè)置HRC和LRC的值,以配置pwm的頻率和占空比。
在產(chǎn)生pwm波時(shí),定時(shí)器計(jì)數(shù)到LRC的值時(shí),在從0開(kāi)始計(jì)數(shù);當(dāng)當(dāng)前計(jì)數(shù)值小于HRC時(shí)pwm輸出為低電平,當(dāng)當(dāng)前計(jì)數(shù)值大于HRC的值時(shí),pwm輸出高電平,所以LRC決定pwm的頻率,HRC決定pwm的占空比。
4、鎖相環(huán)設(shè)置(PLL)
?。?、鎖相環(huán)能調(diào)節(jié)輸入時(shí)鐘的頻率和相位,我們采用PLL模塊將FPGA上50MHz的信號(hào)時(shí)鐘變?yōu)椋玻担停龋?/p>
2、

四、軟件設(shè)計(jì)
1、中斷設(shè)置
1、需要先使用“l(fā).mtspr”配置特殊功能寄存器開(kāi)處理器中斷;中斷服務(wù)函數(shù)使用“l(fā).rfe”返回。開(kāi)中斷操作為:
l.mfspr r1,r0,0x0011
???????? l.ori r3,r1,0x6
???????? l.mtspr r0,r3,0x0011
2、外部中斷對(duì)應(yīng)的中斷向量地址為0X800,當(dāng)外部中斷響應(yīng)后,程序就會(huì)跳轉(zhuǎn)到0x800地址處執(zhí)行相應(yīng)的程序。
3、在0x800處,跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)函數(shù)處,在中斷服務(wù)函數(shù)中,要清楚中斷標(biāo)志位,即使“REG32(RGPIO_INTS )=0x00000000;”中斷服務(wù)函數(shù)執(zhí)行完畢后調(diào)用“l(fā).rfe”指令恢復(fù)現(xiàn)場(chǎng),接著執(zhí)行相應(yīng)的程序。
2、主程序設(shè)計(jì)
1、在主程序中,首先初始化串口、定時(shí)器和GPIO,配置定時(shí)器頻率為1kHz,占空比為50%。
2、相應(yīng)的C程序?yàn)椋?/p>
3、中斷服務(wù)函數(shù)設(shè)計(jì)
在中斷服務(wù)函數(shù)中,首先通過(guò)串口打印相應(yīng)的字符,然后在清楚中斷,調(diào)用“l(fā).rfe”指令進(jìn)行中斷返回。
五、結(jié)果驗(yàn)證
1、仿真驗(yàn)證
通過(guò)Modelsim進(jìn)行仿真,對(duì)系統(tǒng)施加一定的激勵(lì),觀察輸出的時(shí)序。
觀察的gpio輸出值和串口打印數(shù)據(jù)為:

觀察的pwm的輸出為

可以看到有相應(yīng)的pwm波生成。
2、FPGA系統(tǒng)驗(yàn)證
將所設(shè)計(jì)的系統(tǒng)下載到FPGA中進(jìn)行驗(yàn)證
設(shè)計(jì)步驟為分析綜合、映射、布局、布線、管腳分配,在FPGA上上的引腳分配為:

