尹凱





摘要:本文實現了一種基于SSP接口的FPGA被動配置方法,對FPGA的被動串行配置進行了詳細討論,給出了硬件電路設計和SSP接口的操作方法。
關鍵詞:SSP;FPGA被動配置;Linux
1. 引言
FPGA在上電之后,需要從外部電路獲取配置數據并載入到內部的配置SRAM中才能正常工作。本文主要討論了一種基于外部處理器SSP接口發送配置數據的方法,既可以保證配置速度又簡化了硬件連接。
2.FPGA配置方式
Altera公司的Cyclone系列FPGA支持三種配置方式:AS模式(主動串行模式)、PS模式(被動串行模式)和JTAG模式。這三種配置方式由模式選擇管腳(MSEL1、MSEL0)的電平值決定,其主要區別是配置過程中FPGA所處的地位和加載配置數據的方式不同。本文使用其中的PS模式,實現外部處理器對FPGA的串行配置。
2.1PS配置過程
PS模式中主要用到的FPGA配置管腳包括:
lDCLK:配置時鐘;
lDATA0:配置數據;
lnCONFIG:配置命令;
lnSTATUS:配置狀態指示;
lCONF_DONE:配置完成指示。
在PS模式下FPGA處于從屬地位,接收來自外部的配置命令、配置時鐘和配置數據,并給出配置狀態信號以及配置完成指示信號,時序波形如下圖所示。
外部控制器(ARM、單片機等)控制整個配置過程。在配置期間,配置數據在DCLK管腳的時鐘信號上升沿通過DATA0管腳鎖存至FPGA中。FPGA要求每字節數據從LSB(最低有效位)開始發送,比如配置文件包含的字節順序為0x02 0x1B,那么串行二進制流的發送順序就是0100-0000 1101-1000。
2.2PS配置文件
Altera的開發環境QuartusII編譯后自動生成的sof和pof格式的配置文件,不能用于PS模式,需要進行格式轉化將sof文件轉換為rbf文件。
3.SSP接口電路設計
在本設計中,外部處理器使用的是MARVELL公司的PXA270,通過配置其GPIO管腳的復用功能實現SSP(同步串行協議)通信接口,處理器與FPGA配置管腳的連接關系如下圖所示。
3.1GPIO工作模式
對于具有復用功能的GPIO管腳,通過GPIO控制器的相應寄存器來配置其工作模式。根據我們所選用GPIO管腳的編號范圍(GPIO23~GPIO27),使用的寄存器名稱及作用如下:
lGPLR0(GPIO電平狀態寄存器0)
讀取GPIO管腳的電平狀態,每一位對應一個GPIO管腳。
lGPSR0(GPIO輸出設置寄存器0)
控制GPIO管腳輸出高電平,每一位對應一個GPIO管腳。
lGPCR0(GPIO輸出清除寄存器0)
控制GPIO管腳輸出低電平,每一位對應一個GPIO管腳。
lGPDR0(GPIO方向寄存器0)
配置GPIO管腳為輸出或者輸入,每一位對應一個GPIO管腳。
lGAFR0_U(GPIO復用功能寄存器0)
配置GPIO管腳復用功能,每兩位對應一個GPIO管腳。
GPIO管腳的工作模式配置及寄存器取值如下表所示,各寄存器的物理地址詳見處理器的數據手冊。
3.2SSP接口時序
PXA270的SSP接口支持多種通信協議,包括TI的同步串行協議、Motorola的SPI協議、NI的Microwire協議等。這里使用Motorola的SPI通信協議,其接口時序如下圖所示。根據GPIO管腳的工作模式配置,我們只使用其中的SSPSCLK和SSPTXD信號用于發送FPGA的配置時鐘和配置數據。
這里需要注意的是,處理器的SSP接口在發送字節數據時是從MSB(最高有效位)開始發送,而FPGA要求每字節數據從LSB(最低有效位)開始發送,所以在配置程序中需要增加一個數據格式轉換過程。
4.Linux上配置程序實現
配置程序運行在Linux的用戶空間,rbf文件存放在與處理器相連的Flash指定分區中,rbf文件名作為參數傳遞給配置程序并通過文件訪問函數進行讀取,配置程序的實現流程如下圖所示。
其中PS模式配置流程的具體操作步驟如下:
1)設置nCONFIG=0,保持2us以上;
2)檢測nSTATUS,若為0表示FPGA已響應配置請求,否則出錯;
3)設置nCONFIG=1,等待不超過40us;
4)檢測nSTATUS,若為1表示FPGA可以開始進行配置;
5)在DCLK的每個上升沿,通過DATA0輸入比特流數據;
6)待所有數據發送完畢后,CONF_DONE應變為1,表示FPGA配置完成。
對nCONFIG、nSTATUS和CONF_DONE管腳的操作,通過讀寫相應GPIO寄存器即可實現,這里主要對SSP控制器的操作進行說明。
1.1SSP接口初始化
SSP接口初始化使用到的SSP寄存器如下:
a)SSCR0_1(SSP1控制寄存器0)
b)SSCR1_1(SSP1控制寄存器1)
通過SSCR0_1寄存器配置SSP接口的工作模式,數據位數、時鐘頻率;通過SSCR1_1寄存器配置SSP接口的極性、相位等參數。最后通過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接口數據發送
SSP接口數據發送使用到的SSP寄存器如下:
a)SSSR_1(SSP1狀態寄存器)
b)SSDR_1(SSP1數據寄存器)
通過SSSR_1寄存器讀取當前發送FIFO的狀態,如果發送FIFO不滿,則在SSDR_1寄存器中寫入新數據,直到配置數據發送完成。發送代碼如下:
static int ssp_xmit(u16 b)
{
while(?。╣etmem(SSP_SSSR) & TNF));
putmem(SSP_SSDR, b);
return 0;
}
5. 結束語
本文主要實現了基于外部處理器SSP接口的FPGA被動串行配置,具有接口簡單、加載速度快、通用性強等特點?;趌inux實現的配置程序方便移植和使用,通過分時加載不同的配置文件可以實現FPGA的動態配置。
參考文獻
[1] Marvell Inc.Marvell PXA270 Processor Developers Manual, 2009
[2] Altera Inc.Cyclone III Device Handbook, 2012
[3]王黎明.深入淺出XScale嵌入式系統.北京航空航天大學出版社, 2011