基于FPGA的等精度頻率計_第1頁
基于FPGA的等精度頻率計_第2頁
基于FPGA的等精度頻率計_第3頁
基于FPGA的等精度頻率計_第4頁
基于FPGA的等精度頻率計_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、光電與通信工程學院課程設計報告書課 設 名 稱: 等精度頻率計 年級專業(yè)及班級: 姓 名: 學 號: 一、課程設計目的 1、進一步熟悉 Quartus 的軟件使用方法,熟悉 keil 軟件使用; 2、 熟悉單片機與可編程邏輯器件的開發(fā)流程及硬件測試方法; 3、掌握等精度頻率計設計的基本原理。 4、掌握獨立系統(tǒng)設計及調(diào)試方法,提高系統(tǒng)設計能力。 實驗設備 EDA最小系統(tǒng)板一塊(康芯) 、PC機一臺、示波器一臺、信號發(fā)生器一臺、萬用表一個。 二、設計任務 利用單片機與FPGA設計一款等精度頻率計, 待測脈沖的檢測及計數(shù)部分由FPGA實現(xiàn),F(xiàn)PGA的計數(shù)結(jié)果送由單片機進行計算,并將最終頻率結(jié)果顯示在

2、數(shù)碼管上。要求該頻率計具有較高的測量精度,且在整個頻率區(qū)域能保持恒定的測試精度,具體指標如下: a)具有頻率測試功能:測頻范圍 100Hz5MHz。測頻精度:相對誤差恒為基準頻率的萬分之一。 b)具有脈寬測試功能:測試范圍 10s1s,測試精度:0.1s。 c)具有占空比測試功能:測試精度1%99%。 d)具有相位測試功能。 (注:任務a 為基本要求,任務 b、c、d 為提高要求) 三、基本原理 基于傳統(tǒng)測頻原理的頻率計的測量精度將隨被測信號頻率的下降而降低, 在實用中有較大的局限性,而等精度頻率計不但具有較高的測量精度,而且在整個頻率區(qū)域能保持恒定的測試精度。 3.1 等精度測頻原理 等精度

3、頻率計主控結(jié)構(gòu)如圖 1 所示 預置門控信號 CL 選擇為 0.11s 之間(通過測試實驗得出結(jié)論:CL 在這個范圍內(nèi)選擇時間寬度對測頻精度幾乎沒有影響) 。BZH 和 TF 分別是 2 個高速計數(shù)器,BZH 對標準頻率信號(頻率為 Fs)進行計數(shù),設計數(shù)結(jié)果為 Ns;TF 對被測信號(頻率為Fx)進行計數(shù),計數(shù)結(jié)果為 Nx,則有 MUX64-8 模塊并不是必須的,可根據(jù)實際設計進行取舍。分析測頻計測控時序,著重分析 START的作用,完成等精度頻率計設計。 3.2 FPGA 模塊 FPGA模塊所要完成的功能如圖 1 所示,由于單片機的速度慢,不能直接測量高頻信號,所以使用高速 FPGA 為測頻

4、核心。100MHZ 的標準頻率信號由FPGA 內(nèi)部的 PLL 倍頻實現(xiàn),待測信號 TCLK 為方波,由信號發(fā)生器給出待測方波信號(注意:該方波信號帶有直流偏置,沒有負電壓,幅值3.3V) 。預制門控信號 CL 由單片機發(fā)出,BRNA 和 ENA 分別是 BZH 與 TF 兩個計數(shù)器的計數(shù)允許信號端。FPGA 將允許計數(shù)時間內(nèi)的 BZH、TF 的運行結(jié)果送入單片機進行最后的計算。 頂層文件如下:2以下是把20M 5倍頻的設置,利用FPGA內(nèi)部的PLL。電路需要100M標準頻率信號,F(xiàn)PGA提供20M的頻率,所以需要建立PLL模塊,使之五杯頻,得到所需的100M信號。 功能仿真設置:下圖是波形仿真

5、的結(jié)果:3.3 單片機模塊單片機模塊完成對整個測頻系統(tǒng)的控制,包括對FPGA的控制以及數(shù)碼管的顯示控制。測頻允許信號由單片機發(fā)出,并且單片機的P0 口負責循環(huán)讀取FPGA發(fā)送過來的測頻結(jié)果數(shù)據(jù)(BZH、TF兩個計數(shù)器的計數(shù)結(jié)果,每次傳送8位數(shù)據(jù)),P2負責發(fā)送控制信號,單片機可以通過結(jié)束信號了解測頻記數(shù)是否結(jié)束,以確定何時開始讀取數(shù)據(jù)。附上康芯原理圖截圖:四、實驗現(xiàn)象占空比五、心得體會這周課程設計的題目是等精度頻率計的設計,由于書本上有一段程序,所以一開始只是將書上的程序和顯示波形研究了一下。當?shù)秸n程設計的時候,將書上程序敲入并實現(xiàn)效果后有點茫然的感覺。于是,我又仔仔細細地分析了一遍設計原理,

