基于單片SRAM和FPGA的紅外圖像顯示的設(shè)計(jì)及實(shí)現(xiàn)
隨著紅外探測(cè)技術(shù)的發(fā)展及其在軍事、工業(yè)等領(lǐng)域的廣泛使用,紅外圖像處理算法獲得了廣泛研究。在實(shí)際嵌入式紅外圖像處理系統(tǒng)中,為了方便硬件調(diào)試和觀察圖像處理的效果,需要在系統(tǒng)中加入圖像顯示模塊。通常視頻數(shù)據(jù)流需要處理的數(shù)據(jù)量大,實(shí)時(shí)性要求高,所以需要高速大容量的存儲(chǔ)器作為圖像數(shù)據(jù)的緩存。用于圖像數(shù)據(jù)緩存的存儲(chǔ)器有3種:①同步動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器SDRAM(Synchronous Dynamic RAM),其容量大、速度快、體積小、價(jià)格低,但SDRAM的控制邏輯比較復(fù)雜,對(duì)時(shí)序要求也十分嚴(yán)格,需要設(shè)計(jì)專門的SDRAM控制器以完成與SDRAM芯片的接口;②雙口RAM,它可以同時(shí)對(duì)數(shù)據(jù)進(jìn)行讀寫,時(shí)序簡(jiǎn)單,操作非常方便,但是容量相對(duì)較小,而且價(jià)格高;③靜態(tài)隨機(jī)存取存儲(chǔ)器SRAM(Static RAM),它不僅容量大、速度快、體積小、價(jià)格低,而且時(shí)序控制簡(jiǎn)單,但是數(shù)據(jù)不能同時(shí)讀寫,工程中多采用2片SRAM做乒乓操作來簡(jiǎn)化讀寫控制。針對(duì)實(shí)際工程中的體積小、成本低、開發(fā)周期短等要求,本文提出一種基于單片SRAM和FPGA的圖像處理及顯示方案,并在實(shí)際工程中得到了應(yīng)用。
本文的初始設(shè)計(jì)是面向幀頻為50幀/s、16 bit灰度、圖像為320×256像素的紅外圖像輸出顯示,但其設(shè)計(jì)方案可以應(yīng)用于不同幀頻、灰度級(jí)及圖像大小的圖像顯示。
1 系統(tǒng)硬件結(jié)構(gòu)和工作原理
系統(tǒng)硬件結(jié)構(gòu)圖如圖1所示。本系統(tǒng)中,高速串行LVDS視頻信號(hào)經(jīng)Camera Link接收芯片DS90CR285接收轉(zhuǎn)化為并行TTL電平后送給FPGA,同時(shí),其他系統(tǒng)的高速串行LVDS格式數(shù)據(jù)也可以直接送至FPGA。這些視頻數(shù)據(jù)經(jīng)FPGA進(jìn)行直方圖統(tǒng)計(jì),并存儲(chǔ)在SRAM中。然后,F(xiàn)PGA在存儲(chǔ)間隙讀出SRAM內(nèi)的有效像素?cái)?shù)據(jù),并采用直方圖統(tǒng)計(jì)的參數(shù)對(duì)圖像灰度拉伸,然后送至視頻轉(zhuǎn)換芯片ADV7123進(jìn)行D/A轉(zhuǎn)換顯示。
2 各功能模塊設(shè)計(jì)
2.1 Camera Link接口
本方案選用DS90CR285將Camera Link格式的4對(duì)串行LVDS圖像信號(hào)轉(zhuǎn)換成28 bit并行TTL/CMOS的數(shù)據(jù)。根據(jù)Camera Link基本協(xié)議,28 bit數(shù)據(jù)信號(hào)中包括3個(gè)數(shù)據(jù)端口:A口(8 bit)、B口(8 bit)、C口(8 bit),和4個(gè)視頻控制信號(hào)FVAL(幀有效)、DVAL(數(shù)據(jù)有效)、LVAL(行有效)、SPARE(空,暫時(shí)未用)。經(jīng)過Camera Link芯片轉(zhuǎn)換后的時(shí)鐘信號(hào)是整個(gè)相機(jī)的同步驅(qū)動(dòng)信號(hào),所有的數(shù)據(jù)和視頻控制信號(hào)都和該時(shí)鐘信號(hào)同步。數(shù)據(jù)轉(zhuǎn)換后送入FPGA的時(shí)序如圖2。
2.2 FPGA核心功能模塊實(shí)現(xiàn)
本設(shè)計(jì)中視頻數(shù)據(jù)的處理都在FPGA內(nèi)實(shí)現(xiàn),其內(nèi)部功能框圖見圖3。
本文主要討論在FPGA內(nèi),利用視頻數(shù)據(jù)的行場(chǎng)掃描間隙對(duì)單片SRAM進(jìn)行讀寫操作從而完成模擬圖像的顯示功能。直方圖統(tǒng)計(jì)功能在另文中描述。
本系統(tǒng)中,視頻信號(hào)時(shí)鐘為20 MHz,PAL制式信號(hào)數(shù)據(jù)時(shí)鐘采用13.5 MHz。為了讓SRAM讀寫時(shí)間更加充裕,使用了兩個(gè)FIFO模塊作為數(shù)據(jù)緩沖:FIFO_IN、FIFO_OUT。FIFO_IN用來做SRAM的輸入緩沖器,F(xiàn)IFO_OUT用來做SRAM的輸出緩沖器。FIFO可以通過IP核來實(shí)現(xiàn),存儲(chǔ)寬度為16 bit,存儲(chǔ)深度設(shè)置為1.5倍行像素,本系統(tǒng)為1.5×320=480[1-2]。
2.2.1 FIFO_IN模塊
為保證數(shù)據(jù)讀寫效率,此模塊的讀寫方式需進(jìn)行合理規(guī)劃,具體為每次往FIFO中寫一行數(shù)據(jù),寫完后立刻從FIFO讀一行數(shù)據(jù)并寫入SRAM。像素時(shí)鐘為FIFO的寫時(shí)鐘,行有效信號(hào)作為FIFO的寫使能,F(xiàn)IFO讀時(shí)鐘為100 MHz,也是SRAM的讀寫時(shí)鐘,通過判斷行下降沿來生成一個(gè)320的計(jì)數(shù)器,并在計(jì)數(shù)器有效期間將FIFO讀使能置為高。FVAL的上升沿作為FIFO的復(fù)位信號(hào)。此FIFO的讀寫時(shí)序圖見圖4。
2.2.2 FIFO_OUT模塊
此模塊主要是緩沖灰度拉伸后的視頻數(shù)據(jù)用于輸出顯示。本系統(tǒng)要求輸出標(biāo)準(zhǔn)的PAL制式的模擬視頻,PAL制式視頻場(chǎng)頻為50 Hz,幀頻為25 Hz。本方案選用專用的圖像DA芯片ADV7123, 該芯片是一款高速的RGB D/A轉(zhuǎn)換芯片,內(nèi)部集成有3路10位精度的D/A轉(zhuǎn)換器,分別用于RGB數(shù)字信號(hào)的D/A轉(zhuǎn)換,數(shù)據(jù)吞吐率可達(dá)到330 MS/s,適合高分辨彩色視頻生成。ADV7123提供有3路數(shù)字輸入接口(RE9:0]、G[9:0]、B[9:0])以及CRT消隱和同步控制信號(hào)(BLANK、SYNC)。標(biāo)準(zhǔn)PAL制式的行場(chǎng)消隱信號(hào)和行場(chǎng)同步信號(hào)都是標(biāo)準(zhǔn)信號(hào),在FPGA內(nèi)很容易實(shí)現(xiàn),本文不再論述。實(shí)際應(yīng)用中只需要在需要顯示圖像的正確行場(chǎng)位置,將圖像灰度數(shù)據(jù)送入G[9:0]通道,即可在lOG端口得到復(fù)合視頻信號(hào)。同時(shí)這些正確行場(chǎng)位置標(biāo)志信號(hào)作為FIFO的輸出使能,輸出時(shí)鐘為13.5 MHz,輸入時(shí)鐘為100 MHz,輸入使能為灰度拉伸模塊的輸出數(shù)據(jù)有效信號(hào),輸入數(shù)據(jù)為灰度拉伸模塊的輸出數(shù)據(jù)。FVAL的上升沿作為FIFO的復(fù)位信號(hào)。
2.2.3 SRAM讀寫控制模塊
SRAM作為視頻數(shù)據(jù)的緩沖區(qū),根據(jù)上述時(shí)序其容量最好能大于2幀數(shù)據(jù),同時(shí)為了便于以后擴(kuò)展,本方案中選用SRAM為CY7C1472BV33,容量為4 M×18 bit。由于SRAM屬于單向存儲(chǔ)器,利用單片SRAM作存儲(chǔ)的難點(diǎn)在于如何將讀寫控制分開。此控制包含2部分:讀寫使能和讀寫地址變換。下面分別從讀和寫來說明這2部分控制的實(shí)現(xiàn)。
FIFO_IN的讀使能作為SRAM的寫使能,寫地址在寫使能有效期間從SRAM的零地址依次遞增,即地址范圍為0~81 919(320×256-1)。但由于本系統(tǒng)中視頻信號(hào)20 ms一幀,PAL制式視頻顯示一幀需要奇場(chǎng)20 ms、偶場(chǎng)20 ms,共40 ms,所以在偶場(chǎng)顯示時(shí)還是在讀SRAM中0~81 919部分的數(shù)據(jù),此時(shí)視頻信號(hào)必須寫入SRAM的另外一部分空間,這就要求在奇場(chǎng)和偶場(chǎng)時(shí)寫地址要進(jìn)行切換;或者采用在奇場(chǎng)時(shí)數(shù)據(jù)寫入SRAM,偶場(chǎng)時(shí)不寫入,這樣剛好做到顯示完一幀圖像,下一幀圖像數(shù)據(jù)就可以覆蓋上一幀圖像的數(shù)據(jù),這樣寫地址就一直是從0~81 919,不需要切換。本方案采用后者,其寫使能及寫地址的FPGA主要代碼如下:
//SRAM寫使能
always @(posedge SRAM_CLK)
if (!rst_n | (sram_write_counter==319))
ui_sram_write = 0;
else if(LVAL_fallage)
ui_sram_write = 1;//SRAM寫地址切換
always @(posedge SRAM_CLK)
if (!rst_n | Hsync_odd_riseage)
ui_sram_write_add = 0;//起始地址
else if (ui_sram_write)
ui_sram_write_add = ui_sram_write_add + 1;
SRAM的寫使能設(shè)計(jì)要避免與SRAM的讀使能沖突。本方案在FIFO_OUT模塊上設(shè)計(jì)了一個(gè)可編程空標(biāo)志位program_empty,當(dāng)fifo數(shù)據(jù)不足160個(gè)時(shí),program_empty置高,PAL制式視頻的行掃描周期為64μs,也就是FIFO_OUT每64 μs被讀一次(一次讀出320個(gè)數(shù)),這樣只要在64 μs時(shí)間內(nèi)能夠?qū)懭?20個(gè)數(shù)就可以保證下次行掃描能夠從FIFO_OUT取出數(shù)據(jù)。由于本系統(tǒng)中SRAM的寫使能周期為16.5 μs,因此本方案是將SRAM讀狀態(tài)分2種情況,在FVAL信號(hào)有效期間,采用program_empty置高和SRAM的寫使能下降沿的“與”操作作為SRAM讀觸發(fā)信號(hào);在FVAL信號(hào)無效期間,SRAM無寫控制,program_empty信號(hào)的上升沿將作為SRAM的讀觸發(fā)信號(hào)。然后根據(jù)讀觸發(fā)信號(hào)生成一個(gè)320的計(jì)數(shù)器,并在計(jì)數(shù)器有效期間將SRAM的讀使能置為高。這樣就能保證SRAM的讀寫不沖突,且數(shù)據(jù)也不會(huì)漏寫,控制時(shí)序見圖5。
PAL制式視頻顯示分為奇場(chǎng)和偶場(chǎng),因此在奇場(chǎng)時(shí),SRAM的讀地址應(yīng)該滿足:第n行地址范圍為320×(n-1)~319+320×(n-1)(n=1,2……128);偶場(chǎng)時(shí),RAM的讀地址應(yīng)該滿足:第n行地址范圍320×n~319+320×n(n=1,2……128),其讀使能及讀地址的FPGA主要代碼如下:
//////// sram的讀標(biāo)志位有2種狀態(tài):(1)奇場(chǎng)數(shù)據(jù)有效時(shí)////用寫sram的下降沿‘與’fifo半行標(biāo)志位。(2)奇場(chǎng)數(shù)據(jù)無效時(shí)用 fifo半行標(biāo)志位產(chǎn)生上升沿
always @(posedge SRAM_CLK)
if (!rst_n)
ui_sram_read_flag = 0;
else begin
if ((FVAL_d | ui_sram_write_5d) Hsync_odd )
ui_sram_read_flag = ui_sram_write_fallage
fifo_sram_adv7123_prom_empty_d;
else
ui_sram_read_flag=fifo_sram_adv7123_prom_empty_riseage;
end
//// SRAM讀地址切換
always @(posedge SRAM_CLK)
if (!rst_n | Hsync_odd_riseage)
ui_sram_read_add = 0;//奇場(chǎng)起始地址
else if (Hsync_odd_fallage)
ui_sram_read_add = 320;//偶場(chǎng)起始地址
else if (ui_sram_read_fallage)
ui_sram_read_add = ui_sram_read_add+320;
else if (ui_sram_read)
ui_sram_read_add = ui_sram_read_add+1;
最后通過下面的賦值給出了SRAM芯片的讀寫、片選及地址信號(hào):
assign SRAM_read_write_en=~(ui_sram_write Hsync_odd);
//SRAM讀寫使能
assign SRAM_CE=~(ui_sram_read | ui_sram_write);
//SSRAM片選
assign SRAM_ADD=(ui_sram_write)?ui_sram_write_add:
ui_sram_read_add;//SSRAM地址
2.2.4 灰度拉伸
將SRAM的讀使能和讀數(shù)據(jù)送入灰度拉伸模塊作為數(shù)據(jù)使能和輸入數(shù)據(jù)。本方案中,圖像灰度線性拉伸算法表達(dá)式為:
式(1)中:Y是拉伸后輸出圖像灰度值;X是SRAM中讀出的數(shù)據(jù),為原始圖像16 bit二進(jìn)制數(shù)灰度值;Xmin是輸入圖像數(shù)據(jù)直方圖統(tǒng)計(jì)最小灰度值;Xmax是輸入圖像數(shù)據(jù)直方圖統(tǒng)計(jì)最大灰度值。為保證精度,實(shí)際應(yīng)用中將上述公式進(jìn)行簡(jiǎn)單變換,可以記為:
Q值在上幀結(jié)束前直方圖統(tǒng)計(jì)模塊已經(jīng)得到,這樣拉伸運(yùn)算只需1次減法和乘法運(yùn)算,得到積左移14 bit后,截取低10 bit就得到拉伸后的灰度值。需要注意的是,截取前要判定乘法是否溢出,如果溢出,結(jié)果置為最大灰度值210。本方案中主要通過調(diào)用乘法器IP核來完成乘法運(yùn)算,不同硬件的乘法器延遲時(shí)間不同,所以必須要將輸入數(shù)據(jù)使能信號(hào)作相應(yīng)延遲后,成為輸出使能與乘法器輸出數(shù)據(jù)同步[3]。經(jīng)過灰度拉伸后的圖像數(shù)據(jù)送入FIFO_OUT模塊用于圖像顯示,其中,灰度拉伸模塊的輸出使能及輸出數(shù)據(jù)作為FIFO_OUT模塊的輸入使能和輸入數(shù)據(jù)。
該圖像處理方案以FPGA 作為核心控制芯片,采用單片SRAM實(shí)現(xiàn)了圖像預(yù)處理、數(shù)據(jù)緩存、圖像存儲(chǔ)及顯示的功能。隨著FPGA 性能的不斷提高及其靈活的可編程性,設(shè)計(jì)者可以進(jìn)一步在FPGA內(nèi)部實(shí)現(xiàn)各種其他的圖像處理算法。這樣,直接采用FPGA和單片SRAM的方案不但減小了PCB 尺寸,降低了元件數(shù)量及PCB布線的難度,也降低了元件相互連線帶來的信號(hào)失真,從而增加了可靠性和穩(wěn)定性。本方案已成功應(yīng)用在本單位的圖像采集和處理產(chǎn)品中。
評(píng)論