小序:
前幾天看全國大學生電子設計競賽曆年試題,無意間發現了一道題目《簡易數字頻率計》,跟之前我用verilog寫的一個頻率計差不多,于是想嘗試做一下,題目具體要求如下圖中所示,我所用的開發闆為 xilinx spartan 3es, 最後結果還算理想,在要求的範圍内的頻率測量精度比較高,但是由于闆子的限制沒能實作脈沖寬度測量等功能,但是其原理比較簡單,下文中将會給出設計過程,結果展示圖檔以及整個工程代碼的下載下傳連結。
數字頻率計總體設計采用分塊的思想,自底向上設計方向,三個子子產品包括頻率測量子產品(fre_meter),二進制到十進制轉換的子產品(bin_dec)和數位管顯示子產品(led),最後用一個頂層子產品(top)把三個子子產品例化到一起。總體設計思路就是先通過測頻子產品測得的頻率值然後通過進制轉換子產品将頻率值轉換為十進制數,最後再輸入給顯示子產品顯示出該頻率值。
下圖為子產品示意圖(實際工程中并沒有采用原理圖的輸入方法,有種感覺ise中原理圖輸入方法總會産生各種錯誤,這裡僅作示意)。
下面分子產品說明:
fre_meter: 測頻子產品,設計思路完全根據之前我寫的一篇博文《verilog編寫數字頻率計》,隻是稍作修改,這裡不再重複
輸入 clk:系統時鐘信号 50mhz rst_n:低電平異步複位 clk_in : 被測時鐘頻率。
輸出 fre: 20bit位寬的頻率值,可以滿足題目中要求的 1mhz的要求
bin_dec: 進制轉換子產品,二進制數轉換為十進制 ,之前寫的一篇部落格《利用verilog将二進制碼轉換為十進制bcd碼》其中隻涉及到了8bit轉換,本設計中待測最高頻率1m,轉換為二進制數為1111_0100_0010_0100_0000 ,之前的8bit轉換思路沒法搬到20bit轉換中來用,是以尋找其他思路,後來在一個論壇中找到了16bit轉換的代碼,網址 ,經過修改後可以實作20bit二進制數到10進制的轉換。
具體轉換思路如下,位寬為20bit的二進制數最大為1111_1111_1111_1111_1111,轉換為十進制為1048575,那麼對于輸入的二進制數hex,輸出十進制數fre從百萬位到各位分别為 million , hunthousand , tenthousand , thousand , hundred , ten , one。首先對比hex是否大于999999,如果是那麼轉換為十進制後的第七位million為1,然後另d1=hex-1000000,如果hex不大于999999,那麼 million =0,d1=hex。
下面判斷第六位hunthousand ,依次先後判斷d1是否大于899999 、799999、699999......99999,假設d1>899999 ,那麼 hunthousand=9,d2=d1-900000;如果d1>799999 ,那麼 hunthousand=8,d2=d1-800000 ........依次類推逐一求得十進制數的每一位(具體設計見代碼)。
輸入 clk: 系統時鐘信号50mhz
rst:低電平異步複位
hex:20bit二進制頻率值
輸出 million , hunthousand , tenthousand , thousand , hundred , ten , one: 4bit位寬的頻率值,代表十進制頻率值的不同位
led: 數位管顯示子產品,數位管做動态顯示利用人眼的對顯示頻率的敏感限度,八段數位管在一定頻率下切換指派,每一個時鐘對一個數位管單獨指派并顯示,切換頻率大于一定值後,看起來像8位數位管同時顯示(具體設計見代碼)。
輸入 clk: 系統時鐘信号50mhz
million , hunthousand , tenthousand , thousand , hundred , ten , one:
4bit位寬的頻率值,代表十進制頻率值的不同為位
輸出 sel: 8bit 數位管位選信号
data:8bit數位管譯碼顯示的值
測試結果:
下圖為頻率計的測試結果,上面一排為信号發生器輸入的待測試脈沖的頻率,下面一排為對應的頻率計的測試結果,可以看出本設計的測量精度完全可以滿足題目的要求,但是由于裝置的限制,沒能實作正弦波的測試,以及脈沖寬度的測試等等功能,但是我覺得原理基本和本設計中的測頻子產品相同。
本設計的ise 工程下載下傳位址 ,積分不夠用朋友可以給我發郵件。