6、從新改變了輸入的代碼,加上自己的思路,并能自己添加預置控制信息CL模塊。原本我還想將測試頻率顯示在數(shù)碼管上,但是最終沒能實現(xiàn),這應該是我的一個遺憾吧。設計中,我感受到了硬件描述語言的強大,我可以幾乎不用考慮硬件條件,將代碼導入就可實現(xiàn)功能。不要總想著去依靠書本上的原題或者是他人,自己思考的做出來的,才算是自己真正收獲的。本次實驗最大的收獲莫過于,獨立系統(tǒng)的去完成一項任務。在其中我查閱了大量的資料,尤其是數(shù)字電路、quarters軟件使用說明、EDA設計等方面的資料。 通過本次學習使我對時序電路有了更深的理解,具體體現(xiàn)在復位、計數(shù)、鎖存多環(huán)節(jié)的控制上。同時,在這次實驗中,我第一次聯(lián)合單

7、片機和EDA一起完成一個項目。EDA充分的發(fā)揮其高頻工作的特點,使得頻率測量的上限很高。單片機則在整個系統(tǒng)中充當控制及數(shù)據(jù)處理的作用設計的優(yōu)點及缺點    本頻率計最大優(yōu)點在于它的高精度。信號頻率的測量,不受閘門信號精度的影響。在被測信號送入計數(shù)器之前,先通過D觸發(fā)器,使閘門信號和被測信號同步,有效地避免了±1誤差。不僅如此,本頻率計對100HZ至5MHZ的全域相對誤差均小于百萬之一。      當然,本頻率計也存在缺點。在頻率計的設計中,乘法器為32位,除法器采用64位,資源占用率太

8、大。單片機處理32位數(shù)據(jù)的方式有待改進,要是它變得更優(yōu)化 六、系統(tǒng)設計步驟及程序,結(jié)果 FPGA:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY EQUALFRECOUNT ISPORT(BCLK,TCLK:IN STD_LOGIC;DATA_OUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);EN:IN STD_LOGIC;ADDRESS:IN STD_LOGIC_VECTOR(3 DOWNTO 0);END EQUALFRECOUNT;ARCHITECTUR

9、E ARCH OF EQUALFRECOUNT ISSIGNAL EN2,WIDE_TEST:STD_LOGIC;SIGNAL WIDE_COUNT,B_COUNT,T_COUNT:STD_LOGIC_VECTOR(31 DOWNTO 0);SIGNAL SAVE_WIDE,SAVE_B,SAVE_T:STD_LOGIC_VECTOR(31 DOWNTO 0);BEGINPROCESS(EN,TCLK)BEGINIF RISING_EDGE(TCLK) THENEN2<=EN;ELSE NULL;END IF;END PROCESS;PROCESS(EN2,TCLK,BCLK)BEGIN

10、IF EN2='1' THENIF RISING_EDGE(TCLK) THENIF T_COUNT=X"FFFF_FFFF" THENT_COUNT<=(OTHERS=>'1');ELSE T_COUNT<=T_COUNT+1;SAVE_T<=T_COUNT+1;-SAVE T_COUNTEND IF;ELSE NULL;END IF;IF FALLING_EDGE(TCLK) THENIF WIDE_TEST='0' THENWIDE_COUNT<=B_COUNT;WIDE_TEST<=

11、'1'ELSE SAVE_WIDE<=WIDE_COUNT;-SAVE WIDE_COUNTEND IF;END IF;IF RISING_EDGE(BCLK) THENIF B_COUNT=X"FFFF_FFFF" THENB_COUNT<=(OTHERS=>'1');ELSE B_COUNT<=B_COUNT+1;SAVE_B<=B_COUNT+1;-SAVE B_COUNT IN SAVE_BEND IF;ELSE NULL;END IF;ELSE-WHEN ENA=0,WE OUTPUT THE DATA

