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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于FPGA的LCoS驅(qū)動及圖像FFT變換系統(tǒng)設(shè)計

          基于FPGA的LCoS驅(qū)動及圖像FFT變換系統(tǒng)設(shè)計

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

          基于空間光調(diào)制器的計算技術(shù), 目前常采用透射式LCD 和反射式LCo S 作為空間光調(diào)制器, 以改變光經(jīng)過空間光調(diào)制器( SLM) 后的空間相位和振幅分布, 達(dá)到對光信息的調(diào)制。傳統(tǒng)的基于透射式LCD 空間光調(diào)制器的計算系統(tǒng), 其成像光路復(fù)雜, 而且必須依賴計算機(jī)進(jìn)行數(shù)據(jù)發(fā)生、采集以及處理, 這就限制了系統(tǒng)應(yīng)用的靈活性, 不便于推廣。

          相較于透射式LCD, LCo S 具有光利用率高、體積小、開口率高、器件尺寸小等特點, 可以很容易地實現(xiàn)高分辨率和微顯示投影。采用彩色LCoS 屏顯示基于RGB 的彩色圖像, 經(jīng)過光學(xué)成像系統(tǒng)投影到接收屏上,實現(xiàn)計算全息圖像的三維顯示。

          基于 的顯示系統(tǒng)有以下優(yōu)勢: 第一, LCoS尺寸小, 便于實現(xiàn)微投影, 利用可靈活編程的 器件作為驅(qū)動控制器, 這樣就可以將其做成像普通投影儀一樣的微型投影設(shè)備, 使計算擺脫了計算機(jī)和復(fù)雜光路的束縛, 具有了更高的靈活性, 為其走出實驗室提供了條件。第二, 因為在傳統(tǒng)空間光調(diào)制器上得到的圖像里含有物波和參考光的復(fù)共軛像, 形成了噪聲, 在 上可以實現(xiàn)圖像濾波去噪, 使得到的圖像更清晰。第三, FPGA 是基于可編程邏輯單元的器件,當(dāng)經(jīng)過綜合、布局布線、時鐘約束的代碼燒錄到FPGA器件后, FPGA 就將算法代碼硬件化了, 可以作為專用芯片工作, 其內(nèi)部信號延時完全是硬件級傳輸延時。在處理數(shù)據(jù)搬移和復(fù)雜的數(shù)學(xué)運算以及一些循環(huán)操作時,例如圖像的FFT 變換, FPGA 硬件運算要比軟件運算快得多, 即利用FPGA 器件實現(xiàn)對軟件算法的硬件加速。

          基于以上原因, 本文設(shè)計了基于FPGA 的LCoS 驅(qū)動代碼及圖像的FFT 變換系統(tǒng), 為計算全息三維顯示圖像處理和顯示提供了硬件平臺。

            1 系統(tǒng)設(shè)計

          1. 1 系統(tǒng)模塊框圖

          該系統(tǒng)采用cy clone EP3C5E144C8, 該芯片有5 136 個LE, 95 個用戶I/ O, 2 個PLL, 以及46 個嵌入式乘法器和423 936 b 的內(nèi)部邏輯寄存器。以它豐富的資源, 完全可以作為LCoS 的驅(qū)動控制器件。顯示屏采用Himax 的反射式LCoS 屏HX7308, 其分辨率為1 024 768, 可以支持256 級灰度顯示, 具有內(nèi)置的行場驅(qū)動電路, 在外部輸入時鐘的上升沿和下降沿分別接收8 b 4 dot s圖像數(shù)據(jù), 這保證了場頻可高達(dá)360 Hz。

          系統(tǒng)的整體框圖如圖1 所示。

          圖1 系統(tǒng)框圖

          1. 2 PLL 及系統(tǒng)復(fù)位模塊

          采用Alter a 的鎖相環(huán)IP 核, 外部輸入時鐘為20 MHz, 經(jīng)倍頻后得到其他各模塊的驅(qū)動時鐘, 以及LCo S 的驅(qū)動時鐘信號。為防止系統(tǒng)異步復(fù)位時寄存器出現(xiàn)亞穩(wěn)態(tài), 設(shè)計了PLL 的前級和后級D 觸發(fā)器。

          因為鎖相環(huán)的lo cked 引腳在鎖相環(huán)穩(wěn)定輸出后才會跳變?yōu)楦唠娖剑?所以為保證其他模塊得到穩(wěn)定的時鐘信號, 將locked 引腳和外部輸入復(fù)位信號rst_n 相與后作為整個系統(tǒng)的復(fù)位信號。

          1. 3 單口ROM 模塊

          利用FPGA 內(nèi)部的M9K 存儲器資源實現(xiàn)的單口ROM 作為源圖像的數(shù)據(jù)存儲器。將分辨率為176144( QCIF) 的256 階灰度位圖圖像初始化到單口ROM里, 所需數(shù)據(jù)深度為25 344 B。當(dāng)異步FIFO 沒寫滿時, 單口ROM 將按圖像存儲地址依次輸出圖像數(shù)據(jù)給FFT 核做快速傅里葉變換。經(jīng)過處理的圖像數(shù)據(jù)暫存到FIFO 里, 等待行場時序控制器模塊取用。

          1. 4 異步FIFO 模塊

          按其數(shù)據(jù)地址最高2 位分為4 個區(qū)間, 讀/ 寫指針分別對某一區(qū)間操作, 當(dāng)讀/ 寫指針相等時通過譯碼器產(chǎn)生FIFO 已讀空或者已寫滿標(biāo)志信號。為避免地址信號變化時出現(xiàn)冒險競爭現(xiàn)象, 寫地址和讀地址指針都采用格雷碼編碼。在讀空比較子模塊和寫滿比較子模塊里加入了FIFO “將空”和“ 將滿”檢驗機(jī)制, 有效地保證了FIFO 正確無誤的工作。在寫時鐘w rclk 的上升沿, 異步FIFO 每個地址對應(yīng)的存儲單元里被寫入8bit s 數(shù)據(jù), 在讀時鐘rdclk 的上升沿, FIFO 四塊連續(xù)地址上的32bit s 數(shù)據(jù)輸出, 即讀FIFO 的速率相當(dāng)于寫FIFO 速率的4 倍速。

          1. 5 I2 C 狀態(tài)機(jī)模塊

          沒有滿足I2C 配置條件時, 狀態(tài)機(jī)處于空閑狀態(tài),當(dāng)滿足I2C 配置條件時, 狀態(tài)機(jī)在狀態(tài)標(biāo)志位的控制下依次輸出配置地址和配置數(shù)據(jù)。當(dāng)數(shù)據(jù)配置結(jié)束時, 狀態(tài)機(jī)產(chǎn)生停止信號, 并拉高輸出引腳iic_co nf ig, 通知行場時序控制器模塊開始工作, 這樣保證了LCo S 屏能在正確配置下工作。狀態(tài)機(jī)工作原理如圖2 所示。

          圖2 I2 C 狀態(tài)機(jī)原理圖

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

            1. 6 行場時序控制器模塊

          內(nèi)設(shè)水平計數(shù)器hcnt 和垂直計數(shù)器vcnt。由于顯示屏每個時鐘周期鎖存8 個像素值, 所以顯示1 024 個像素值所需行周期為128 個Tclk( 行時鐘周期) 。當(dāng)hcnt 計數(shù)器值為HBP 時表示行有效顯示區(qū)域開始,hcnt 計數(shù)器值為HBP+ 128 時表示行有效顯示區(qū)域結(jié)束, hcnt 計數(shù)器值為HSYNC cy cle 時, 完成一行顯示,vcnt 計數(shù)器加1。當(dāng)v cnt 計數(shù)器值為VBP 時, 垂直有效顯示區(qū)域開始, 當(dāng)vcnt 計數(shù)器值為VBP+ 768 時, 垂直有效顯示區(qū)域結(jié)束, 當(dāng)vcnt 計數(shù)器值為VSYN C cycle 時, 完成一幀圖像顯示。行場時序關(guān)系如圖3 所示。

          圖3 行場時序關(guān)系圖

          1. 7 FFT 模塊

          FFTV 9. 1 IP 核采用Coo leyT ukey 基??2 DIF 算法, 其FFT 變換原始公式為:

          因為采用了數(shù)據(jù)流模式, 經(jīng)過變換的數(shù)據(jù)可以連續(xù)輸出, 即輸出數(shù)據(jù)不會因為圖像數(shù)據(jù)的輸入而停止數(shù)據(jù)輸出, 同時輸入數(shù)據(jù)也不會因為處理后的數(shù)據(jù)正在輸出而停止繼續(xù)輸入, 保證了數(shù)據(jù)轉(zhuǎn)換和傳輸?shù)倪B續(xù)性, 提高了數(shù)據(jù)處理的速度和效率。因為FFT 通過異步FIFO 向屏幕輸出數(shù)據(jù), 而FIFO 的讀數(shù)據(jù)是寫數(shù)據(jù)的4 倍速, 假如讀時鐘和寫時鐘都為100 MHz, 那么有可能會在某一行里出現(xiàn)FIFO 被取空, 而無法向屏幕輸出有效數(shù)據(jù)的情況。為保證FIFO 向屏幕輸出圖像數(shù)據(jù)的連續(xù)性, 就要充分利用VBP, VFP, HBP 和HFP 的時間, 在每一行的開始, 如果FIFO 沒滿, 那么啟動FFT進(jìn)行數(shù)據(jù)轉(zhuǎn)換。若圖像的分辨率為M N 并且在VBP期間FIFO 已被寫滿, 則FIFO, FFT 核、行場周期以及圖像分辨率間關(guān)系的計算公式如下:

          式中: Deepth 是異步FIFO 的數(shù)據(jù)深度, 單位為B;THSYN C cycle是行周期; Tclk 是異步FIFO, FFT 核、行場時序控制器模塊的驅(qū)動時鐘周期。當(dāng)△> 0 時, 系統(tǒng)會連續(xù)實時地處理圖像; 當(dāng)△ 0 時, 會導(dǎo)致在屏幕某些行的有效顯示區(qū)域沒有有效圖像數(shù)據(jù)可供顯示, 這樣就破壞了圖像顯示的連續(xù)性??筛鶕?jù)以上公式合理設(shè)計FIFO 深度以及選取合適分辨率的圖像。該設(shè)計中, 異步FIFO, FFT 核、行場時序控制器模塊的驅(qū)動時鐘為100 MHz, FIFO 深度為256 B, 行周期為336 個Tclk ,M 為174, N 為144, 經(jīng)計算△> 0。

          2 實驗仿真結(jié)果和測量結(jié)果分析


          圖4 是采用Modelsim 6. 5b 進(jìn)行功能仿真的結(jié)果。

          利用QuartusV9. 1 自帶的TimeQuest Timing Analyzer進(jìn)行時序約束后, 在實驗板上的場信號測量結(jié)果如圖5所示, 場掃描頻率已達(dá)到368 Hz, 經(jīng)測量其他引腳輸出信號也均滿足時序要求。由于FPGA 器件資源限制, 對圖像做了256 點FFT 變換, 經(jīng)實驗驗證, 該設(shè)計能夠?qū)崿F(xiàn)圖像的實時處理, 代碼達(dá)到了預(yù)期設(shè)計效果。

          圖4 系統(tǒng)功能仿真

          圖5 場信號實測圖

            3 結(jié)語

          采用Himax 的LCoS 屏HX7308BTJFA 作為顯示器件, 其尺寸為14. 43 mm 10. 69 mm, 大小可跟1 枚1 元硬幣相比擬, 很容易實現(xiàn)三維投影微顯示。因Verilog HDL 有很強(qiáng)的可移植性, 便于以后對代碼的升級和維護(hù)。FPGA 內(nèi)部資源畢竟有限, 文中敘述可知, 若顯示分辨率較大的圖像, 光靠內(nèi)部資源實現(xiàn)異步FIFO是不可能的, 所以在此提出兩種方案: 第一, 換一片性能較高的芯片, 滿足寫FIFO 速率等于讀FIFO 速率的要求, 這樣就能達(dá)到讀/ 寫數(shù)據(jù)的動態(tài)平衡, 保證了圖像的連續(xù)顯示; 第二, 采用外部存儲器SDRAM 存儲源圖像和FFT 處理后的數(shù)據(jù), 采用 技術(shù)讀取數(shù)據(jù), 使讀/ 寫FIFO 的速率匹配。受FPGA 芯片資源限制, 該設(shè)計采用分辨率為176 144 的圖像進(jìn)行了系統(tǒng)功能驗證, 尚未實現(xiàn)圖像濾波以及FFT 逆變換, 未來可將代碼移植在高端的FPGA 芯片上繼續(xù)開發(fā)數(shù)據(jù)處理功能。



          關(guān)鍵詞: DDRII 全息三維顯示 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); })();