新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 基于單片SRAM和FPGA的紅外圖像顯示的設計及實現

基于單片SRAM和FPGA的紅外圖像顯示的設計及實現

作者: 時間:2017-06-05 來源:網絡 收藏

隨著紅外探測技術的發(fā)展及其在軍事、工業(yè)等領域的廣泛使用,紅外圖像處理算法獲得了廣泛研究。在實際嵌入式紅外圖像處理系統中,為了方便硬件調試和觀察圖像處理的效果,需要在系統中加入圖像顯示模塊。通常視頻數據流需要處理的數據量大,實時性要求高,所以需要高速大容量的存儲器作為圖像數據的緩存。用于圖像數據緩存的存儲器有3種:①同步動態(tài)隨機存取存儲器SDRAM(Synchronous Dynamic RAM),其容量大、速度快、體積小、價格低,但SDRAM的控制邏輯比較復雜,對時序要求也十分嚴格,需要設計專門的SDRAM控制器以完成與SDRAM芯片的接口;②雙口RAM,它可以同時對數據進行讀寫,時序簡單,操作非常方便,但是容量相對較小,而且價格高;③靜態(tài)隨機存取存儲器(Static RAM),它不僅容量大、速度快、體積小、價格低,而且時序控制簡單,但是數據不能同時讀寫,工程中多采用2片做乒乓操作來簡化讀寫控制。針對實際工程中的體積小、成本低、開發(fā)周期短等要求,本文提出一種基于單片的圖像處理及顯示方案,并在實際工程中得到了應用。

本文的初始設計是面向幀頻為50幀/s、16 bit灰度、圖像為320×256像素的紅外圖像輸出顯示,但其設計方案可以應用于不同幀頻、灰度級及圖像大小的圖像顯示。

1 系統硬件結構和工作原理

系統硬件結構圖如圖1所示。本系統中,高速串行LVDS視頻信號經Camera Link接收芯片DS90CR285接收轉化為并行TTL電平后送給,同時,其他系統的高速串行LVDS格式數據也可以直接送至。這些視頻數據經FPGA進行直方圖統計,并存儲在SRAM中。然后,FPGA在存儲間隙讀出SRAM內的有效像素數據,并采用直方圖統計的參數對圖像灰度拉伸,然后送至視頻轉換芯片ADV7123進行D/A轉換顯示。


2 各功能模塊設計

本文引用地址:http://butianyuan.cn/article/201706/349173.htm

2.1 Camera Link接口

本方案選用DS90CR285將Camera Link格式的4對串行LVDS圖像信號轉換成28 bit并行TTL/CMOS的數據。根據Camera Link基本協議,28 bit數據信號中包括3個數據端口:A口(8 bit)、B口(8 bit)、C口(8 bit),和4個視頻控制信號FVAL(幀有效)、DVAL(數據有效)、LVAL(行有效)、SPARE(空,暫時未用)。經過Camera Link芯片轉換后的時鐘信號是整個相機的同步驅動信號,所有的數據和視頻控制信號都和該時鐘信號同步。數據轉換后送入FPGA的時序如圖2。


2.2 FPGA核心功能模塊實現

本設計中視頻數據的處理都在FPGA內實現,其內部功能框圖見圖3。

本文主要討論在FPGA內,利用視頻數據的行場掃描間隙對單片SRAM進行讀寫操作從而完成模擬圖像的顯示功能。直方圖統計功能在另文中描述。

本系統中,視頻信號時鐘為20 MHz,PAL制式信號數據時鐘采用13.5 MHz。為了讓SRAM讀寫時間更加充裕,使用了兩個FIFO模塊作為數據緩沖:FIFO_IN、FIFO_OUT。FIFO_IN用來做SRAM的輸入緩沖器,FIFO_OUT用來做SRAM的輸出緩沖器。FIFO可以通過IP核來實現,存儲寬度為16 bit,存儲深度設置為1.5倍行像素,本系統為1.5×320=480[1-2]。

2.2.1 FIFO_IN模塊

為保證數據讀寫效率,此模塊的讀寫方式需進行合理規(guī)劃,具體為每次往FIFO中寫一行數據,寫完后立刻從FIFO讀一行數據并寫入SRAM。像素時鐘為FIFO的寫時鐘,行有效信號作為FIFO的寫使能,FIFO讀時鐘為100 MHz,也是SRAM的讀寫時鐘,通過判斷行下降沿來生成一個320的計數器,并在計數器有效期間將FIFO讀使能置為高。FVAL的上升沿作為FIFO的復位信號。此FIFO的讀寫時序圖見圖4。


2.2.2 FIFO_OUT模塊

此模塊主要是緩沖灰度拉伸后的視頻數據用于輸出顯示。本系統要求輸出標準的PAL制式的模擬視頻,PAL制式視頻場頻為50 Hz,幀頻為25 Hz。本方案選用專用的圖像DA芯片ADV7123, 該芯片是一款高速的RGB D/A轉換芯片,內部集成有3路10位精度的D/A轉換器,分別用于RGB數字信號的D/A轉換,數據吞吐率可達到330 MS/s,適合高分辨彩色視頻生成。ADV7123提供有3路數字輸入接口(RE9:0]、G[9:0]、B[9:0])以及CRT消隱和同步控制信號(BLANK、SYNC)。標準PAL制式的行場消隱信號和行場同步信號都是標準信號,在FPGA內很容易實現,本文不再論述。實際應用中只需要在需要顯示圖像的正確行場位置,將圖像灰度數據送入G[9:0]通道,即可在lOG端口得到復合視頻信號。同時這些正確行場位置標志信號作為FIFO的輸出使能,輸出時鐘為13.5 MHz,輸入時鐘為100 MHz,輸入使能為灰度拉伸模塊的輸出數據有效信號,輸入數據為灰度拉伸模塊的輸出數據。FVAL的上升沿作為FIFO的復位信號。