12、 AND RESET THE COUNTER.WIDE_COUNT<=(OTHERS=>'0');B_COUNT<=(OTHERS=>'0');T_COUNT<=(OTHERS=>'0');WIDE_TEST<='0'END IF;END PROCESS;PROCESS(ADDRESS,EN2,SAVE_T,SAVE_B,SAVE_WIDE,BCLK)BEGINIF RISING_EDGE(BCLK) THENIF EN2='0' THEN-USE SOME CONSTAN

13、TS TO TESTCASE ADDRESS IS WHEN X"0"=>DATA_OUT<=SAVE_T(7 DOWNTO 0);WHEN X"1"=>DATA_OUT<=SAVE_T(15 DOWNTO 8);WHEN X"2"=>DATA_OUT<=SAVE_T(23 DOWNTO 16);WHEN X"3"=>DATA_OUT<=SAVE_T(31 DOWNTO 24);WHEN X"4"=>DATA_OUT<=SAVE_B(7

14、 DOWNTO 0);WHEN X"5"=>DATA_OUT<=SAVE_B(15 DOWNTO 8);WHEN X"6"=>DATA_OUT<=SAVE_B(23 DOWNTO 16);WHEN X"7"=>DATA_OUT<=SAVE_B(31 DOWNTO 24);WHEN X"8"=>DATA_OUT<=SAVE_WIDE(7 DOWNTO 0);WHEN X"9"=>DATA_OUT<=SAVE_WIDE(15 DOWNTO

15、8);WHEN X"A"=>DATA_OUT<=SAVE_WIDE(23 DOWNTO 16);WHEN X"B"=>DATA_OUT<=SAVE_WIDE(31 DOWNTO 24);WHEN OTHERS=>NULL;END CASE;ELSE NULL;END IF;ELSE NULL;END IF;END PROCESS;END ARCH;單片機:/* *.c文件,文件名:EqualFre_main.c *各模塊的流程控制*/#include "EqualFre_main.h"int main(v

16、oid)communicationInit_Ex();while(1)mode = getMode_Ex(); /確定選擇的模式askForData_Ex(); /請求數(shù)據(jù)if(HOLD_DATA_MODE != mode) /表示沒有固定數(shù)據(jù)時,則載入數(shù)據(jù)loadData();disData(); /數(shù)據(jù)顯示/數(shù)據(jù)載入static void loadData()fre = getFre_Ex();wide = getWide_Ex();duty = getDuty_Ex();/*數(shù)據(jù)顯示中:wData(uchar) 傳入的參數(shù)意義0 - 9 數(shù)字0-910 - 19 跟了點號的0-920暗選

17、*/static void disDelay()/顯示延時uchar data x,y;for(x=250;x>0;x-)for(y=50;y>0;y-);/數(shù)據(jù)顯示-總控static void disData()switch(mode)case SHOW_FRE_MODE:disFre(); disDelay(); break;case SHOW_WIDE_MODE: disWide();disDelay();break;case SHOW_DUTY_MODE:disDuty(); disDelay(); break;default:break;/*static void dis

18、Fre()uchar data i;for(i=0;i<8;i+)wData_Ex(1);static void disWide()uchar data i;for(i=0;i<8;i+)wData_Ex(2);static void disDuty()uchar data i;for(i=0;i<8;i+)wData_Ex(3);*/數(shù)據(jù)顯示-顯示頻率,單位Hz或MHz(雙模式)static void disFre()uchar data dataTemp8,i;ulong data freTemp = fre;/為了顯示1位小數(shù),這里已經(jīng)將頻率擴大10倍uchar dat

19、a flag = 0;/消零標志位if(1000000 <= freTemp)/當頻率值大于1M時,使用兆顯示模式freTemp /= 100000;/0.00MHzfor(i=2;i<8;i+)/數(shù)據(jù)從低位到高位裝入數(shù)據(jù)暫存器dataTemp,這里保留2位, 用于顯示nH(即MHz)dataTempi = (uchar)(freTemp%10);freTemp /= 10;dataTemp4 += 10;/取2位小數(shù),這里是加入小數(shù)點dataTemp1 = 21;/ndataTemp0 = 22;/Helsefor(i=1;i<8;i+)dataTempi = (uchar

20、)(freTemp%10);freTemp /= 10;dataTemp2 += 10;dataTemp0 = 22;/Hfor(i=0;i<8;i+)/數(shù)據(jù)從高位到低位顯示,并進行高位消零操作if(0 != dataTemp7-i)flag = 1;if(0=dataTemp7-i)&&(0=flag)dataTemp7-i = 20;wData_Ex(dataTemp7-i); /顯示數(shù)據(jù)/數(shù)據(jù)顯示-顯示脈寬,單位us,意味著最大只能測1MHz的頻率static void disWide()uchar data dataTemp8,i;ulong data wideT

