用一個(gè)時(shí)鐘在FPGA中計(jì)算直方圖
直方圖對(duì)數(shù)字?jǐn)?shù)據(jù)的分析通常是一種有用的工具。不過(guò),要從一個(gè)直方圖獲得可靠的結(jié)果,必須獲得大量數(shù)據(jù),通常是要10萬(wàn)到100萬(wàn)個(gè)點(diǎn)。如果需要分析一個(gè)ADC的數(shù)字輸出,可以采用一片FPGA(圖1)。
圖中顯示了直方圖、RAM和脈沖發(fā)生器部分,用于捕捉和顯示基于14 位數(shù)據(jù)計(jì)算出來(lái)的直方圖。RAM塊是FPGA的內(nèi)置RAM,而直方圖塊是用于計(jì)算的VHDL(高級(jí)設(shè)計(jì)語(yǔ)言)代碼?! ?lái)自ADC的14 位并行數(shù)據(jù)Device_ Data[13..0]進(jìn)入直方圖塊,并進(jìn)入RAM的Rd_Addr輸入端。RAM在其地址位置RAMDataOut[ 15..0]上提供數(shù)據(jù)。這個(gè)數(shù)據(jù)環(huán)回到直方圖塊,將其加1后送至一個(gè)16 位數(shù)據(jù)的輸出端DataOut[15..0]。當(dāng)WREN(寫(xiě)使能)端為邏輯電平1時(shí),數(shù)據(jù)被寫(xiě)在管腳Wr_Addr[13..0]處的地址。這種方法與數(shù)據(jù)來(lái)自Device_Data[13..0]是相同的。
RAM從輸入到輸出有一個(gè)固定的延遲。即,當(dāng)輸入為Rd_Addr時(shí),經(jīng)過(guò)一個(gè)固定延遲后,數(shù)據(jù)出現(xiàn)在其輸出端RAMDataOut。這個(gè)延遲隨不同FPGA而改變。要注意這個(gè)延遲,使得有兩個(gè)時(shí)鐘的延遲到Device_Data,然后再計(jì)算直方圖。RAM中的延遲應(yīng)小于兩個(gè)時(shí)鐘周期;否則,就可能有數(shù)據(jù)丟失。這個(gè)約束限制了Device_Clk的最大頻率。
Cntr_Value給出了用于計(jì)算直方圖的輸入數(shù)據(jù)數(shù)量。Pulse_Gen塊產(chǎn)生一個(gè)脈沖,進(jìn)入輸入端Rst_Cntr,用于復(fù)位計(jì)數(shù)器。此時(shí),直方圖部分再次用Cntr_Value的下組輸入數(shù)據(jù)計(jì)算直方圖。Cntr_Value為15 位,但可以增加它,獲得更多的直方圖數(shù)據(jù)。
Sel_Data與Rst_RAM信號(hào)是重置在FPGA RAM中存儲(chǔ)的數(shù)據(jù)。當(dāng)Rst_RAM腳出現(xiàn)高信號(hào)時(shí),直方圖塊的DataOut腳的所有位均為0。當(dāng)直方圖塊的Sel_Data輸入腳為高信號(hào)時(shí),RAM_Wr_Addr的輸出不是Device_Data,而是一個(gè)從0上升至16384的內(nèi)部生成的斜波。直方圖塊不做計(jì)算,因?yàn)檫@樣做會(huì)重置RAM的地址。
圖1,直方圖計(jì)算電路從一個(gè)FPGA的RAM塊中獲取數(shù)據(jù)。
當(dāng)FPGA完成了直方圖計(jì)算時(shí),RAM就可以選擇Sel_ Data為邏輯高,而將保持Rst_ RAM為邏輯低,從而讀取直方圖數(shù)據(jù)。RAM地址中的數(shù)據(jù)順序地退出輸出腳,并且可以將數(shù)據(jù)傳輸給一臺(tái)PC。由于所有塊都以一個(gè)單時(shí)鐘Device_Clk工作,因此本設(shè)計(jì)很簡(jiǎn)單,有助于滿(mǎn)足時(shí)序的約束??梢苑奖愕匦薷谋驹O(shè)計(jì),從而獲得16 位或12 位數(shù)據(jù)直方圖。
評(píng)論