<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于單片SRAM和FPGA的紅外圖像顯示的設(shè)計(jì)及實(shí)現(xiàn)

          基于單片SRAM和FPGA的紅外圖像顯示的設(shè)計(jì)及實(shí)現(xiàn)

          作者: 時(shí)間:2017-06-05 來源:網(wǎng)絡(luò) 收藏

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

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

          1 系統(tǒng)硬件結(jié)構(gòu)和工作原理

          系統(tǒng)硬件結(jié)構(gòu)圖如圖1所示。本系統(tǒng)中,高速串行LVDS視頻信號經(jīng)Camera Link接收芯片DS90CR285接收轉(zhuǎn)化為并行TTL電平后送給,同時(shí),其他系統(tǒng)的高速串行LVDS格式數(shù)據(jù)也可以直接送至。這些視頻數(shù)據(jù)經(jīng)FPGA進(jìn)行直方圖統(tǒng)計(jì),并存儲在SRAM中。然后,F(xiàn)PGA在存儲間隙讀出SRAM內(nèi)的有效像素?cái)?shù)據(jù),并采用直方圖統(tǒng)計(jì)的參數(shù)對圖像灰度拉伸,然后送至視頻轉(zhuǎn)換芯片ADV7123進(jìn)行D/A轉(zhuǎn)換顯示。


          2 各功能模塊設(shè)計(jì)

          本文引用地址:http://www.ex-cimer.com/article/201706/349173.htm

          2.1 Camera Link接口

          本方案選用DS90CR285將Camera Link格式的4對串行LVDS圖像信號轉(zhuǎn)換成28 bit并行TTL/CMOS的數(shù)據(jù)。根據(jù)Camera Link基本協(xié)議,28 bit數(shù)據(jù)信號中包括3個(gè)數(shù)據(jù)端口:A口(8 bit)、B口(8 bit)、C口(8 bit),和4個(gè)視頻控制信號FVAL(幀有效)、DVAL(數(shù)據(jù)有效)、LVAL(行有效)、SPARE(空,暫時(shí)未用)。經(jīng)過Camera Link芯片轉(zhuǎn)換后的時(shí)鐘信號是整個(gè)相機(jī)的同步驅(qū)動信號,所有的數(shù)據(jù)和視頻控制信號都和該時(shí)鐘信號同步。數(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ù)的行場掃描間隙對單片SRAM進(jìn)行讀寫操作從而完成模擬圖像的顯示功能。直方圖統(tǒng)計(jì)功能在另文中描述。

          本系統(tǒng)中,視頻信號時(shí)鐘為20 MHz,PAL制式信號數(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),存儲寬度為16 bit,存儲深度設(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í)鐘,行有效信號作為FIFO的寫使能,F(xiàn)IFO讀時(shí)鐘為100 MHz,也是SRAM的讀寫時(shí)鐘,通過判斷行下降沿來生成一個(gè)320的計(jì)數(shù)器,并在計(jì)數(shù)器有效期間將FIFO讀使能置為高。FVAL的上升沿作為FIFO的復(fù)位信號。此FIFO的讀寫時(shí)序圖見圖4。


          2.2.2 FIFO_OUT模塊

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

          2.2.3 SRAM讀寫控制模塊

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

          FIFO_IN的讀使能作為SRAM的寫使能,寫地址在寫使能有效期間從SRAM的零地址依次遞增,即地址范圍為0~81 919(320×256-1)。但由于本系統(tǒng)中視頻信號20 ms一幀,PAL制式視頻顯示一幀需要奇場20 ms、偶場20 ms,共40 ms,所以在偶場顯示時(shí)還是在讀SRAM中0~81 919部分的數(shù)據(jù),此時(shí)視頻信號必須寫入SRAM的另外一部分空間,這就要求在奇場和偶場時(shí)寫地址要進(jìn)行切換;或者采用在奇場時(shí)數(shù)據(jù)寫入SRAM,偶場時(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信號有效期間,采用program_empty置高和SRAM的寫使能下降沿的“與”操作作為SRAM讀觸發(fā)信號;在FVAL信號無效期間,SRAM無寫控制,program_empty信號的上升沿將作為SRAM的讀觸發(fā)信號。然后根據(jù)讀觸發(fā)信號生成一個(gè)320的計(jì)數(shù)器,并在計(jì)數(shù)器有效期間將SRAM的讀使能置為高。這樣就能保證SRAM的讀寫不沖突,且數(shù)據(jù)也不會漏寫,控制時(shí)序見圖5。

          PAL制式視頻顯示分為奇場和偶場,因此在奇場時(shí),SRAM的讀地址應(yīng)該滿足:第n行地址范圍為320×(n-1)~319+320×(n-1)(n=1,2……128);偶場時(shí),RAM的讀地址應(yīng)該滿足:第n行地址范圍320×n~319+320×n(n=1,2……128),其讀使能及讀地址的FPGA主要代碼如下:
          //////// sram的讀標(biāo)志位有2種狀態(tài):(1)奇場數(shù)據(jù)有效時(shí)////用寫sram的下降沿‘與’fifo半行標(biāo)志位。(2)奇場數(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;//奇場起始地址
          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的讀使能和讀數(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)行簡單變換,可以記為:

          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ù)使能信號作相應(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ù)緩存、圖像存儲及顯示的功能。隨著FPGA 性能的不斷提高及其靈活的可編程性,設(shè)計(jì)者可以進(jìn)一步在FPGA內(nèi)部實(shí)現(xiàn)各種其他的圖像處理算法。這樣,直接采用FPGA和單片SRAM的方案不但減小了PCB 尺寸,降低了元件數(shù)量及PCB布線的難度,也降低了元件相互連線帶來的信號失真,從而增加了可靠性和穩(wěn)定性。本方案已成功應(yīng)用在本單位的圖像采集和處理產(chǎn)品中。



          關(guān)鍵詞: 紅外圖像顯示 SRAM FPGA

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();