21、emp = wide;uchar data flag = 0;for(i=0;i<8;i+)dataTempi = (uchar)(wideTemp%10);wideTemp /= 10;for(i=0;i<8;i+)/數(shù)據(jù)從高位到低位顯示,并進行高位消零操作if(0 != dataTemp7-i)flag = 1;dataTemp1|=10;if(0=dataTemp7-i)&&(0=flag)dataTemp7-i = 20;wData_Ex(dataTemp7-i);/數(shù)據(jù)顯示-顯示占空比static void disDuty()uchar data data

22、Temp4,i;uint data dutyTemp = duty;for(i=0;i<4;i+)dataTempi = (uchar)(dutyTemp%10);dutyTemp /= 10;dataTemp2 += 10;wData_Ex(20);/補4個暗選wData_Ex(20);wData_Ex(20);wData_Ex(20);for(i=0;i<4;i+)wData_Ex(dataTemp3-i);/* *.h文件,文件名:EqulaFre_SGMDisplay.h *SGM顯示模塊,用于顯示由主程序傳過來的數(shù)據(jù) *硬件資源:164時鐘端-P3.1164數(shù)據(jù)端-P3.

23、0 */#ifndef _EQUALFRE_SGMDISPLAY_H_H_#define _EQUALFRE_SGMDISPLAY_H_H_#include<reg52.h>#include<intrins.h>#define uchar unsigned charsbit sgm_clk=P31; /164時鐘端sbit sgm_data=P30; /164數(shù)據(jù)端static uchar code num = /從低位到高位,高電平有效0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,/數(shù)字0-90xfd,0x61,0

24、xdb,0xf3,0x67,0xb7,0xbf,0xe1,0xff,0xf7,/帶點號的0-90x00,0x2a,0x6e/暗選,n,h;/接口函數(shù)void wData_Ex(uchar ); /在數(shù)碼管上顯示數(shù)據(jù)#endif/* *.c文件,文件名:EqualFre_SGMDisplay.c */#include "EqualFre_SGMDisplay.h"/接口函數(shù)void wData_Ex(uchar index)uchar data i,byte;byte = numindex;for(i=0;i<8;i+)sgm_clk = 0;sgm_data = (b

25、it)(byte>>i)&0x01);_nop_();sgm_clk = 1;_nop_();/* *.c文件,文件名:EqualFre_modeFromKey.c */#include "EqualFre_modeFromKey.h"/*內(nèi)部函數(shù)*/按鍵檢測延時static void keyDelay()uchar data x,y;for(x=100;x>0;x-);for(y=200;y>0;y-) ;/按鍵掃描static void keyScan() /選擇模式if(0 = Key_Mode)keyDelay();if(1 = Ke

26、y_Mode) return ;switch(mode)case SHOW_FRE_MODE: /測頻率mode = SHOW_WIDE_MODE; /下一次測的是脈寬break;case SHOW_WIDE_MODE: /測脈寬mode = SHOW_DUTY_MODE; /下一次測的是占空比break;case SHOW_DUTY_MODE: /測占空比mode = SHOW_FRE_MODE; /下一次測的是頻率break;default:mode = SHOW_FRE_MODE;break;while(0 = Key_Mode) ;keyDelay();if(0 = Key_Hold_

27、Data)keyDelay();if(1 = Key_Hold_Data) return ;mode = HOLD_DATA_MODE; /按下Key_Hold_Data,即為P11時,數(shù)據(jù)保持不變while(0 = Key_Hold_Data);keyDelay();/*接口函數(shù)*uchar getMode_Ex(void)/返回mode,確定選擇的模式keyScan();return mode;/* *.h文件,文件名:equalFre.h *模式控制模塊,通過鍵盤來控制模式的選擇,并將所選模式傳遞給函數(shù) *所使用的硬件資源: 頻率顯示、脈寬顯示、占空比顯示的切換建-P1.0 測試值保持鍵

28、 - P11 */#ifndef _EQUALFRE_MODEFROMKEY_H_H_#define _EQUALFRE_MODEFROMKEY_H_H_#include<reg52.h>#define SHOW_FRE_MODE 0#define SHOW_WIDE_MODE 1#define SHOW_DUTY_MODE 2#define HOLD_DATA_MODE 3#define uchar unsigned charsbit Key_Mode = P10; /實現(xiàn)頻率顯示,脈寬顯示,占空比顯示的轉(zhuǎn)化sbit Key_Hold_Data = P11; /將測得的數(shù)值定住s

