EDA實(shí)驗(yàn)報(bào)告頻率計(jì)及DDS_第1頁
EDA實(shí)驗(yàn)報(bào)告頻率計(jì)及DDS_第2頁
EDA實(shí)驗(yàn)報(bào)告頻率計(jì)及DDS_第3頁
EDA實(shí)驗(yàn)報(bào)告頻率計(jì)及DDS_第4頁
EDA實(shí)驗(yàn)報(bào)告頻率計(jì)及DDS_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

PAGEPAGE9EDA實(shí)驗(yàn)II信號(hào)源、頻率計(jì)的設(shè)計(jì)姓名:葉爽班級(jí):08042100學(xué)號(hào):0804210147指導(dǎo)教師:花漢兵蔣立平摘要本實(shí)驗(yàn)利用ALTERA公司的CYCLONE系列硬件平臺(tái)和QUARTUSⅡ軟件平臺(tái),對(duì)Cyclone系列的EP1C12Q240C8芯片進(jìn)行設(shè)計(jì),實(shí)現(xiàn)了一個(gè)簡單的正弦波,三角波及調(diào)幅波信號(hào)源和頻率計(jì)。關(guān)鍵字:FPGAQURATUSⅡ數(shù)字鐘VHDLInthisexperiment,weusethehardwareplatformofcycloneproducedbyALTERAandthesoftwareplatformwhichcalledquartusII.Wedesignasimplesinewaveandtrianglewaveandamplitude-modulationwavegeneratoronthechipofep1c12q240c8ofcycloneseries.Keyword:FPGAQURATUSⅡVHDL,SignalGenerator.實(shí)驗(yàn)?zāi)康腜4實(shí)驗(yàn)要求P4實(shí)驗(yàn)步驟及設(shè)計(jì)過程P4編譯下載P13經(jīng)驗(yàn)總結(jié)P13一.實(shí)驗(yàn)?zāi)康?。熟悉QUARTEUS-Ⅱ軟件的使用方法,和實(shí)現(xiàn)FPGA電路設(shè)計(jì)的一般流程。了解VHDL語言編程。了解基本的自頂向下模塊化設(shè)計(jì)思想。二.實(shí)驗(yàn)要求。1.利用DDS的方案,產(chǎn)生一個(gè)正弦波輸出,頻率可控。2.利用DDS產(chǎn)生調(diào)制信號(hào)和載波信號(hào),并根據(jù)所學(xué)的高頻電子線路知識(shí)產(chǎn)生標(biāo)準(zhǔn)調(diào)幅波。3.設(shè)計(jì)一個(gè)數(shù)字頻率計(jì),能夠?qū)㈩l率顯示在數(shù)碼管上。三、實(shí)驗(yàn)步驟及設(shè)計(jì)過程。1.DDS信號(hào)發(fā)生模塊(半周期數(shù)據(jù),正弦波,三角波)(模塊名:)DDS其實(shí)質(zhì)是以基準(zhǔn)頻率源(系統(tǒng)時(shí)鐘)對(duì)相位進(jìn)行等間隔的采樣。由圖見,DDS由相位累加器和波形存儲(chǔ)器(即,ROM查詢表)構(gòu)成的數(shù)控振蕩器(NCO_NumericallyControlledOscillators)、數(shù)模轉(zhuǎn)換器(DAC)組成。在每一個(gè)時(shí)鐘周期,N位相位累加器與其反饋值進(jìn)行累加,其結(jié)果的高L位作為查詢表的地址,然后從ROM中讀出相應(yīng)的幅度值送到DAC。再由DAC將其轉(zhuǎn)換成為階梯模擬波形,最后由具有內(nèi)插作用的LPF將其平滑為連續(xù)的正弦波形作為輸出。因此,通過改變頻率控制字K就可以改變輸出頻率。DDS模塊中,遇到的第一個(gè)問題就是如何產(chǎn)生有符號(hào)數(shù)的ROM。在實(shí)驗(yàn)指導(dǎo)手冊(cè)里提供的都是產(chǎn)生無符號(hào)數(shù)的計(jì)算機(jī)程序,但是由于后面涉及到調(diào)幅波中的相乘運(yùn)算,使用無符號(hào)數(shù)的話會(huì)非常麻煩,因此第一步必須做出有符號(hào)數(shù)的ROM出來。產(chǎn)生有符號(hào)數(shù)的C++程序如下。其中加下劃線的部分就是有符號(hào)數(shù)和無符號(hào)數(shù)的程序區(qū)別所在。#include"iostream.h"#include"stdio.h"#include"math.h"intmain(intargc,char*argv[]){ inti; doubles; for(i=0;i<2048;i++) { s=sin(atan(1)*8*i/4096); printf("%d:%x;\n",i,(int)(s*511)); } return0;}相位累加器,寄存器均由VHDL語言編寫,比較簡單,此處只給出源程序,略去分析。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityphase_adderisport(k:instd_logic_vector(11downto0);clk:instd_logic;en:instd_logic;reset:instd_logic;out1:outstd_logic_vector(11downto0));endentityphase_adder;architectureartofphase_adderissignaltemp:std_logic_vector(11downto0);beginprocess(clk,en,reset)beginifreset='1'thentemp<="000000000000";elseifclk'eventandclk='1'thenifen='1'thentemp<=temp+k;endif;endif;endif;out1<=temp;endprocess;endarchitecture;==================================libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityreg11isport(clk:instd_logic;d:instd_logic_vector(11downto0);q:outstd_logic_vector(10downto0));endreg11;architectureartofreg11issignaltemp:std_logic_vector(11downto0);beginprocess(clk)beginif(clk'eventandclk='1')thenif(d<"100000000000")thentemp<=d;elsetemp<=("111111111111"-d);endif;endif;endprocess;q<=(temp(10)&temp(9)&temp(8)&temp(7)&temp(6)&temp(5)&temp(4)&temp(3)&temp(2)&temp(1)&temp(0));endart;======================================在本次實(shí)驗(yàn)中,為了節(jié)約存儲(chǔ)空間,我的ROM里只存儲(chǔ)了半周期數(shù)據(jù)。但如果按照正弦函數(shù)的前半周期來保存的話,后半周期會(huì)涉及到符號(hào)位的轉(zhuǎn)換,比較麻煩,因此我選擇保存了余弦函數(shù)的前半周期數(shù)據(jù)。對(duì)于送進(jìn)來的頻率控制字K,如果在0-PI之間,那么不做變換,直接輸出,如果在PI-2PI之間,那么輸出2PI-K,即關(guān)于PI做了一個(gè)對(duì)稱變換,由正弦波的對(duì)稱性知,這樣不會(huì)改變波形。分析寄存器的代碼就可以發(fā)現(xiàn),寄存器是12位地址輸入,卻只有11位地址輸出,就是因?yàn)樽隽艘淮螌?duì)稱變換,接口寬度縮減了一半。對(duì)于三角波,其核心就是改變ROM的內(nèi)容,也就是產(chǎn)生MIF文件的計(jì)算機(jī)程序需要修改一下。我直接定義了一個(gè)周期為2PI,幅度為2的三角波函數(shù)TRIANGLE.那么MAIN函數(shù)中只要把SIN改為TRIANGLE就可以了。程序如下。#include"iostream.h"#include"stdio.h"#include"math.h"doubletriangle(doublex){ if(0<=x&&x<=4*atan(1)) return((2*atan(1))-x)/(2*atan(1)); elsereturn(triangle(8*atan(1)-x));}intmain(intargc,char*argv[]){ inti; doubles; for(i=0;i<2048;i++) { s=triangle(atan(1)*8*i/4096); printf("%d:%x;\n",i,(int)(s*511)); } return0;}對(duì)于反相功能,其實(shí)就是在寄存器之前加一個(gè)反相模塊就可以了。VHDL如下。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityphase_reverseisport(en,clk:instd_logic;phase_ctrl:instd_logic_Vector(11downto0);dout:outstd_logic_vector(11downto0));endphase_reverse;architecturebehofphase_reverseissignaltemp:std_logic_vector(11downto0);beginprocess(clk)beginifclk'eventandclk='1'thenifen='1'thentemp<=phase_ctrl+"100000000000";elsetemp<=phase_ctrl;endif;endif;endprocess;dout<=temp;endarchitecture;============================================仔細(xì)分析一下,就是當(dāng)反相開關(guān)打開以后,相位控制字統(tǒng)一加上2048,正好是半個(gè)周期,因此反相。完整的DDS模塊完整的DDS(反相)模塊DDS模塊封裝,KCUSTOM是自定義的頻率控制字,CLK為時(shí)鐘輸入,DAIN為輸出的正弦波信號(hào)。2.調(diào)幅波模塊根據(jù)已學(xué)過的高頻電子線路知識(shí)知道調(diào)幅波的表達(dá)式如下:F考慮到這當(dāng)中用到大量的運(yùn)算,如果一個(gè)一個(gè)單獨(dú)定制乘法加法模塊較為繁瑣,因此直接使用VHDL語言編寫,簡潔明了。VHDL代碼如下。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entitytestisgeneric(ma:integer:=7);port(clk:instd_logic;sig:insigned(9downto0);carry:insigned(9downto0);amwave:outsigned(9downto0));endtest;architecturebehoftestissignals:signed(3downto0);signalt:signed(23downto0);begins<=conv_signed(ma,4);process(clk)beginifclk'eventandclk='1'thent<=(s*sig+3577)*carry;amwave<=t(22downto13);endif;endprocess;endbeh;========================================在這當(dāng)中最難理解的莫過于3577這個(gè)數(shù)了。在十進(jìn)制中,我們加上的是1。之前接觸的一直是10進(jìn)制,沒有仔細(xì)思考這個(gè)1的含義?,F(xiàn)在換成2進(jìn)制,當(dāng)然不能加上二進(jìn)制的1,而要換成別的。十進(jìn)制當(dāng)中,這個(gè)1是調(diào)制度M的最大值與正弦函數(shù)的最大值1相乘的結(jié)果。而在二進(jìn)制中,調(diào)制度用四位有符號(hào)數(shù)表示,最大為7,正弦函數(shù)用10位有符號(hào)二進(jìn)制數(shù)表示,最大值為511。因此,相乘后結(jié)果就是3577。用它來替換原來十進(jìn)制中的1,才能得出正確的結(jié)果。如圖所示為AM模塊的原理圖3.頻率計(jì)模塊頻率計(jì)的原理有兩種,一種是計(jì)數(shù)式測量,一種是周期式測量。前者對(duì)與頻率較高的信號(hào)測量較為準(zhǔn)確,后者對(duì)于頻率較低的信號(hào)測量較為準(zhǔn)確??紤]到我們要測量的信號(hào)頻率都很高,因此選擇前者。我設(shè)計(jì)的頻率計(jì)有4個(gè)量程,×1,×10,×100,×1000。原理很簡單,例如×1檔來說,只要給一個(gè)1HZ脈沖,通過計(jì)數(shù)器計(jì)算出在脈沖時(shí)間內(nèi)信號(hào)上升沿的個(gè)數(shù)就可以了,也就是把信號(hào)的符號(hào)位接在計(jì)數(shù)器的CLK端。TIMER模塊為定時(shí)電路,控制計(jì)數(shù)的停止與開始,送到T_CON模塊后,由該模塊發(fā)出使能信號(hào)。CNT4*10模塊為計(jì)數(shù)模塊,DISPREG為顯示寄存器,使得示數(shù)不至于變化的太快。4.基準(zhǔn)頻率源模塊由于頻率計(jì)模塊中涉及到需要產(chǎn)生精確的基準(zhǔn)頻率,因此需要對(duì)系統(tǒng)48M頻率進(jìn)行分頻。對(duì)48分解質(zhì)因數(shù)可知,需要2,3,5分頻。2,3分頻的模塊在數(shù)字鐘里已有。5分頻的原理和3分頻非常類似,同樣是利用把PQ變量錯(cuò)開半周期,不同的是判斷語句不一樣,而且在5分頻里PQ要變?yōu)槿皇噶?,否則沒有足夠多的狀態(tài)數(shù)來產(chǎn)生分頻效果。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityFP5isport(clk:instd_logic;clkout:outstd_logic);endFP5;architecturertlofFP5issignalp,q:std_logic_vector(2downto0);beginprocess(clk)beginif(clk'eventandclk='1')thenifp="100"thenp<="000";elsep<=p+1;endif;endif;endprocess;process(clk)beginif(clk'eventandclk='0')thenifq="100"thenq<="000";elseq<=q+1;endif;endif;endprocess;clkout<='1'when(p(2)='0'andq(2)='0'and(p(1)='0'orp(0)='0'))else'0';endrtl;====================================================5.AD轉(zhuǎn)換(未完成)我在周二的時(shí)候就已經(jīng)做完了所有的基本功能,然后開始思考如何加上一些附加功能。我首先考慮的就是,我的頻率計(jì)能不能測量一個(gè)外部的信號(hào)的頻率。由于板子內(nèi)部全部是數(shù)字信號(hào),因此外部的模擬信號(hào)進(jìn)來必須要經(jīng)過AD轉(zhuǎn)換。將外部的信號(hào)接在板子上的SGIN引腳處,對(duì)ADC做適當(dāng)?shù)脑O(shè)定,在ADC的8個(gè)輸出腳上就會(huì)產(chǎn)生相應(yīng)的數(shù)字信號(hào)。于是我在接完線以后嘗試使用SIGNALTAP邏輯分析儀來捕捉ADC的輸出信號(hào),但是很遺憾,嘗試了一個(gè)下午,ADC輸出口出來的數(shù)字信號(hào)始終無規(guī)律,而按照理論它應(yīng)該是正弦波。更換實(shí)驗(yàn)臺(tái)也無果。這個(gè)問題曾經(jīng)在去年的華為杯比賽時(shí)出現(xiàn)過,我們?yōu)榱诉@個(gè)問題調(diào)試了整整一天,直至最后才解決。不過我已經(jīng)記不清當(dāng)時(shí)是如何解決的了,當(dāng)時(shí)做的報(bào)告上也沒有寫這方面的內(nèi)容。所以,以后寫報(bào)告的時(shí)候一定要有經(jīng)驗(yàn)總結(jié)的內(nèi)容,把實(shí)驗(yàn)中遇到的所有問題都記錄下來。6.相位測量(未完成)相位測量的原理也是比較簡單的。對(duì)于兩個(gè)用DDS產(chǎn)生的正弦波信號(hào),只需取出他們同一時(shí)刻的頻率控制字的差值,計(jì)算其差值,再換算成相位,送到顯示電路顯示即可。但是很遺憾的是,我在接入相位測量電路以后,頻率計(jì)的示數(shù)錯(cuò)誤。在之前的調(diào)試過程中曾經(jīng)出現(xiàn)過這樣的狀況,我知道是時(shí)鐘信號(hào)太多,互相之間有干擾的原因,但是在我盡全力把所有的多余的高頻率時(shí)鐘去掉以后,問題仍然沒有解決。由于時(shí)間已經(jīng)到快驗(yàn)收的時(shí)間了,所以不得已只能使用做相位測量之前的備份版去驗(yàn)收,這個(gè)功能沒有能夠出現(xiàn)在最后的驗(yàn)收作品中。7.動(dòng)態(tài)顯示電路動(dòng)態(tài)顯示電路主要目的就是顯示頻率計(jì)的示數(shù)。與之前數(shù)字鐘的設(shè)計(jì)幾乎完全一致,只不過此次是4位數(shù)碼管而已,所以對(duì)上次的電路略加修改就可以了。8.顯示切換電路由于要在正弦調(diào)幅波,三角調(diào)幅波,反相波三者之間切換,所以我自己寫了個(gè)簡單的數(shù)據(jù)選擇器來實(shí)現(xiàn)切換功能。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;ENTITYMUX42ISPORT(CLK,SW2,SW3:INSTD_LOGIC;SIGIN,AMWAVEIN,SIG_ORI,SIG_REV,TRI_SIG,TRI_MOD:STD_LOGIC_vECTOR(9DOWNTO0);DA1IN,DA2IN:OUTSTD_LOGIC_VECTOR(9DOWNTO0));ENDMUX42;ARCHITECTUREBEHOFMUX42ISSIGNALTEMP1,TEMP2:STD_LOGIC_VECTOR(9DOWNTO0);BEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENIFSW2='1'THENTEMP1<=SIG_ORI;TEMP2<=SIG_REV;ELSIFSW3='1'THENTEMP1<=SIGIN;TEMP2<=AMWAVEIN;ELSETEMP1<=TRI_SIG;TEMP2<=TRI_MOD;ENDIF;ENDIF;ENDPROCESS;DA1IN<=TEMP1;DA2IN<=TEMP2;ENDBEH;===========================================10.其它總圖內(nèi)還有很多其它的小模塊比如常數(shù)模塊等,比較簡單,用VHDL寫也就是幾行的工作量,在此略去。11.總圖編譯下載首先進(jìn)行引腳的設(shè)置,先對(duì)最終的xianshi電路進(jìn)行編譯,然后點(diǎn)Assignments->Pins,然后按書后附錄配置引腳。配置完再點(diǎn)Assignments->Settings設(shè)置其余管腳,然后再編譯,點(diǎn)下載按鈕,再點(diǎn)HardwareSetup將平臺(tái)改為ByteBlaster[LPT1],再點(diǎn)START即可。實(shí)驗(yàn)總結(jié)和感受。1.我在實(shí)驗(yàn)中遇到過的比較大的困難。1)頻率計(jì)示數(shù)錯(cuò)誤。其實(shí)這個(gè)問題的解決純粹是經(jīng)驗(yàn)了,因?yàn)閱螁稳ヅ挪轭l率計(jì)和顯示電路都沒有任何問題。我只是聯(lián)想到做電子鐘的時(shí)候有一次因?yàn)槎嘁艘粋€(gè)1000HZ的OUTPUT出來并且沒有鎖定任何端口,結(jié)果直接導(dǎo)致鐘走時(shí)不穩(wěn)定。所以我懷疑是不是還是這方面的問題。我把所有多余的時(shí)鐘信號(hào)全部刪掉以后,問題解決。所以SIMPLEISBEST是永恒不變的真理,在實(shí)現(xiàn)同樣的功能的情況下,結(jié)構(gòu)簡單意味著高可靠性!不僅是電路,現(xiàn)在的機(jī)械設(shè)計(jì)都有回歸簡單的趨勢,都是一個(gè)道理,簡單的東西維護(hù)成本低,故障率小。尤其是我電路里多出來的時(shí)鐘這樣多余的東西,更是不應(yīng)當(dāng)保留。2)調(diào)幅波波形不對(duì)。某天下午我一直都在折騰調(diào)幅波公式里的1換算成2進(jìn)制到底是多少。由于我進(jìn)度比較快,也沒有別人可以求助,于是我從差不多從12位2進(jìn)制的0一直試到111111111111,幾乎見過了所有的錯(cuò)誤波形,沒有一個(gè)是對(duì)的。所有的波形都基本上都是由調(diào)幅波做某種變換而來,都很像,但都不對(duì)。晚上回去靜下心來翻了一會(huì)高頻書,終于弄懂了,覺得應(yīng)該是7×511。第二天上機(jī)一試,果然成功了。所以我覺得以后做實(shí)驗(yàn)千萬不能急于求成,看到東西近在眼前卻搞不定就急躁,亂來。我要是下午就翻翻書,也許下午就搞出來了,不用等晚上了。所以做實(shí)驗(yàn)的時(shí)候心態(tài)要好。2.我在繪制原理圖過程中的經(jīng)驗(yàn)總結(jié)1.使用VHDL代碼寫模塊時(shí),保存的VHD文件的名字最好和代碼里ENTITY后的實(shí)體名保持一致,否則在你寫了多個(gè)相似模塊以后,QUARTUS很有可能張冠李戴,在你雙擊了這個(gè)模塊以后它卻打開了另一個(gè)VHD文件,不注意的話很容易出錯(cuò)。2.連線要簡潔。這個(gè)感受是我在做電子鐘的時(shí)候就體會(huì)到的。對(duì)于那些密密麻麻的端口連接,直接用信號(hào)名就可以,簡潔明了。3.對(duì)于從書上看來的源代碼的原理一定要弄懂。我之前電子鐘里面的3分頻代碼是從書上看來的,當(dāng)時(shí)我對(duì)它的原理不是太清楚。后來偶然的機(jī)會(huì)我用仿真的方法仔細(xì)觀察了一下波形,一目了然,弄清了它的原理。于是本次實(shí)驗(yàn)中需要5分頻的時(shí)候我就能很順利的在源代碼的基礎(chǔ)上改一下就產(chǎn)生了5分頻。直接抄代碼的話,一旦電路出現(xiàn)任何問題,根本都不知道從哪下手。4.關(guān)于創(chuàng)新設(shè)計(jì)。這次實(shí)驗(yàn)我的進(jìn)度比較快,所以我有比較充裕的時(shí)間來思考一些附加功能。從實(shí)用的角度出發(fā),我首先想到的就是,我能不能測量一個(gè)外部進(jìn)來的正弦信號(hào)的頻率,老是測量板子里面產(chǎn)生的頻率我覺得有點(diǎn)自己和自己玩的感覺,沒什么意思。

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論