李奇,劉宇紅,金海陸
(貴州大學 理學院,貴州 貴陽 550025)
SOPC是Altera公司提出來的一種靈活、高效的SOC解決方案,它是一種特殊的嵌入式系統(tǒng):首先它是片上系統(tǒng)SOC;其次它是可編程系統(tǒng),具有靈活的設計方式,可裁剪、可擴充、可升級,并具備軟硬件在系統(tǒng)可編程的功能。NIOS II是由硬件描述語言編寫的基于FPGA的軟核CPU。NIOS II嵌入式處理器不僅提供更高的性能、更低的成本,還提供了齊全的軟件開發(fā)工具以及系統(tǒng)靈活性設計。本文將結合Nios II處理器的總線架構,分析SD卡的接口協議和驅動程序設計方法;由于FPGA片內的存儲資源可能滿足不了系統(tǒng)的設計需求,在設計中使用了片外SDRAM作為程序存儲和數據存儲器。通過SOPC中的Avalon總線接口與Nios II處理器和SDRAM控制器通信,構建了基于Nios II的SOPC,使之能顯示圖片格式為JPEG的圖像 ,并實現各種控制操作,能較好的模擬類似于引擎的操作,并給出基于Nios II處理器的設計實例。
Avalon總線模塊是系統(tǒng)模塊的主干,是SOPC設計中外設之間通信的主要通道。Avalon總線模塊由各類控制、數據和地址信號以及仲裁邏輯組成,它將系統(tǒng)模塊的外設連接起來,并描述了主從構件的端口連接關系,以及構件間通信的時序關系。以構成可編程片上系統(tǒng)(SOPC)[1],Avalon總線系統(tǒng)結構如圖1所示。
圖1 Avalon總線系統(tǒng)結構Fig.1 Avalon-bus system architecture
Avalon總線模塊是一種可配置的總線結構,它可以隨著用戶的不同互聯要求而改變。Nios II處理器的片內系統(tǒng)互聯主要靠的就是Avalon總線,Nios II處理器和各外設之間都是通過Avalon總線進行交互。Avalon定義了5種不同的傳輸方式,包括從端口傳輸、主端口傳輸、流水線讀傳輸、流傳輸控制和三態(tài)傳輸。本文僅分析和討論SD卡設備所使用的從端口傳輸方式。
一個Nios II處理器系統(tǒng)可以說是包含了一個可配置CPU軟核、FPGA片上存儲器和片外存儲器、外設以及外設接口等的一個片上可編程系統(tǒng),所有的Nios II處理器系統(tǒng)都用同一的指令和編程模式[6]。一個典型的Nios II處理器系統(tǒng)如圖2所示。
圖2 NIOS II處理器系統(tǒng)Fig.2 NIOS II processor system
Nios II處理器系統(tǒng)[2]根據不同用戶的要求,其設計類型也不同,在設計中,CPU為主要部件,需要強大的性能,除了實現Nios II處理器系統(tǒng)外,剩下的邏輯資源可以用作粘貼和邏輯使用;而在另一些設計中,Nios II處理器系統(tǒng)只占FPGA一小部分資源,性能要求不高,剩下的邏輯資源可實現主要的邏輯功能。在這些系統(tǒng)中,如果用戶邏輯需要和Nios II處理器系統(tǒng)相互通信,用戶邏輯可以直接掛在片內的Avalon總線上。Nios II是一個可靈活配置的軟核處理器,是用戶根據自己設計的性能或成本要求,靈活的增加或裁剪一些系統(tǒng)特性和外設。用戶甚至可以在系統(tǒng)中放置多個Nios II處理器內核,以滿足應用的要求。本設計中由于要處理圖片信息,故選用的是快速型內核“Nios II/f”。其系統(tǒng)架構如圖3所示。
圖3 系統(tǒng)架構Fig.3 system architecture
本設計中根據Nios II處理器系統(tǒng)配置的SOPC系統(tǒng)如圖4所示。
圖4 SOPC系統(tǒng)Fig.4 SOPC system
由此產生的設計原理圖模塊如圖5所示。
圖5 原理圖模塊Fig.5 Schematic module
SD卡(SecureDigitalMemoryCard)是一種常見的存儲器件,以FlashMemory為存儲體,SD卡允許兩個可選的通信協議:SD模式和SPI模式。文中所研究的是SPI協議下的SD卡設計。
在SPI模式下,SD卡支持單塊的或是多塊的寫操作,在接收到一個合法的寫指令時,SD卡件響應一個應答標記的等待主控制器發(fā)送這個數據塊。
圖6 單個塊的讀取操作Fig.6 Single block read operation
在SPI模式下,SD卡支持單塊的或是多塊的寫操作[3],在接收到一個合法的寫指令時,SD卡將響應一個應答標記和等待主控制器發(fā)送這個數據塊。
圖7 單個塊的寫入操作Fig.7 Single block write operation
SPI模式下SD卡引腳定義如表1所示。
表1 SD卡引腳定義Tab.1 SD card pin configuration
SPI總線允許通過 DI(數據輸入)和 DO(數據輸出)兩個通道傳輸數據,數據為串行模式,每8位數據為一組。輸入數據和輸出數據在SCLK的上升沿是鎖存。SD卡的復位、初始化、寫操作和讀操作等都是通過DI端口發(fā)送SPI命令進行控制的,SPI命令由 6個字節(jié)組成,其格式如表2所示。
表2 SPI命令格式Tab.2 SPI command format
字節(jié)1由“命令號+0x40”組成。例如,CMD55,55的16進制為 0x37,0x37+0X40=0X77,二進制為 01110111。
字節(jié)2-5為命令參數,共32為寬度。有些命令有參數,有些命令沒有參數。對于沒有參數的命令可以直接置0x00、0x00、0x00、0x00、0x00。
字節(jié)6為“CRC校驗位+停止位”,對于SPI模式下的命令不需要進行CRC校驗,可直接置為0xff。
本設計中使用到的命令如下:
SPI內核集成在SOPC Builder內部,SPI內核的結構如圖8所示。
圖8 SPI內核結構Fig.8 SPI core construction
由圖可知,SPI內核的接口信號有兩條數據線、一條同步時鐘和一條控制線,它們分別表示如下。
Master Out Slave In(mosi):主設備輸出數據到從設備的數據線。
Master In Slave Out(miso):從設備輸出數據到主設備的數據線。
Serial Clock(SCLK):主設備與從設備之間的數據同步時鐘。
Slave Select(SS_n):主設備驅動選擇從設備的選擇信號,低電平時有效。
SPI內核有 5 個存儲器應像的寄存器:rxdata、txdata、status、control和slaveselect。寄存器提供了用戶與SPI內核的設計接口,SPI內核支持流傳輸,設計中與DMA控制器相連接。
在 Nios II中,Alter提供了一個函數 int alt_avalon_spi_command(),該函數提供了對配置為主設備的SPI內核的通用接口訪問,該函數原型為[4]:
int alt_avalon_spi_command(alt_u32 base, alt_u32 slave,alt_u32 write_length, const alt_u8 * write_data,alt_u32 read_length, alt_u8*read_data,alt_u32 flags);
調用該函數可以寫一個或多個字節(jié)的數據到數據緩沖區(qū)并通過mosi端口發(fā)送,然后從miso端口讀回一個或多個字節(jié)的數據。
函數的參數說明如下。
alt_u32 base:選擇主設備
alt_u32 slave:選擇從設備,0為第一個從設備,1為第二個從設備,以此類推。
alt_u32 write_length:設置主設備發(fā)送數據的字節(jié)數。
const alt_u8*write_data:待發(fā)送緩沖數據,函數將數組中的數據依次發(fā)出。
alt_u32 read_length:設置主設備接收數據的字節(jié)數。
alt_u8*read_data:接收的數據緩沖。
alt_u32 flags:如果從不連續(xù)的數據緩沖區(qū)發(fā)送數據,可以多次調用該函數,每次指明訪問的合并標志(merge flag),則訪問從設備之后不會釋放從設備,即SS_n為低電平。如果flag=0,則訪問從設備之后會釋放從設備,即SS_n為高電平。
本設計中使用Nios II軟核對TFT-LCD進行驅動時,片內的存儲器資源滿足不了系統(tǒng)的設計需求,因此在設計中將使用片外SDRAM作為程序存儲器和數據存儲器。
SDRAM控制器內核為FPGA片外的SDRAM提供了一個Avalon_MM接口,可以使用SDRAM控制器將片外的SDRAM芯片連接到自定制的Nios II系統(tǒng)中。如圖9所示為SDRAM控制器內核與片外SDRAM芯片連接的框圖。
圖9 SDRAM控制器內核與外設的連接Fig.9 SDRAM controller core and peripherals connection
LCD控制器主要由Avalon總線接口、寄存器組、控制模塊,DMA、FIFO以及時序生成模塊組成。每個寄存器獨立編址。處理器通過Avalon總線讀寫寄存器,從而完成對LCD控制器工作狀態(tài)的設定與控制??刂破鲉雍?,DMA Master通過Avalon總線讀取SDRAM中的數據,然后存入FIFO中,外部的SDRAM控制器在每一場的開始都會清空FIFO,然后保持FIFO中有數據(但不溢出)可供當前顯示。在每次FIFO讀請求信號有效后,相應的FIFO輸出數據也會送到該模塊內部進行鎖存。時序生成模塊按照TFT時序要求從FIFO中讀取數據,然后送出去顯示。由于DMA讀取的速度與TFT時序發(fā)生器輸出的速度不一致,所以在DMA與TFT時序發(fā)生器之間加入FIFO用來緩沖數據,DMA由控制模塊控制其工作,控制器不斷檢測FIFO狀態(tài),當FIFO快滿是,暫停DMA,當FIFO快空時,重新啟動DMA,如此循環(huán),保證顯示畫面的連續(xù)性與穩(wěn)定性。
設計中利用取模軟件將圖片格式為JPEG的圖像轉化成從上到下、從左到右的RGB像素點色彩數據[5],然后將這些數據以并行的方式傳遞給LCD顯示,器驅動原理如圖10所示。
圖10 LCD驅動原理Fig.10 LCD drive
本設計中使用的LCD有一個16位的數據接口,設定要顯示的點的XY坐標,以及顯示什么顏色。觸摸屏為4線式觸摸觸摸屏,四線觸摸屏包含兩個阻性層。其中一層在屏幕的左右邊緣各有一條垂直總線,另一層在屏幕的底部和頂部各有一條水平總線,為了在X軸方向進行測量,將左側總線偏置為0 V,右側總線偏置為VREF。將頂部或底部總線連接到ADC,當頂層和底層相接觸時即可作一次測量。為了在Y軸方向進行測量,將頂部總線偏置為VREF,底部總線偏置為0 V。將ADC輸入端接左側總線或右側總線,當頂層與底層相接觸時即可對電壓進行測量。
設計中使用軟件編程的方法實行控制,利用C程序在觸摸屏中的相應的位置畫上相應的控制圖標。
基于NIOS II軟核處理器的設備驅動設計方案具有良好的穩(wěn)定性與靈活性,可以按照設計者的需要去設計每個細節(jié),使整個系統(tǒng)結構清晰明朗,設計比較靈活,設計中深刻的理解了FPGA的體系結構與各部件協同的工作方式。設計中成功的實現的圖片格式為JPEG圖像的顯示與控制。并對SD卡的接口協議與LCD顯示有了較深刻的理解。
[1]孫愷,程世恒.NiosⅡ系統(tǒng)開發(fā)設計與實例》[M].北京:北京航空航天大學出版社,2007.
[2]赫建國,倪德克,鄭燕.基于Nios II內核的FPGA電路系統(tǒng)設計[M].北京:電子工業(yè)出版社,2010.
[3]王黎明,陳雙嬌,閆曉玲,等.ARM9嵌入式系統(tǒng)開發(fā)與實踐[M].北京:北京航空航天大學出版社,2008.
[4]Altera Corporation.Nios II softerware developer’Handbook[S].2009.
[5]吳厚航.愛上FPGA開發(fā)-特權同學和你一起學NIOS II[M].北京:北京航空航天大學出版社,2011.
[6]Altera Corporation.Nios II processor reference handbook[S].2009.