系統(tǒng)總體設計方案
Nios II處理器在SDRAM中開辟幀緩沖(Frame buffer),可以是單緩沖也可以是雙緩沖,。以單緩沖為例,。處理器將一幀圖像數(shù)據(jù)(640×480×2Bytes,RGB565,,16bit)存入幀緩沖,,然后將幀緩沖的首地址寫入到LCD控制器,并啟動LCD控制器,。該控制器自動從傳來的首地址處開始讀取數(shù)據(jù),,并按照TFT的格式輸出。圖中各模塊由AvalON Bus連接在一起,。Avalon Bus是一種簡單的總線結(jié)構(gòu),,Nios II處理器和各種外設都是通過Avalon Bus連接在一起,。由圖1可以看出,作為Slaver的SDRAM Controller分別要受到Processor 和LCD Controller的控制,,為了解決總線沖突,,Avalon Bus自動在有沖突的接口上加入了Arbitrator這樣一個仲裁模塊,用于合理分配總線時間,,用戶通過改變每個模塊的權(quán)值來改變對其分配總線時間的多少,。在這個系統(tǒng)中,SDRAM Controller是影響整個系統(tǒng)性能的關鍵,。以SDRAM時鐘頻率為100MHz計算,,16bit的SDRAM其數(shù)據(jù)總帶寬為200MByte/s,640×480×2Bytes×60Hz的TFT LCD要占用36MByte/s左右的帶寬,,這對于還要處理其他任務的處理器來說是很大的影響,。
本系統(tǒng)的總體設計框圖如圖1所示。
圖1 系統(tǒng)框圖
LCD控制器的FPGA實現(xiàn)
Avalon Bus Slaver從總線接口模塊實現(xiàn)
Avalon從總線接口負責處理器與LCD控制器的接口控制,,LCD控制器在整個系統(tǒng)中作為從設備,,NIOS II通過該接口對控制寄存器進行設置,控制LCD,。
LCD從模塊有四個32bit的可讀寫寄存器,,用于控制LCD控制器的工作和指示其工作狀態(tài)。
Avalon Bus DMA Master主設備接口模塊實現(xiàn)
Avalon Bus DMA MaSTer負責按照控制模塊的指令,,讀取SDRAM中的數(shù)據(jù),,并寫入到FIFO中,其核心部分是DMA地址累加器,。當條件滿足時,,地址累加器開始在100MHz的時鐘下以4為單位開始累加用于生成讀取SDRAM的地址。讀完一幀的數(shù)據(jù)后,,自動復位到首地址,,繼續(xù)累加。
主設備接口采用帶延遲的主設備讀傳輸模式,,在這種傳輸模式下,,即使沒有接收到上一次的有效數(shù)據(jù),主設備也可以發(fā)起下一次讀命令,。當waitrequest信號無效(低電平)時,,主設備可以連續(xù)的發(fā)起讀命令,當waitrequest信號有效(高電平)時,,主設備開始等待,,直到其變?yōu)榈碗娖健.攔eaddatavalid信號有效(高電平)時,表示讀數(shù)據(jù)有效,,此時主設備可以鎖存數(shù)據(jù)口上的有效數(shù)據(jù),。這里沒有使用flush信號,flush信號會清除前面一切未完成的讀命令,。Avalon總線保證數(shù)據(jù)的輸出順序與主設備要求的順序一致(即與主設備地址輸出順序一致),。readdatavalid信號可以作為FIFO的wrreq信號,這樣可以直接將讀出來的數(shù)據(jù)寫入到FIFO中,。當前地址等于尾地址時,,則復位累加器,使之重新開始從首地址累加,。地址累加器代碼模塊如圖3,。
圖2 LCD BSF圖
圖3 設備接口模塊BSF圖
FIFO模塊實現(xiàn)
FIFO的作用是對DMA輸出的圖像數(shù)據(jù)進行緩存,以匹配時序控制模塊的輸出速度,。FIFO大小暫定為4096×16bit,,在實際設計時,再根據(jù)系統(tǒng)需要以及資源狀況做出適當調(diào)整,。原則是,,在系統(tǒng)資源允許的情況下,將FIFO大小盡量設置大點,。
FIFO由DMA控制器寫入數(shù)據(jù),,寫入時鐘為100MHz,;由LCD控制器的時序發(fā)生模塊讀出數(shù)據(jù),,讀出時鐘為PCLK,即LCD的像素點掃描頻率,,通常取25MHz,。在獨立的寫時鐘和讀時鐘作用下,F(xiàn)IFO可以提供rdusedw[11:0]信號,,用于指示FIFO中已經(jīng)使用掉的容量,。系統(tǒng)可以設置一個上限和一個下限,當FIFO中的數(shù)據(jù)量高于上限或低于下限時,,控制器暫停DMA傳輸或啟動DMA傳輸,,用以保證系統(tǒng)性能。
在本例應用中,,將wrclk接系統(tǒng)時鐘(100MHz),,wrreq接master_readdatavalid,data接writedata,,即可完成DMA的數(shù)據(jù)寫入操作,;將rdclk接12.5MHz(因為TFT的時鐘為25MHz,數(shù)據(jù)寬度為16bit,,而FIFO的寬度為32bit,,所以用一半的時鐘12.5MHz去讀取FIFO,,然后依次輸出32bit的高16bit和低16bit),rdreq由時序發(fā)生模塊控制,,即可在每個rdclk的上升沿讀出一個數(shù)據(jù)到q,。aclr接~reset_n,可以完成復位操作,。當然,,所有信號都受controller_GoBit的控制。
FIFO設計采用了Quartus II自帶的fifo宏模塊,,自動生成所需要的模塊,,供調(diào)用。
LCD 時序發(fā)生器設計模塊實現(xiàn)
時序發(fā)生器用于產(chǎn)生TFT所需的時序,,將圖像數(shù)據(jù)按特定的時序輸出,。每種控制器的設計關鍵就是時序設計,本文專門針對三菱公司的AA084VC05液晶屏,,圖4,,圖5是其時序圖。
圖4 水平時序圖
圖5 垂直時序圖
LCD時序發(fā)生器以DCLK為時鐘基準,,該DCLK即上面所說的PCLK,,也就是像點時鐘,每個像素點的數(shù)據(jù)以該時鐘驅(qū)動進入LCD,。圖4為AA084VC05的水平掃描時序,,其中,DATA為18位數(shù)據(jù)信號(本設計中只用其中的16位),,DENA為數(shù)據(jù)有效信號,,高電平使能,其有效寬度THA為640個DCLK,;HD為水平同步信號,,低電平有效,其有效寬度TWHL為96個DCLK,。一行640個象素掃描完畢之后,,控制器將驅(qū)動HD有效,在HD有效之前插入THFP(Horizontal Front Porch)為16個DCLK,,有效之后插入THBP(Horizontal Back Porch)為144個DCLK,,然后再開始下一行的掃描。如此一來,,行掃描信號的頻率FH典型值為31.5KHz,。而讀FIFO信號要提前DENA信號一個時鐘節(jié)拍到來,提前一個時鐘節(jié)拍結(jié)束,因為該FIFO有一個時鐘節(jié)拍的延遲,。
AA084VC05的垂直掃描時序與水平掃描時序類似,,該時序以HD為時鐘基準,其中,,VD為垂直同步信號(幀同步),。每掃描完一幀(480行),控制器將驅(qū)動VD有效(低電平),,有效寬度TWVL為2個HD,。同樣,在VD有效之前插入TVFP(Vertical Front Porch)為10個HD,,有效之后插入TVBP(Vertical Back Porch)為35個HD,,如此一來,垂直掃描信號頻率FV的典型值為60Hz,。
時序發(fā)生器采用狀態(tài)機實現(xiàn),。由于該控制器的參數(shù)比較大,為了便于觀察仿真結(jié)果,,本文對這些參數(shù)做了一些處理(成倍減少),。
結(jié)語
本文設計實現(xiàn)了一個簡單的基于Avalon總線的TFT LCD控制器,能實現(xiàn)640×480,,顏色深度為16bit的彩色圖形顯示,,可應用于各種TFT LCD,亦可改寫為VGA控制器,,有較大的靈活性,。根據(jù)設計好的控制器編寫了相應的Linux下的FrAME buffer驅(qū)動程序。很好的實現(xiàn)了界面環(huán)境的開發(fā),,可以用于很多手持設備的電子產(chǎn)品,。該設計最大的特點是有很強的可移植性,,不論是控制器的設計還是Frame buffer驅(qū)動程序的設計都很靈活,。