配套FPGA開發板(含該設計的工程代碼):https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-4676525296.4.6e8950ed57YPhv&id=17848039135
-
設計要求
利用FPGA設計一個信號測頻器,要求:
(1)測量脈沖信號;
(2)頻率測量1-10MHz以及占空比10%-99% 精確到1%;
(3)將測出頻率和占空比顯示在LCD1602上;
-
設計方案
FPGA設計主要分為三個大模塊來設計:1.被測信號產生模塊;2.被測信號檢測模塊;3.數字顯示模塊。設計框圖如圖 1所示。
-
被測信號產生模塊
該模塊主要是用來產生被測信號,可以在模塊中設置被測信號的頻率和占空比。采用的方法是對系統時鍾進行計數分頻產生被測信號。這部分也采用了一個PLL,輸出一個100MHz的時鍾作為檢測模塊的采樣時鍾。該部分涉及的模塊:signal_gen模塊和PLL模塊。
-
被測信號檢測模塊
該模塊對被測信號進行檢測的方法是等精度測頻法:
(1)被測信號頻率檢測
檢測被測信號的頻率,通過在外部使能信號有效時(即一段時間內),計數系統時鍾脈沖數Ns與被測信號脈沖數Nd,若系統時鍾頻率為Fs,被測信號頻率為Fd,則有Fs/Ns=Fd/Nd 最后有Fd=(Fs/Ns)·Nd。
(2)被測信號占空比檢測:
檢測被測信號的占空比,利用系統時鍾,在外部使能信號有效時(即一段時間內),計數被測信號的正脈寬數Np和負脈寬數Nn,則占空比ducy=Np/(Np+Nn)*100%。
該部分涉及的模塊:signal_detect模塊。
-
數字顯示模塊
該模塊主要分為兩個部分:一個部分是把檢測的頻率碼轉換為十進制BCD碼,采用這種方法雖然會提高運算時間,但卻可以大大節省FPGA的資源(面積與速度的折衷);另外一個部分是驅動LCD1602進行顯示。這里給出二進制碼轉換為十進制BCD碼的幾個步驟(以8bit二進制碼為例): 1.將二進制碼左移一位(或者乘2);2.找到左移后的碼所對應的個,十,百位;3.判斷在個位,十位和百位的碼是否大於等於5;4.繼續重復以上三步直到移位8次后停止;5.如果是則該段碼加3。該部分涉及的模塊:BCD2to10模塊和lcd1602模塊。
最終在FPGA的RTL視圖如圖 2所示:
圖 2 基於FPGA的信號測頻器的RTL視圖
-
仿真測試
對設計進行Modelsim仿真測試,仿真采用一個近似於1MHz、占空比近似於50%的信號進行測試。在仿真中,我們可以發現經過檢測之后的頻率為980392Hz,占空比為49%。BCD轉換模塊分別每一位提取了出來,供LCD1602顯示。如圖 3所示。
圖 3 Modelsim仿真測試
-
板級實驗
對設計進行板級實驗,采用的FPGA是大西瓜的Logic3 FPGA開發套件。實驗結果如圖 4所示。在誤差允許范圍內,LCD1602可以准確把被測信號的頻率及占空比顯示出來。這里注意的是,由於為了檢測到1Hz的信號,故設計中延長了LCD顯示的刷新周期,所以在一開始LCD顯示屏會有一個短時間的閃屏,最后才會穩定下來。
圖 4 板級實驗結果