施根勇,黃世震
(福州大學(xué)福建省微電子集成電路重點實驗室,福州 350002)
字符疊加的全稱是視頻字符疊加,英文簡稱OSD(On Screen Display),是一種在視頻信號中疊加字符信息,使得電視圖像中疊加有字符或漢字圖形的技術(shù)。視頻字符疊加技術(shù)的應(yīng)用領(lǐng)域非常廣泛,尤其是在閉路電視安防監(jiān)控中[1],視頻字符疊加的作用更為明顯。
設(shè)計將SPI 串行總線接口應(yīng)用到OSD 顯示中,公司標(biāo)識,自定義圖片,時間與日期等符號信息存放在閃存(FLASH)里面,通過SPI 串行接口預(yù)加載OSD 信息,然后在LCD 上顯示出來,如圖1所示。
圖1 高速SPI 接口在系統(tǒng)中的位置
由于LCD 控制器的顯示格式Y(jié)UV、RGB 通常是24 bit或更多,所以SPI 控制器需要很高的帶寬來滿足LCD 的實時顯示。
本文設(shè)計一個高速串行接口,連接閃存(FLASH)和屏幕顯示(OSD)控制模塊,在水平和垂直同步信號作用下,OSD 控制器通過高速串行接口從閃存(FLASH)中讀取響應(yīng)的圖形和字符點陣數(shù)據(jù),然后與輸入視頻疊加合成到輸出到LCD 顯示屏幕。
OSD 控制器如果采用320×240 的全屏顯示,需要的數(shù)據(jù)傳輸速率約320×240×30(幀)×8(bit)≈20 Mbit/s,綜合總線余量等因素的考慮,設(shè)計的SPI 串行接口速率至少應(yīng)該達到30 Mbit/s。
UART(Universal Asynchronous Receiver/Transmitter)是一種通用串行數(shù)據(jù)總線,用于異步通信,該總線雙向通信,可以實現(xiàn)全雙工傳輸和接收。在嵌入式設(shè)計中,UART 用來與PC 進行通信,包括監(jiān)控調(diào)試器和其他器件,比如EEPROM。
I2C(Inter-Integrated Circuit)總線[2]是由PHILIPS公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備,具有接口少,器件封裝形式小等優(yōu)點。
SPI(Serial Peripheral Interface)總線是Motorola公司提出的一種同步串行外設(shè)接口,主要應(yīng)用在EEPROM[3],F(xiàn)LASH,實時時鐘,AD 轉(zhuǎn)換器[4],還有數(shù)字信號處理器和數(shù)字信號解碼器之間。它是一種同步的高速、全雙工的數(shù)據(jù)通信總線,并且在芯片的管腳上只采用四根線,節(jié)約了芯片的管數(shù),同時為PCB 的布局上節(jié)省空間,正是出于這種簡單易用的特性,現(xiàn)在越來越多的芯片集成了這種通信協(xié)議。
I2C 連線比SPI 少,但是技術(shù)實現(xiàn)上更加麻煩,而且I2C 使用上拉電阻,抗干擾能力較弱,I2C 的速度也比SPI 慢。
本設(shè)計內(nèi)部接口采用AMBA 總線協(xié)議[5],增加模塊的可移植性和可復(fù)用性。SPI模塊掛在APB 總線上,通過APB 總線對SPI模塊進行狀態(tài)控制、數(shù)據(jù)讀寫、中斷處理等操作。此外,支持DMA 操作,另外還有1 根中斷請求信號線,通過配置內(nèi)部寄存器來控制中斷請求的輸出。SPI 結(jié)構(gòu)是由四條線組成[6]:串行時鐘線(SCLK)、主機輸出從機輸入線(MOSI)、主機輸入從機輸出線(MISO)和從機選擇線(SS)。SPI 是串行通訊協(xié)議模式,SCLK 提供時鐘脈沖,MOSI、MISO 則基于此脈沖完成數(shù)據(jù)傳輸。上升沿到來的時候,MOSI 上的電平將被發(fā)送到從設(shè)備的寄存器中。下降沿到來的時候,MISO 上的電平將被接收到主設(shè)備的寄存器中。設(shè)計的高速SPI模塊的接口信號如圖2所示。
圖2 高速SPI模塊的接口信號圖
協(xié)議規(guī)定了4種傳輸時序,4種時序由時鐘極性CPOL和時鐘相位CPHA 的不同值來區(qū)分。如果CPOL=0,串行同步時鐘的空閑狀態(tài)為低電平;如果CPOL=1,串行同步時鐘的空閑狀態(tài)為高電平。時鐘相位(CPHA)能夠配置用于選擇兩種不同的傳輸協(xié)議之一進行數(shù)據(jù)傳輸。如果CPHA=“0”,在串行同步時鐘的第一個跳變沿(上升或下降)數(shù)據(jù)被采樣;如果CPHA=1,在串行同步時鐘的第二個跳變沿(上升或下降)數(shù)據(jù)被采樣。SPI 主模塊和與之通信的外設(shè)時鐘相位和極性應(yīng)該一致。
圖3 SPI 傳輸時序
根據(jù)定義及SPI 的工作原理,將整個SPI IP 劃分為6個子模塊:傳輸控制模塊、時鐘分頻模塊、時鐘同步模塊、FIFO模塊、APB 接口模塊、SPI模式選擇模塊。整個SPI 控制模塊的結(jié)構(gòu)劃分如圖4所示。
圖4 高速SPI模塊架構(gòu)
4.2.1 APB 接口模塊
APB 接口模塊的主要功能是地址譯碼,讀取和寫入內(nèi)部寄存器以及FIFO 控制,當(dāng)需要讀取或?qū)懭爰拇嫫鞯臅r候,將Paddr 的地址信息與寄存器的地址常量做比較,若Paddr 等于某個寄存器的地址常量,則是要對響應(yīng)寄存器進行操作。當(dāng)片選信號Psel 有效且寫入信號Pwrite,寫使能信號Penable 均有效時,將Pwdata 賦值給相應(yīng)的內(nèi)部寄存器。FIFO控制通過讀指針和寫指針來了解FIFO 內(nèi)部的狀態(tài)。為了支持ARM 的突發(fā)傳輸,對FIFO 的地址做了擴展。為了滿足高速設(shè)計,SPI FLASH 中要求命令和數(shù)據(jù)的傳輸必須在一個SPI burst(一個CS 拉低的傳輸過程)里面,設(shè)計中加長了SPI burst 的最大長度(最大27個word),這樣可以一次從FLASH 中盡可能的多讀數(shù)據(jù)。
4.2.2 時鐘分頻模塊
時鐘分頻模塊將時鐘spi_clk 分頻,產(chǎn)生內(nèi)部時鐘信號sys_clk,設(shè)計采用了兩級分頻,第一級用來n分頻,第二級用來2n分頻。
4.2.3 時鐘同步模塊
模塊中有兩個異步時鐘域,Pclk和SPI_clk,為了盡可能減少異步信號傳輸中由于亞穩(wěn)態(tài)引發(fā)的問題,設(shè)計采用兩級同步寄存器將信號同步到新的時鐘域中,如圖5所示。
圖5 同步寄存器鏈
4.2.4 FIFO模塊
FIFO模塊主要用作數(shù)據(jù)緩沖,以確保數(shù)據(jù)讀寫速度的匹配和時序的一致。由于本設(shè)計中數(shù)據(jù)吞吐量較大,為了滿足高速設(shè)計,所以定義了一個64×32的TXFIFO和一個64×32 的RXFIFO。另外采用DMA 方式傳輸,當(dāng)TXFIFO 的數(shù)據(jù)小于閾值或RXFIFO 的數(shù)據(jù)大于閾值的時候,觸發(fā)DMA 請求。由DMA模塊控制數(shù)據(jù)在內(nèi)存和SPI 間的交換,而不需要處理器核的參與,有效提高了總線的利用率。
4.2.5 傳輸控制模塊的設(shè)計
傳輸控制模塊是SPI 實現(xiàn)的核心,控制整個SPI 總線的傳輸時序,通過計數(shù)產(chǎn)生數(shù)據(jù)傳輸使能信號以及系統(tǒng)需要的狀態(tài)標(biāo)志位,通過一個狀態(tài)機來控制數(shù)據(jù)流的傳輸(圖6)。
圖6 傳輸控制模塊狀態(tài)機
初始狀態(tài)為空閑狀態(tài),當(dāng)CONREOLREG 寄存器中XCH 置1 的時候,開始數(shù)據(jù)傳輸,若傳輸過程中檢測到TXFIFO為空,則停下來等待數(shù)據(jù)填入,當(dāng)所有的數(shù)據(jù)傳輸完畢后,返回空閑狀態(tài)。
用Verilog HDL 語言編寫模塊代碼,為了保證RTL 代碼的正確性,對IP 的功能進行全面的仿真驗證,仿真包括功能驗證和門級仿真,功能仿真不涉及任何時序上的延時,只是單純地驗證代碼所實現(xiàn)的功能是否符合要求。門級仿真是布局布線后仿真,包含了精確的時延參數(shù)。
系統(tǒng)使用的w25x32[7]是Winbond 公司生產(chǎn)的總?cè)萘繛?2 Mbit 的SPI FLASH,一個扇區(qū)(Sector)為4 kbyte,一個塊(Block)為64 kbyte,支持扇區(qū)擦除(Sector Erase),塊擦除(Block Erase)和整片擦除(Chip Erase),支 持 頁 寫 入(Page Program,256 byte),最高時鐘可達75 MHz。
為了測試設(shè)計的正確性,我們用HDL 語言編寫了該SPI FLASH 的模型掛在驗證平臺上,編寫了Testbench模塊,包括產(chǎn)生時鐘信號,控制寄存器的配置,收發(fā)的數(shù)據(jù)和產(chǎn)生中斷等。
本設(shè)計測試的思路是將采用一次完整的FLASH 讀寫來驗證SPI 控制器的功能的完整性,F(xiàn)LASH 要求在頁寫入之前必須對將要寫入的扇區(qū)進行擦除,在執(zhí)行頁寫入和擦除命令之前必須執(zhí)行Write Enable,在執(zhí)行命令之前,先判斷FLAH 是否忙,F(xiàn)LASH 的讀寫順序如圖7所示。
圖7 FLASH 讀寫順序
主要的測試任務(wù)有:
(1)數(shù)據(jù)傳輸測試 測試啟動后寄存器的初值是否正確,對FLASH 進行擦除,頁寫入和讀測試。以及在不同的時鐘分頻數(shù)值下數(shù)據(jù)傳輸是否正確,還有不同模式下的數(shù)據(jù)發(fā)送和接收是否正確。
(2)DMA 測試,將高速SPI模塊掛入系統(tǒng)進行DMA 測試;中斷響應(yīng)測試,測試各種情況下的中斷輸出。
①數(shù)據(jù)傳輸測試
圖8~圖11 是功能仿真的局部圖。
在頁寫入,擦除和Write Status 之前必須執(zhí)行命令Write Enable,SPI 控制器將發(fā)送命令Write Enable(06h)到FLASH。
圖8 高速SPI模塊發(fā)送Write Enable 命令波形圖
圖9 高速SPI模塊發(fā)送Sector Erase 命令波形圖
擦除有Block Erase(D8h),Sector Erase(20h)和Chip Erase(C7h),圖9 是Sector Erase 的波形圖,前8 bit 傳輸?shù)氖敲?0 h,后24 bit 傳輸?shù)氖堑刂贰?/p>
圖10 高速SPI模塊頁寫入波形圖
Page program 前8 bit 發(fā)送的是命令02h,然后24 bit 發(fā)送的是地址,接下來的256個byte 發(fā)送的是將要寫入FLASH 的內(nèi)容。
圖11 高速SPI模塊讀數(shù)據(jù)波形圖
Read data 只要發(fā)送了命令(03h)和地址后,地址會自動的跳到下一個地址,這就意味著只要發(fā)送一次命令和地址,就可以一直往下讀??刂破髟O(shè)置的最大SPI burst 的長度為128個word。
②DMA 測試和中斷響應(yīng)測試
完成了高速SPI IP 的驗證后,接著將高速SPI IP 與ARM11 及DMA模塊進行整合,如圖12,驗證DMA和中斷響應(yīng)。
順利通過了功能測試,利用綜合工具Design Compiler 對RTL 代碼進行綜合,經(jīng)過對腳本約束的設(shè)定,通過DC 將控制器的時序和面積進行優(yōu)化。
圖12 驗證測試系統(tǒng)結(jié)構(gòu)
最后采用Xilinx 公司的Virtex-5 系列[8]的XC5VLX330FF1760-1 芯片進行FPGA 驗證,測試的SPI模塊的傳輸時鐘為66 MHz,測試結(jié)果表明數(shù)據(jù)傳輸?shù)膸掃_到了我們做OSD 的要求,最大數(shù)據(jù)傳輸速率可達35 Mbit/s,速度比遵循SPI 協(xié)議的同類設(shè)計得到了相當(dāng)大的改觀。
表1 SPI模塊設(shè)計比較
實現(xiàn)了高速SPI IP 核的設(shè)計和FPGA 仿真驗證。本設(shè)計著重于高速傳輸設(shè)計,數(shù)據(jù)傳輸采用了簡潔的并串互轉(zhuǎn)結(jié)構(gòu),擴展了FIFO 的容量,一次可最大傳輸27個word,最大傳輸速率可達35 Mbit/s,在遵守SPI 協(xié)議的同類設(shè)計中是較快的了,滿足了OSD 控制模塊的高速要求,因此可以實現(xiàn)對疊加內(nèi)容的動態(tài)更新,在OSD 上做非常華麗的效果。而且是基于APB 接口的設(shè)計,更加方便靈活,便于集成。
[1]張薇.大型云鏡攝像機控制系統(tǒng)設(shè)計及實現(xiàn)[D].南京:南京理工大學(xué),2007.
[2]The I2C-BUS Specification Version2.1[S].2000.7.
[3]M95M01-R,1 Mbit Serial SPI Bus EEPROM with High Speed Clock[R].2008.7.
[4]ANALOG DEVICE 應(yīng)用筆記AN-877,通過SPI 與高速ADC 接口[R].2007.4.
[5]AMBA Specification Revision 2.0[S].ARM Limited,1999.
[6]SPI Block Guide V04.01[S].Freescale Semiconductor,Inc,2000.6.
[7]W225X16,W25X32,W25X64,SPI Flash 16M-BIT,32M-bit,and 64M-BIT Serial Flash Memory with 4KB Sectors and Dual Output SPI[S].Winbond,2007.12.
[8]Virtex-5 User Guide,XILINX[S].2007年9 月.
[9]張桂友,戴慶元.串行外圍接口SPI 功能模塊設(shè)計[J].微處理器,2009,(4):15-20.
[10]王二萍.高速可復(fù)用SPI 總線的設(shè)計與Verilog HDL 實現(xiàn)[D].河南大學(xué),2007.