29、tatic uchar data mode;/內(nèi)部函數(shù)static void keyDelay(); /按鍵檢測延時static void keyScan(); /按鍵掃描/接口函數(shù)uchar getMode_Ex(void); /在數(shù)碼管上顯示數(shù)據(jù)#endif/* *.h文件,文件名:EqulaFre_communication.h *通信模塊,用于和FPGA通信,獲取頻率、脈寬、占空比的原始數(shù)據(jù)。 *并將處理好數(shù)據(jù)傳給主程序 *所使用的硬件資源: 地址線0-P2.0 地址線1-P2.1 地址線2-P2.2 地址線3-P2.3 測頻標志位-P2.4 數(shù)據(jù)線-P0 定時器T0 */#ifnde

30、f _EQUALFRE_COMMUNICATION_H_H_#define _EQUALFRE_COMMUNICATION_H_H_#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define ulong unsigned long#define uint unsigned int#define MY_TH0 0x5d/對于20Mhz晶振來說,25ms#define MY_TL0 0x3d#define FREE_TIME 80/空閑時間,即讓FPGA測頻率的時間,50ms*FREE_TIM

31、E#define DATA_IN P0#define BASE_FRE 100000000 /FPGA的基準頻率sbit address0 = P20;sbit address1 = P21;sbit address2 = P22;sbit address3 = P23;sbit TEST_EN = P24;/當它為1表示測頻結(jié)束static ulong data fre,wide;static uint data duty;/內(nèi)部函數(shù)static ulong getSourceData(uchar ); /從FPGA中獲得基準信號,被測信號的數(shù)據(jù)/接口函數(shù)void communication

32、Init_Ex(void);void askForData_Ex(void); /請求數(shù)據(jù)ulong getFre_Ex(void); /計算頻率值ulong getWide_Ex(void); /計算脈寬值uint getDuty_Ex(void); /計算占空比#endif/* *.c文件,文件名:EqualFre_communication.c */#include "EqualFre_communication.h"/從FPGA那里獲得頻率、脈寬、占空比的原始值static ulong getSourceData(uchar sourceKind)uchar dat

33、a byte0,byte1,byte2,byte3;ulong data temp = 0;byte0 = byte1 = byte2 = byte3 = 0;switch(sourceKind)case 1:/被測信號T值address3 = 0; address2 = 0; address1 = 0; address0 = 0;_nop_();_nop_();_nop_();_nop_();/FPGA反應時間byte0 = DATA_IN;address3 = 0; address2 = 0; address1 = 0; address0 = 1;_nop_();_nop_();_nop_

34、();_nop_();/FPGA反應時間byte1 = DATA_IN;address3 = 0; address2 = 0; address1 = 1; address0 = 0;_nop_();_nop_();_nop_();_nop_();/FPGA反應時間byte2 = DATA_IN;address3 = 0; address2 = 0; address1 = 1; address0 = 1;_nop_();_nop_();_nop_();_nop_();/FPGA反應時間byte3 = DATA_IN;break;case 2:/基準信號B值address3 = 0; addres

35、s2 = 1; address1 = 0; address0 = 0;_nop_();_nop_();_nop_();_nop_();/FPGA反應時間byte0 = DATA_IN;address3 = 0; address2 = 1; address1 = 0; address0 = 1;_nop_();_nop_();_nop_();_nop_();/FPGA反應時間byte1 = DATA_IN;address3 = 0; address2 = 1; address1 = 1; address0 = 0;_nop_();_nop_();_nop_();_nop_();/FPGA反應時間

36、byte2 = DATA_IN;address3 = 0; address2 = 1; address1 = 1; address0 = 1;_nop_();_nop_();_nop_();_nop_();/FPGA反應時間byte3 = DATA_IN;break;case 3:/脈寬W值address3 = 1; address2 = 0; address1 = 0; address0 = 0;_nop_();_nop_();_nop_();_nop_();/FPGA反應時間byte0 = DATA_IN;address3 = 1; address2 = 0; address1 = 0; address0 = 1;_nop_();_nop_();_nop_();_nop_();/FPGA反應時間byte1 = DATA_IN;address3 = 1; address2 = 0; address1 = 1; address0 = 0;_nop_();_nop_();_nop_();_nop_();/FPGA反應時間byte2 = DATA_IN;address3 = 1; address2 = 0; address1 = 1;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論