2.2.3 SRAM讀寫控制模塊

SRAM作為視頻數據的緩沖區(qū),根據上述時序其容量最好能大于2幀數據,同時為了便于以后擴展,本方案中選用SRAM為CY7C1472BV33,容量為4 M×18 bit。由于SRAM屬于單向存儲器,利用單片SRAM作存儲的難點在于如何將讀寫控制分開。此控制包含2部分:讀寫使能和讀寫地址變換。下面分別從讀和寫來說明這2部分控制的實現。

FIFO_IN的讀使能作為SRAM的寫使能,寫地址在寫使能有效期間從SRAM的零地址依次遞增,即地址范圍為0~81 919(320×256-1)。但由于本系統中視頻信號20 ms一幀,PAL制式視頻顯示一幀需要奇場20 ms、偶場20 ms,共40 ms,所以在偶場顯示時還是在讀SRAM中0~81 919部分的數據,此時視頻信號必須寫入SRAM的另外一部分空間,這就要求在奇場和偶場時寫地址要進行切換;或者采用在奇場時數據寫入SRAM,偶場時不寫入,這樣剛好做到顯示完一幀圖像,下一幀圖像數據就可以覆蓋上一幀圖像的數據,這樣寫地址就一直是從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的寫使能設計要避免與SRAM的讀使能沖突。本方案在FIFO_OUT模塊上設計了一個可編程空標志位program_empty,當fifo數據不足160個時,program_empty置高,PAL制式視頻的行掃描周期為64μs,也就是FIFO_OUT每64 μs被讀一次(一次讀出320個數),這樣只要在64 μs時間內能夠寫入320個數就可以保證下次行掃描能夠從FIFO_OUT取出數據。由于本系統中SRAM的寫使能周期為16.5 μs,因此本方案是將SRAM讀狀態(tài)分2種情況,在FVAL信號有效期間,采用program_empty置高和SRAM的寫使能下降沿的“與”操作作為SRAM讀觸發(fā)信號;在FVAL信號無效期間,SRAM無寫控制,program_empty信號的上升沿將作為SRAM的讀觸發(fā)信號。然后根據讀觸發(fā)信號生成一個320的計數器,并在計數器有效期間將SRAM的讀使能置為高。這樣就能保證SRAM的讀寫不沖突,且數據也不會漏寫,控制時序見圖5。

PAL制式視頻顯示分為奇場和偶場,因此在奇場時,SRAM的讀地址應該滿足:第n行地址范圍為320×(n-1)~319+320×(n-1)(n=1,2……128);偶場時,RAM的讀地址應該滿足:第n行地址范圍320×n~319+320×n(n=1,2……128),其讀使能及讀地址的FPGA主要代碼如下:
//////// sram的讀標志位有2種狀態(tài):(1)奇場數據有效時////用寫sram的下降沿‘與’fifo半行標志位。(2)奇場數據無效時用 fifo半行標志位產生上升沿
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;//奇場起始地址
else if (Hsync_odd_fallage)
ui_sram_read_add = 320;//偶場起始地址
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芯片的讀寫、片選及地址信號:
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的讀使能和讀數據送入灰度拉伸模塊作為數據使能和輸入數據。本方案中,圖像灰度線性拉伸算法表達式為:

式(1)中:Y是拉伸后輸出圖像灰度值;X是SRAM中讀出的數據,為原始圖像16 bit二進制數灰度值;Xmin是輸入圖像數據直方圖統計最小灰度值;Xmax是輸入圖像數據直方圖統計最大灰度值。為保證精度,實際應用中將上述公式進行簡單變換,可以記為:

Q值在上幀結束前直方圖統計模塊已經得到,這樣拉伸運算只需1次減法和乘法運算,得到積左移14 bit后,截取低10 bit就得到拉伸后的灰度值。需要注意的是,截取前要判定乘法是否溢出,如果溢出,結果置為最大灰度值210。本方案中主要通過調用乘法器IP核來完成乘法運算,不同硬件的乘法器延遲時間不同,所以必須要將輸入數據使能信號作相應延遲后,成為輸出使能與乘法器輸出數據同步[3]。經過灰度拉伸后的圖像數據送入FIFO_OUT模塊用于圖像顯示,其中,灰度拉伸模塊的輸出使能及輸出數據作為FIFO_OUT模塊的輸入使能和輸入數據。

該圖像處理方案以FPGA 作為核心控制芯片,采用單片SRAM實現了圖像預處理、數據緩存、圖像存儲及顯示的功能。隨著FPGA 性能的不斷提高及其靈活的可編程性,設計者可以進一步在FPGA內部實現各種其他的圖像處理算法。這樣,直接采用FPGA和單片SRAM的方案不但減小了PCB 尺寸,降低了元件數量及PCB布線的難度,也降低了元件相互連線帶來的信號失真,從而增加了可靠性和穩(wěn)定性。本方案已成功應用在本單位的圖像采集和處理產品中。



評論


相關推薦

技術專區(qū)

關閉