尹凱
摘要:本文實(shí)現(xiàn)了一種基于SSP接口的FPGA被動(dòng)配置方法,對(duì)FPGA的被動(dòng)串行配置進(jìn)行了詳細(xì)討論,給出了硬件電路設(shè)計(jì)和SSP接口的操作方法。
關(guān)鍵詞:SSP;FPGA被動(dòng)配置;Linux
1. 引言
FPGA在上電之后,需要從外部電路獲取配置數(shù)據(jù)并載入到內(nèi)部的配置SRAM中才能正常工作。本文主要討論了一種基于外部處理器SSP接口發(fā)送配置數(shù)據(jù)的方法,既可以保證配置速度又簡(jiǎn)化了硬件連接。
2.FPGA配置方式
Altera公司的Cyclone系列FPGA支持三種配置方式:AS模式(主動(dòng)串行模式)、PS模式(被動(dòng)串行模式)和JTAG模式。這三種配置方式由模式選擇管腳(MSEL1、MSEL0)的電平值決定,其主要區(qū)別是配置過程中FPGA所處的地位和加載配置數(shù)據(jù)的方式不同。本文使用其中的PS模式,實(shí)現(xiàn)外部處理器對(duì)FPGA的串行配置。
2.1PS配置過程
PS模式中主要用到的FPGA配置管腳包括:
lDCLK:配置時(shí)鐘;
lDATA0:配置數(shù)據(jù);
lnCONFIG:配置命令;
lnSTATUS:配置狀態(tài)指示;
lCONF_DONE:配置完成指示。
在PS模式下FPGA處于從屬地位,接收來(lái)自外部的配置命令、配置時(shí)鐘和配置數(shù)據(jù),并給出配置狀態(tài)信號(hào)以及配置完成指示信號(hào),時(shí)序波形如下圖所示。
外部控制器(ARM、單片機(jī)等)控制整個(gè)配置過程。在配置期間,配置數(shù)據(jù)在DCLK管腳的時(shí)鐘信號(hào)上升沿通過DATA0管腳鎖存至FPGA中。FPGA要求每字節(jié)數(shù)據(jù)從LSB(最低有效位)開始發(fā)送,比如配置文件包含的字節(jié)順序?yàn)?x02 0x1B,那么串行二進(jìn)制流的發(fā)送順序就是0100-0000 1101-1000。
2.2PS配置文件
Altera的開發(fā)環(huán)境QuartusII編譯后自動(dòng)生成的sof和pof格式的配置文件,不能用于PS模式,需要進(jìn)行格式轉(zhuǎn)化將sof文件轉(zhuǎn)換為rbf文件。
3.SSP接口電路設(shè)計(jì)
在本設(shè)計(jì)中,外部處理器使用的是MARVELL公司的PXA270,通過配置其GPIO管腳的復(fù)用功能實(shí)現(xiàn)SSP(同步串行協(xié)議)通信接口,處理器與FPGA配置管腳的連接關(guān)系如下圖所示。
3.1GPIO工作模式
對(duì)于具有復(fù)用功能的GPIO管腳,通過GPIO控制器的相應(yīng)寄存器來(lái)配置其工作模式。根據(jù)我們所選用GPIO管腳的編號(hào)范圍(GPIO23~GPIO27),使用的寄存器名稱及作用如下:
lGPLR0(GPIO電平狀態(tài)寄存器0)
讀取GPIO管腳的電平狀態(tài),每一位對(duì)應(yīng)一個(gè)GPIO管腳。
lGPSR0(GPIO輸出設(shè)置寄存器0)
控制GPIO管腳輸出高電平,每一位對(duì)應(yīng)一個(gè)GPIO管腳。
lGPCR0(GPIO輸出清除寄存器0)
控制GPIO管腳輸出低電平,每一位對(duì)應(yīng)一個(gè)GPIO管腳。
lGPDR0(GPIO方向寄存器0)
配置GPIO管腳為輸出或者輸入,每一位對(duì)應(yīng)一個(gè)GPIO管腳。
lGAFR0_U(GPIO復(fù)用功能寄存器0)
配置GPIO管腳復(fù)用功能,每?jī)晌粚?duì)應(yīng)一個(gè)GPIO管腳。
GPIO管腳的工作模式配置及寄存器取值如下表所示,各寄存器的物理地址詳見處理器的數(shù)據(jù)手冊(cè)。
3.2SSP接口時(shí)序
PXA270的SSP接口支持多種通信協(xié)議,包括TI的同步串行協(xié)議、Motorola的SPI協(xié)議、NI的Microwire協(xié)議等。這里使用Motorola的SPI通信協(xié)議,其接口時(shí)序如下圖所示。根據(jù)GPIO管腳的工作模式配置,我們只使用其中的SSPSCLK和SSPTXD信號(hào)用于發(fā)送FPGA的配置時(shí)鐘和配置數(shù)據(jù)。
這里需要注意的是,處理器的SSP接口在發(fā)送字節(jié)數(shù)據(jù)時(shí)是從MSB(最高有效位)開始發(fā)送,而FPGA要求每字節(jié)數(shù)據(jù)從LSB(最低有效位)開始發(fā)送,所以在配置程序中需要增加一個(gè)數(shù)據(jù)格式轉(zhuǎn)換過程。
4.Linux上配置程序?qū)崿F(xiàn)
配置程序運(yùn)行在Linux的用戶空間,rbf文件存放在與處理器相連的Flash指定分區(qū)中,rbf文件名作為參數(shù)傳遞給配置程序并通過文件訪問函數(shù)進(jìn)行讀取,配置程序的實(shí)現(xiàn)流程如下圖所示。
其中PS模式配置流程的具體操作步驟如下:
1)設(shè)置nCONFIG=0,保持2us以上;
2)檢測(cè)nSTATUS,若為0表示FPGA已響應(yīng)配置請(qǐng)求,否則出錯(cuò);
3)設(shè)置nCONFIG=1,等待不超過40us;
4)檢測(cè)nSTATUS,若為1表示FPGA可以開始進(jìn)行配置;
5)在DCLK的每個(gè)上升沿,通過DATA0輸入比特流數(shù)據(jù);
6)待所有數(shù)據(jù)發(fā)送完畢后,CONF_DONE應(yīng)變?yōu)?,表示FPGA配置完成。
對(duì)nCONFIG、nSTATUS和CONF_DONE管腳的操作,通過讀寫相應(yīng)GPIO寄存器即可實(shí)現(xiàn),這里主要對(duì)SSP控制器的操作進(jìn)行說(shuō)明。
1.1SSP接口初始化
SSP接口初始化使用到的SSP寄存器如下:
a)SSCR0_1(SSP1控制寄存器0)
b)SSCR1_1(SSP1控制寄存器1)
通過SSCR0_1寄存器配置SSP接口的工作模式,數(shù)據(jù)位數(shù)、時(shí)鐘頻率;通過SSCR1_1寄存器配置SSP接口的極性、相位等參數(shù)。最后通過SSCR0_1寄存器使能SSP1接口。初始化代碼如下:
static void set_ssp_reg(void)
{
//----Control Register 0----//
int sscr0 = read_reg(SSP_SSCR0);
sscr0 &= ~FRF; //Motorola
sscr0 &= ~MOD;
sscr0 |= (TIM | RIM);
//16-bit data
sscr0 &= ~(0xF);
sscr0 |= DSS;
sscr0 &= ~EDSS;
//Clock 6.5MHz
sscr0 &= ~ACS;
sscr0 &= ~NCS;
sscr0 &= ~ECS;
sscr0 &= ~(0xFFF << 8);
sscr0 |= SCR;
write_reg(SSP_SSCR0, sscr0);
//----Control Register 1----//
int sscr1 = read_reg(SSP_SSCR1);
sscr1 &= ~(0x3fc0);
sscr1 |= TFT; //Set TX fifo level
sscr1 |= RFT; //Set RX fifo level
sscr1 &= ~RWOT; //Tx Rx mode
sscr1 &= ~SPH; //Phase
sscr1 &= ~SPO; //Polarity
sscr1 &= ~LBM;
sscr1 &= ~TIE;
sscr1 &= ~RIE;
write_reg(SSP_SSCR1, sscr1);
//----Control Register 0----------------//
sscr0 = getmem(SSP_SSCR0);
sscr0 |= SSE;
putmem(SSP_SSCR0, sscr0);
}
1.2SSP接口數(shù)據(jù)發(fā)送
SSP接口數(shù)據(jù)發(fā)送使用到的SSP寄存器如下:
a)SSSR_1(SSP1狀態(tài)寄存器)
b)SSDR_1(SSP1數(shù)據(jù)寄存器)
通過SSSR_1寄存器讀取當(dāng)前發(fā)送FIFO的狀態(tài),如果發(fā)送FIFO不滿,則在SSDR_1寄存器中寫入新數(shù)據(jù),直到配置數(shù)據(jù)發(fā)送完成。發(fā)送代碼如下:
static int ssp_xmit(u16 b)
{
while(?。╣etmem(SSP_SSSR) & TNF));
putmem(SSP_SSDR, b);
return 0;
}
5. 結(jié)束語(yǔ)
本文主要實(shí)現(xiàn)了基于外部處理器SSP接口的FPGA被動(dòng)串行配置,具有接口簡(jiǎn)單、加載速度快、通用性強(qiáng)等特點(diǎn)。基于linux實(shí)現(xiàn)的配置程序方便移植和使用,通過分時(shí)加載不同的配置文件可以實(shí)現(xiàn)FPGA的動(dòng)態(tài)配置。
參考文獻(xiàn)
[1] Marvell Inc.Marvell PXA270 Processor Developers Manual, 2009
[2] Altera Inc.Cyclone III Device Handbook, 2012
[3]王黎明.深入淺出XScale嵌入式系統(tǒng).北京航空航天大學(xué)出版社, 2011