摘 要: 提出了一種在FPGA上實現(xiàn)視頻圖像處理" title="視頻圖像處理">視頻圖像處理器分系統(tǒng)與系統(tǒng)之間的數據串行通信設計方法,,采用UART串行數據傳輸協(xié)議,,傳輸波特率可設置調整,采用視頻場同步信號作為發(fā)送器" title="發(fā)送器">發(fā)送器發(fā)送控制信號,,實現(xiàn)視頻圖像處理的實時性要求,。串口" title="串口">串口采用雙口" title="雙口">雙口RAM實現(xiàn)與視頻圖像處理部分的異步通信,。設計中大量采用參數化設計,,使用靈活,、通用性強,可實現(xiàn)FPGA與一般串口通信系統(tǒng)通信,。設計程序下載到FPGA芯片中,通信數據完全正確,電路工作穩(wěn)定,、可靠,。
關鍵詞: FPGA;Verilog HDL,;UART,;雙口RAM;視頻圖像
在視頻圖像處理系統(tǒng)中,諸如圖像相減等操作,處理的數據量很大,對處理速度的要求很高,但算法結構相對簡單,,適合用FPGA進行硬件實現(xiàn),。由于FPGA的開發(fā)具有很強的靈活性,因此,,可以利用FPGA的資源,,在芯片上實現(xiàn)視頻圖像處理的串口通信功能,從而簡化了電路,,縮小了體積,,提高了可靠性,并且在使用上有很大的靈活性,。
1 總體概述
在FPGA上實現(xiàn)視頻圖像處理器分系統(tǒng)與系統(tǒng)之間的數據串行通信,,采用UART串行數據傳輸協(xié)議,通信的傳輸波特率,、FPGA系統(tǒng)時鐘頻率" title="時鐘頻率">時鐘頻率均采用參數化設計,,可滿足不同系統(tǒng)主頻和傳輸波特率要求。分系統(tǒng)發(fā)送接收有幀頭,、幀尾,,用來判斷數據接收的正確性。數據格式為一個起始位低電平0,,8個數據位數,,一個停止位高電平1,一個數據串為10位,??傮w結構如圖1所示,。
為解決串口與視頻圖像部分的異步通信問題,采用了在FPGA上產生雙口RAM實現(xiàn)串口與視頻圖像處理部分的對接,。雙口RAM就是存儲數據共享的存儲器,,配備兩套獨立的地址、數據和控制線,,允許兩個獨立的CPU或控制器同時異步地訪問存儲單元,,特別適合異步處理器之間的異步高速通信。雙口RAM的存儲空間大小和數據地址位數均采用參數化設計,,使得雙口RAM的存儲空間大小可根據實際應用需要進行調整,,增加了串口使用的靈活性和通用性。
在視頻圖像處理中,,為滿足實時性要求,,一次圖像處理在一場圖像時間中完成,故可用視頻場同步信號作為串口發(fā)送器發(fā)送控制信號,。PAL電視制式規(guī)定,,場掃描頻率為50Hz,一幀圖像分為奇數場和偶數場,。
2 結構功能設計
2.1 波特率發(fā)生器
波特率發(fā)生器如圖2所示,。
rst_n:系統(tǒng)復位信號
clk:系統(tǒng)時鐘頻率
clk_16x:輸出波特率(傳輸波特率時鐘頻率的16倍)
串口在接收數據時,理想的采樣點是在數據位的中間,。為了對串行數據位進行精確采樣,,可對數據位時間進行分段,分段數越大,,則采樣點越靠近中間點,,但同時也增加了系統(tǒng)的開銷。在設計應用中,,采用了16倍時間分段,。
串口的接收和發(fā)送是按照相同的波特率進行的,波特率發(fā)生器產生的時鐘頻率不是波特率時鐘頻率,,而是波特率時鐘頻率的16倍(即一個傳輸位的寬度為16個clk_16x時鐘周期),。可以根據給定的系統(tǒng)時鐘頻率和要求的波特率算出波特率計數值,。假設系統(tǒng)時鐘頻率為40MHz,,要求的傳輸波特率為115 200b/s,則可產生Counter=(Clk_frequency/(2*16*Baud_rate))-1,,即對clk計數到Counter時對clk_16x進行翻轉一次,。在程序設計中,采用參數化設計,可根據應用要求改變波特率大小,。
parameter Clk_frequency=40000000,,
//系統(tǒng)時鐘頻率40MHz
Baud_rate=115200,
//要求傳輸波特率值115 200b/s
Counter=(Clk_frequency/(2*16*Baud_rate))-1,,Width=7,;
//能夠存儲Counter值的二進制形式所需的位數
2.2 帶雙口RAM的發(fā)送器
帶雙口RAM的發(fā)送器模塊如圖3所示。
Data_out:串行輸出
Vs: 發(fā)送控制信號(視頻場同步信號)
Cs: 雙口RAM的片選信號
Wren: 雙口RAM的寫使能信號
Addr: 雙口RAM的地址線
Data: 雙口RAM的數據線
串口發(fā)送器采用雙口RAM與視頻圖像處理部分對接,,視頻圖像處理部分將并行數據發(fā)送到雙口RAM中,,然后,在發(fā)送控制信號(視頻場同步信號)的控制下,,由串口發(fā)送器將雙口RAM中的并行數據讀出來,,并轉為串行數據發(fā)送出去。
為簡化串口發(fā)送器對雙口RAM的控制,采用了將雙口RAM和發(fā)送器做到一個模塊中的方式,。因此,,對發(fā)送器而言,雙口RAM就相當于一個內部存儲器,,可以直接對其進行讀寫操作,而不需要額外的存儲器控制端口和數據傳輸接口,。
視頻圖像處理部分對雙口RAM的發(fā)送數據過程與對一般的存儲器操作過程類似,,就是根據控制端口將數據寫到雙口RAM中。部分程序如下(程序中采用參數化設計,,可以改變雙口RAM的大?。?nbsp;
parameter width=5,//發(fā)送器雙口RAM地址位數
number=30,;//發(fā)送器雙口RAM存儲字節(jié)大小
input[width-1:0] Addr,;//發(fā)送器雙口RAM數據的地址
reg[7:0] memory[number-1:0];//發(fā)送器雙口RAM
always @(posedge Wren)//對雙口RAM寫入并行數據,, wren為上升沿有效
begin
if(Cs==1′b0)
begin
memory[Addr]<=Data,;
end
end
發(fā)送器從發(fā)送控制信號(場同步信號)Vs到來開始,隔16個clk_16x周期輸出1位數據,,順序為1位起始位,,8位數據位和1位停止位,數據位為從低位到高位發(fā)送形式,。發(fā)送器采用狀態(tài)機風格進行描述,,共分為5個狀態(tài):空閑狀態(tài)S0、開始狀態(tài)S1,、等待狀態(tài)S2,、移位狀態(tài)S3、停止狀態(tài)S4。
在狀態(tài)機轉換過程中,需要一位寄存器變量來判斷要發(fā)送的數據是否已發(fā)送完, 以確保一個場同步信號只對雙口RAM中的number字節(jié)數據發(fā)送一遍,。
系統(tǒng)一旦復位,,發(fā)送器就進入S0狀態(tài),同時對一位寬寄存器型變量num置0,。
空閑狀態(tài)S0:在此狀態(tài)完成初始化工作,,即對所要用到的寄存器賦初值(包括雙口RAM的數據讀出地址addr_cnt清0),且將串行輸出Data_out置為高電平,。當Vs有效(場同步期間)且num==0成立時,,進入S1狀態(tài)。在Vs無效期間,,將num置0,,且繼續(xù)在S0狀態(tài)。
開始狀態(tài)S1:給出起始位低電平0,,即將Data_out置0,,同時將當前addr_cnt地址的數據從雙口RAM中讀出并存入發(fā)送移位寄存器shift_reg,系統(tǒng)進入S2狀態(tài),。
等待狀態(tài)S2:在此狀態(tài),,每次等待16個clk_16x,即:保證每位的寬度位16個clk_16x時鐘周期,,包括起始位等待在內,,要等待9次,其中,,數據位等待為8次,。若等待次數在9次以內,則轉入S3狀態(tài),,否則,,轉入S4狀態(tài)。
移位狀態(tài)S3:將shift_reg[0]賦給Data_out,,同時實現(xiàn)從高位到低位移位,。進入S2狀態(tài)。
停止狀態(tài)S4:給出停止位高電平1,,即將Data_out置為高電平,,且計滿16個clk_16x。然后,,判斷是否已將memory[number-1:0]中的number個字節(jié)的數據都輸出,,若沒有,就轉入S1狀態(tài)繼續(xù)輸出,,否則,,就進入S0空閑狀態(tài),,同時將num置1。
2.3 帶雙口RAM的接收器
帶雙口RAM的接收器模塊如圖4所示,。
Data_in 串行輸入
Cs_rd 雙口RAM的片選信號
Rd 雙口RAM的讀使能信號
addr_rd 雙口RAM的地址線
Data_rd 雙口RAM的數據線
串口接收器采用雙口RAM與視頻圖像處理部分對接,,接收器將接收到的串行數據轉換為并行數據并將其存儲到雙口RAM中。視頻圖像處理部分在進行數據處理時則可根據雙口RAM的控制端口將并行數據讀出并進行處理,,其讀出數據過程與在發(fā)送器中寫數據過程類似,。
在接收一個串行數據幀的起始位時,是由邏輯1轉為邏輯0來判斷的,。為了避免毛刺(周期很短)的影響,,能夠得到正確的起始位信號,必須要求接收到的起始位至少有1/4都是屬于邏輯0才可認定接收到的是起始位,。因為波特率發(fā)生器產生的時鐘頻率為接收串行數據波特率的16倍,所以計數4次就可以去除毛刺的影響,。
接收器采用狀態(tài)機風格進行描述,共分為5個狀態(tài):開始狀態(tài)S0,、延遲狀態(tài)S1,、等待狀態(tài)S2、移位狀態(tài)S3,、停止狀態(tài)S4,。
系統(tǒng)復位后,對所要用到的寄存器初始化,,進入S0狀態(tài),。
開始狀態(tài)S0: 如果串口輸入Data_in為0且維持4個clk_16x,就判斷起始位信號(低電平)到來,,進入S1狀態(tài)。
延遲狀態(tài)S1:計數4次clk_16x,,再加上S0狀態(tài)已經計數的4次,,共8次。因為接收器采用的時鐘clk_16x為波特率的16倍,,所以一個串行位有16個clk_16x 時鐘周期,,則計數8次可以保證采樣點在起始位電平的中間。進入S2狀態(tài),。
等待狀態(tài)S2:計數16次clk_16x,,即:采樣點在下一個串行位的中間。然后,,判斷是否已經移位了8次,,若沒有,則轉入S3狀態(tài),;否則,,轉入S4狀態(tài),。
移位狀態(tài)S3:將串行輸入Data_in賦給內部移位寄存器的最高位shift_reg1[7],同時實現(xiàn)shift_reg1從高位向低位移位一次,。進入S2狀態(tài),。
停止狀態(tài)S4:將shift_reg存到雙口RAM中。判斷是否已將需要接收的數據個數接收完,,若沒有,,則在雙口RAM中的存儲地址自動累加,否則,,雙口RAM中的存儲地址清0,。進入S0狀態(tài)。
3 仿真驗證
在實驗中,,選用了Altera公司的Cyclone系列EP1C12024017芯片,,采用Verilog HDL語言進行描述,用QuartusII5.1進行綜合,、仿真,。仿真中,先進行各個模塊的仿真,,然后采用自發(fā)自收方式仿真,,即將發(fā)送器的發(fā)送輸出串口和接收器的接收輸入串口直接連接,比較接收到的數據是否和發(fā)送的一樣,。仿真結果表明,,串口的接收和發(fā)送工作完全正確。圖5,、圖6給出了波特率發(fā)生器仿真波形和自發(fā)自收方式仿真波形,。將程序下載到芯片中運行,通信數據完全正確,,電路工作穩(wěn)定,、可靠。
本設計采用雙口RAM實現(xiàn)串口與視頻圖像處理部分的異步通信,。設計中大量采用參數化設計,,雙口RAM的存儲空間大小、傳輸波特率和系統(tǒng)主頻均可根據實際使用要求靈活調整,;通用性強,,只需將發(fā)送器的場同步發(fā)送控制信號改為所要求的發(fā)送控制信號,就可實現(xiàn)FPGA與一般串口通信系統(tǒng)通信,。
參考文獻
[1] 王誠,,吳繼華.Altera FPGA/CPLD設計.北京:人民郵電出版社,2005.
[2] 張兆揚.工業(yè)電視.北京:科學出版社,,1982.
[3] 蘇光大.微機圖像處理系統(tǒng).北京:清華大學出版社,,2000.
[4] 賀前華.基于FPGA的視頻轉換系統(tǒng)的實現(xiàn).微電子學與計算機,,2003,(5).
[5] Henry Chang,,Larry Cooke.Surviving the SOC Revolution-A Guide to Platform-Based Design.Kluwer Academic Publishers,,1999.