基于fpga的直接數(shù)字頻率合成器的設(shè)計(jì) 本科畢業(yè)設(shè)計(jì)
《基于fpga的直接數(shù)字頻率合成器的設(shè)計(jì) 本科畢業(yè)設(shè)計(jì)》由會(huì)員分享,可在線閱讀,更多相關(guān)《基于fpga的直接數(shù)字頻率合成器的設(shè)計(jì) 本科畢業(yè)設(shè)計(jì)(55頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、河南理工大學(xué)畢業(yè)設(shè)計(jì)(論文)說明書 畢業(yè)設(shè)計(jì)論文 基于FPGA的直接數(shù)字頻率合成器的設(shè)計(jì) 摘要 在頻率合成領(lǐng)域,常用的頻率合成技術(shù)有直接模擬合成、模擬鎖相環(huán)、小數(shù)分頻鎖相環(huán)等,直接數(shù)字頻率合成(Direct Digital Frequency Synthesis ,DDFS,簡(jiǎn)稱DDS)是近年來的新的頻率合成技術(shù)。本文介紹了直接數(shù)字頻率合成器的基本組成及設(shè)計(jì)原理,給出了基于FPGA的具體設(shè)計(jì)方案及編程實(shí)現(xiàn)方法。仿真結(jié)果表明,該設(shè)計(jì)簡(jiǎn)單合理,使用靈活方便,通用性好,可寫入各種FPGA芯片,最高可將頻率提高100萬倍。具有良好的性價(jià)比。 關(guān)鍵詞 直接數(shù)字頻率合成器(DDS) F
2、PGA Design of direct digital frequency synthesizer based on FPGA Abstract In Frequency domain, the common Synthesis technology has Direct simulation, phase lock loop simulation, decimal Frequency and phase lock loop, Direct Digital Frequency Synthesis
3、(as some DDFS, Digital, referred to as spurious bio-synthesis) in recent years is the new Frequency Synthesis technology. The structure and principles of Direct Digital Frequency Synthesizer is introduced. Also a detailed design and the method of program realization based on FPGA are introduced. T
4、he result of simulation shows that the design is simple and feasible, convenient and flexible, high universality, writeable various FPGA chip, the highest frequency can be 100 million times. Ratiofor quality to price. Keywords Direct Digital frequency Synthesizer(DDS) FPGA
5、 前言 在頻率合成領(lǐng)域,常用的頻率合成技術(shù)有直接模擬合成、模擬鎖相環(huán)、小數(shù)分頻鎖相環(huán)等,直接數(shù)字頻率合成(DDS)是近年來的新的頻率合成技術(shù)。DDS以穩(wěn)定度高的參考時(shí)鐘為參考源,通過精密的相位累加器和數(shù)字信號(hào)處理,再通過高速D/A變換器產(chǎn)生所需的數(shù)字波形,這個(gè)數(shù)字濾波經(jīng)過一個(gè)模擬濾波器后,得到最終的模擬信號(hào)波形。DDS是產(chǎn)生高精度、快速頻率變換、輸出波形失真小的優(yōu)先選用技術(shù)。 隨著可編程邏輯器件的飛速發(fā)展,使用FPGA(Field-Programmable Gate Array)設(shè)計(jì)DDS系統(tǒng)成為一種很好的選擇,由于FPGA現(xiàn)場(chǎng)可編程,設(shè)計(jì)復(fù)雜或者簡(jiǎn)單系統(tǒng)
6、完全從實(shí)際需要出發(fā),通過重寫RAM/ROM數(shù)據(jù),可以做到任意波形輸出和動(dòng)態(tài)波形輸出,這是其他方法所無法比擬的。本章提出了一種基于FPGA的直接數(shù)字頻率合成設(shè)計(jì)方法,并利用比例乘法器,將頻率分辨率提高到驚人的程度。 目錄 1 DDS原理 1 1.1 直接模擬(DAS) 1 1.2 間接式頻率合成(PLL) 1 1.3 直接數(shù)字頻率合成(DDS) 2 2 系統(tǒng)設(shè)計(jì) 6 2.1 微控制器接口模塊 8 2.2 相位累加寄存器 8 2.3 雙端口RAM 8 3 模塊設(shè)計(jì)與實(shí)現(xiàn) 15 3.1
7、 微控制器接口模塊 15 3.1.1 分頻寄存器(FWORD1-FWORD4) 16 3.1.2 控制寄存器(DDSCR) 16 3.1.3 數(shù)據(jù)輸入寄存器(DATA) 17 3.2 比例乘法器模塊 31 3.3 相位累加器模塊 37 3.4 雙端口RAM模塊 39 致 謝 48 參考文獻(xiàn) 49 51 1 DDS原理 顧名思義頻率合成技術(shù),就是能從一個(gè)高穩(wěn)定和準(zhǔn)確度的標(biāo)準(zhǔn)頻率中產(chǎn)生千百萬個(gè)同一高穩(wěn)定度和準(zhǔn)確度的頻率。頻率合成技術(shù)廣泛地應(yīng)用于通信、導(dǎo)航、雷達(dá)、儀器儀表、軍事裝備等領(lǐng)域、現(xiàn)代的電子系統(tǒng)對(duì)頻率合成
8、器提出越來越高的要求,主要表現(xiàn)在:轉(zhuǎn)換速度快、頻段寬、步進(jìn)間隔小、雜散小、體積小、重量輕、功耗低等。隨著大規(guī)模集成電路的發(fā)展,頻率合成技術(shù)日趨完善,目前,主要有以下幾種方式。 1.1 直接模擬(DAS) 直接模擬合成技術(shù)是通過對(duì)標(biāo)準(zhǔn)參考頻率進(jìn)行加、減、乘、除運(yùn)算而合成一系列相干頻率,其換頻率速度主要由電路部件響應(yīng)速度決定,相位噪聲指標(biāo)也還不錯(cuò)。主要技術(shù)問題是雜波干擾,由于直接模擬合成引入了大量的混頻器、倍頻器、分頻器,這些非線性的部件使得雜波抑制相當(dāng)困難、在實(shí)際應(yīng)用中,這種技術(shù)的電路結(jié)構(gòu)比較復(fù)雜,體積、重量、成本等方面缺點(diǎn)大大限制其應(yīng)用、 1.2 間接式頻率合成(PLL)
9、間接式頻率合成技術(shù)重要有鑒頻器、環(huán)路濾波器、壓控振蕩器、分頻器等4個(gè)基本部件構(gòu)成,如下圖1-1所示。鎖相環(huán)是一個(gè)相位誤差反饋控制系統(tǒng),它比較輸入信號(hào)和壓控振蕩器經(jīng)分頻后輸出信號(hào)之間的相位差,從而產(chǎn)生誤差控制電壓來調(diào)整壓控制振蕩器的輸出頻率,以達(dá)到與輸入信號(hào)倍頻的關(guān)系。鎖相環(huán)的頻率轉(zhuǎn)換速度與環(huán)路濾波器的帶寬有關(guān),環(huán)路帶寬越寬,轉(zhuǎn)換速度越快,而環(huán)路帶寬又取決于鑒相器頻率。才用這種技術(shù)產(chǎn)生的頻譜較純,系統(tǒng)體積小、重量輕、成本低、易集成,具有廣泛的應(yīng)用前景。但是,它也有一個(gè)致命的缺點(diǎn),就是在高分辨率情況下,換頻速度較慢。 分頻器 鑒相器 壓控振蕩器
10、 低通濾波器 合成頻率 參考頻率 圖 1-1 鎖相環(huán)電路基本結(jié)構(gòu) 為了解決高分辨率于高鑒相頻率之間的矛盾,可以采用多環(huán)技術(shù)或者小數(shù)分頻技術(shù)。如果要求分辨率很高,那么采用多環(huán)PLL就顯得電路結(jié)構(gòu)復(fù)雜、成本高、調(diào)試?yán)щy;而采用小數(shù)分頻技術(shù),可以輕易解決高分辨率問題,但是小數(shù)分頻的主要問題是“尾數(shù)難抑”,國(guó)內(nèi)外對(duì)這方面的研究不少,但是還沒有徹底解決。 1.3 直接數(shù)字頻率合成(DDS) DDS的概念最初是有美國(guó)學(xué)者J.Tierncy,C.M.Rader 和 B.Gold 提出的,它是以全數(shù)字技術(shù),從相位概念出發(fā)直接合成所需波形的一種新的頻率合成技術(shù),典型的DDS系統(tǒng)
11、由相位累加器,波形查找表(ROM/RAM),D/A,低通濾波器(Low Pass Filter簡(jiǎn)稱LPF)構(gòu)成,如圖 1-2所示。 低通濾波器 m 相位累加器 波形查找表 D/A 圖 1-2 DDS原理框圖 圖中,m為相位累加器步長(zhǎng),也有資料稱為頻率控制字,是參考頻率,是合成頻率。其系統(tǒng)的核心是相位累加器,它由一個(gè)累加器和一個(gè)n位相位寄存器組成(也可用帶有輸出鎖存的累加器代替),如圖1-3所示。每來一個(gè)時(shí)鐘脈沖,相位累加器以步長(zhǎng)m累加,其結(jié)果作為波形查找表地址。當(dāng)相位累加器加滿量程,就會(huì)產(chǎn)生一次溢出,完成一個(gè)周期性的動(dòng)作,這個(gè)周期是
12、合成信號(hào)的一個(gè)周期,換句話說,累加器的溢出頻率也就是DDS的合成信號(hào)頻率。 相位累加器的輸出數(shù)據(jù)作為波形查找表地址,進(jìn)行波形的相位—幅值的轉(zhuǎn)換,即可在給定的時(shí)間上確定輸出波形的抽樣幅值,如圖1-4所示。n位的尋址RAM/ROM相當(dāng)于把正弦信號(hào)離散成具有個(gè)樣值的序列,以二進(jìn)制數(shù)值形式存儲(chǔ)在個(gè)地址單元,按照地址不同輸出相應(yīng)的信號(hào)幅值。 D/A轉(zhuǎn)換器的作用是把合成的數(shù)字波形轉(zhuǎn)換成模擬波形。離散量化幅度序列S(n)經(jīng)D/A轉(zhuǎn)換后變成了階梯波S(t),值得注意的是,頻率合成系統(tǒng)對(duì)D/A轉(zhuǎn)換器的分辨率有一定要求,D/A轉(zhuǎn)換器的分辨率越高,合成的階梯波S(t)臺(tái)階數(shù)越多,輸出的波形的精度也就越高,減少了
13、量化失真。 寄存器 累加器步長(zhǎng)m 參考時(shí)鐘 相位碼序列 圖 1-3 相位累加器 波形存儲(chǔ)器 (ROM/RAM) 幅度量化序列 數(shù)據(jù) 相位嗎序列 地址 圖 1-4 相位幅度變換原理圖 低通濾波器的作用不容忽視。對(duì)D/A輸出的階梯波S(t)進(jìn)行頻譜分析,可知S(t)中除了主頻外,還存在分布在,2……兩邊處的非諧波分量。因此,為了取出主頻,必須在D/A轉(zhuǎn)換器的輸出端接入截止頻率為的低通濾波器。 DDS具有以下特點(diǎn): (1) 頻率分辨率高。DDS的頻率分辨率在固定時(shí),取決于相位累加器的位數(shù)n,只要n足夠大,理論上就可以
14、獲得相應(yīng)的分辨率精度,這是傳統(tǒng)方法難以實(shí)現(xiàn)的。 (2) 頻率變換速度快。在DDS中,一個(gè)頻率的建立時(shí)間通常取決于濾波器的帶寬。影響因素為相位累加器,ROM/RAM的工藝結(jié)構(gòu),D/A轉(zhuǎn)換器及它信號(hào)處理過程中可能產(chǎn)生的時(shí)延。其中,信號(hào)處理的時(shí)延與時(shí)鐘周期相關(guān)。由于DDS中不要相位反饋控制,頻率建立及切換快,與頻率分辨率,頻譜純度相互獨(dú)立,明顯優(yōu)于PLL。 (3) DDS中相位改變是線性過程。數(shù)字相位累加器是優(yōu)良的線性數(shù)字增值發(fā)生器。因此,DDS的相位誤差主要依賴于時(shí)鐘的相位特性,相位誤差小。另外,DDS的相位是連續(xù)變化的,形成的信號(hào)具有良好的頻譜特性,這是傳統(tǒng)的直接頻率合成法所無法實(shí)現(xiàn)的。
15、(4)輸出頻率范圍寬。 理論上,DDS輸出的頻率范圍在,實(shí)際上,考慮到低通濾波器的設(shè)計(jì),為,而FPGA的時(shí)鐘頻率可達(dá)到100MHz,因此,利用FPGA,可以實(shí)現(xiàn)輸出頻率范圍很寬的信號(hào)。 根據(jù)前面的講述,可以得到一下公式: 其中,是輸出波形的周期,n是相位累加器位數(shù),m是相位累加器步長(zhǎng),是輸入波形周期。是參考頻率,是輸出波形頻率,是最小分辨率,是最高合成頻率。根據(jù)奈奎斯特(Nyquist)定理,即采樣頻率必須不小于被采樣信號(hào)的最高頻率,否則原信號(hào)不能被恢復(fù),所以當(dāng)時(shí),得到最高合成頻率,當(dāng)然,這僅是理論值,實(shí)際上與D/A精度、轉(zhuǎn)換速度,
16、濾波網(wǎng)絡(luò)性能密切相關(guān),一般取,例如,晶振時(shí)鐘為100MHz時(shí),可知輸出合成波頻率將出現(xiàn)在較寬頻段上。 2 系統(tǒng)設(shè)計(jì) 本章所需要設(shè)計(jì)的直接數(shù)字頻率合成系統(tǒng)與前面介紹的DDS原理完全一致。從實(shí)現(xiàn)方式上看,有如下特色: (1) 引入8級(jí)級(jí)聯(lián)的BCD比例乘法器,將頻率分辨率提高100萬倍! (2) 利用FPGA內(nèi)部嵌入式存儲(chǔ)單元,在FPGA內(nèi)部集成了2Kbit容量雙端口RAM,降低了硬件難度,提高了系統(tǒng)可靠性。 從前面的介紹中可以知道,增加相位累加器的位數(shù)n,可以提高頻
17、率分辨率,最低輸出頻率可達(dá)Hz、mHz甚至是μHz,即DDS的最低合成頻率接近零頻。有人計(jì)算過,如果為50MHz,那么當(dāng)n為48位時(shí),其分辨率可達(dá)179nHz。但是,增加相位累加器的位數(shù)n將使加法算法過于龐大,消耗驚人的FPGA資源。何不從入手,對(duì)實(shí)現(xiàn)任意可分頻,利用降低來換取高分辨率呢? 事實(shí)證明,使用比例乘法器是可行的,經(jīng)過8級(jí)BCD比例乘法器的分頻,分頻比達(dá)到,例如,晶振頻率為100MHz,經(jīng)過分頻可以是Hz任意整數(shù)頻率,整個(gè)分頻模塊僅消耗65個(gè)宏單元。 現(xiàn)代FPGA內(nèi)部集成了存儲(chǔ)單元,這些是寶貴的存儲(chǔ)資源,通常只有通過利用開發(fā)商提供的知識(shí)產(chǎn)權(quán)核(IP CORE)才能使用,這些知識(shí)產(chǎn)
18、權(quán)核經(jīng)過嚴(yán)格的測(cè)試和優(yōu)化,可以在特定器件上發(fā)揮最大效能,利用這些模塊,就是將優(yōu)秀EDA開發(fā)人員的硬件成果嵌入到自己設(shè)計(jì)中,縮短了開發(fā)時(shí)間,提高了效率。 本章設(shè)計(jì)的參數(shù)選取如下。 由相位累加器位數(shù)n=8,存儲(chǔ)容量2568=2048 bit,晶振頻率為100MHz,可知: (1) 頻率分辨率 Hz (2) 最高合成頻率 MHZ 前面講過,這僅是理論值,實(shí)際中與具體電路(D/A,濾波器)有關(guān)。 (3) 相位步進(jìn) 本設(shè)計(jì)按照模塊化層次化設(shè)計(jì)方法,根據(jù)結(jié)構(gòu)功能,可以劃分出3個(gè)功能模塊,即微控制器接口模塊、相位累加器模塊、雙端口RAM模塊,其連接關(guān)系如圖2-1所示。
19、圖 2-1 2.1 微控制器接口模塊 微控制器接口模塊向微控制器提供友好,方便的操作接口,MCU可通過片選(CS)、地址選通(AS)、數(shù)據(jù)選通(DS)、數(shù)據(jù)總線和地址總線來操作其內(nèi)部寄存器。微控制器接口模塊內(nèi)部實(shí)現(xiàn)了6個(gè)寄存器,其中,4個(gè)位分頻寄存器,1個(gè)位控制寄存器,1個(gè)位數(shù)據(jù)輸入寄存器。此外,8級(jí)比例乘法器組成的分頻模塊以端口映射的方式例化在控制器接口模塊中,對(duì)外輸出參考時(shí)鐘頻率fclk。 2.2 相位累加寄存器 相位累加寄存器是系統(tǒng)的核心模塊,使用經(jīng)過分頻器分頻后的時(shí)鐘,范圍相當(dāng)寬廣。相位累加器輸出相位碼序列,作為查尋地址送入雙端口RAM,相應(yīng)地,還有讀使能和讀時(shí)鐘信號(hào)。相
20、位累加步長(zhǎng)m可取,n=0,1,2, …,7這里,為了減小失真,一般m取值不超過32 2.3 雙端口RAM 利用ALtera提供的Mega Wizard Plug-In Manager定制了數(shù)據(jù)線和地址線寬度均為8位,存儲(chǔ)容量為2048bit的雙端口RAM,獨(dú)立的兩套讀/寫接口,有興趣的讀者不妨使用Mega Wizard Plug-In Manager定制其他的存儲(chǔ)器,看看哪種存儲(chǔ)器使用起來最方便。 接口信號(hào)說明如下: RESET,系統(tǒng)復(fù)位,低電平有效; CS,片選信號(hào),低電平有效; AS,地址選通信號(hào),低電平有效; DS,數(shù)據(jù)選通信號(hào),低電平有效; DATABUS,數(shù)
21、據(jù)總線;寬度為8位; ADDRBUS,地址總線,寬度為3位。 頂層實(shí)體的VHDL程序如下: -- dds.vhd LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY dds IS PORT( -- 與微控制器接口信號(hào) -- 全局復(fù)位 reset : IN STD_LOGIC; -- 全局時(shí)鐘 clk : IN STD_LOGIC; -- 地址總線 ad
22、drbus : IN STD_LOGIC_VECTOR(2 DOWNTO 0); -- 數(shù)據(jù)總線 databus : IN STD_lOGIC_VECTOR(7 DOWNTO 0); -- 片選 cs : IN STD_LOGIC; -- 地址選通 as : IN STD_LOGIC; -- 數(shù)據(jù)選通 ds : IN STD_LOGIC; -- 數(shù)據(jù)輸出,送至D/A轉(zhuǎn)換器 q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END dds; ARCHITECTURE rtl o
23、f dds IS -- 元件說明 -- 接口模塊 COMPONENT interface port( -- 與微控制器接口信號(hào) -- 全局復(fù)位 reset : IN STD_LOGIC; -- 全局時(shí)鐘 clk : IN STD_LOGIC; -- 地址總線 addrbus : IN STD_LOGIC_VECTOR(2 DOWNTO 0); -- 數(shù)據(jù)總線 databus : IN STD_lOGIC_VECTOR(7 DOWNTO 0); -- 片選 cs : IN STD_LOGIC; --
24、地址選通 as : IN STD_LOGIC; -- 數(shù)據(jù)選通 ds : IN STD_LOGIC; -- 與內(nèi)部模塊接口信號(hào) -- DDS掃頻使能 ddsen : OUT STD_LOGIC; -- 經(jīng)比例乘法器分頻后的時(shí)鐘 fclk : OUT STD_LOGIC; -- 步長(zhǎng) m : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- 數(shù)據(jù)輸出,送至雙端口RAM dataout : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- 地址輸
25、出,送至雙端口RAM addrout : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- 雙端口RAM寫使能 wren : OUT STD_LOGIC; -- 雙端口RAM寫時(shí)鐘 wrclock : OUT STD_LOGIC ); END COMPONENT; -- 雙端口RAM COMPONENT ramdp PORT( wren : IN STD_LOGIC; wrclock : IN STD_LOGIC; rden : IN STD_LOGIC; rdclock : IN
26、STD_LOGIC; data : IN STD_LOGIC_VECTOR(7 DOWNTO 0); wraddress:IN STD_LOGIC_VECTOR(7 DOWNTO 0); rdaddress:IN STD_LOGIC_VECTOR(7 DOWNTO 0); q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END COMPONENT; -- 相位累加器 COMPONENT phasesum PORT( -- 全局復(fù)位 reset : IN STD_LOGIC; -- 分頻時(shí)
27、鐘 fclk : IN STD_LOGIC; -- 掃頻使能 ddsen : IN STD_LOGIC; -- 相位累加步長(zhǎng) m : IN STD_LOGIC_VECTOR(7 DOWNTO 0); -- 讀RAM時(shí)鐘 rdclock : OUT STD_LOGIC; -- 讀RAM使能 rden : OUT STD_LOGIC; -- 讀RAM地址 rdaddress:OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END COMPONENT; -- 信號(hào)說明 SIGNAL
28、 ddsen : STD_LOGIC; SIGNAL fclk : STD_LOGIC; SIGNAL wren : STD_LOGIC; SIGNAL wrclock : STD_LOGIC; SIGNAL rdclock : STD_LOGIC; SIGNAL rden : STD_LOGIC; SIGNAL dataout : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL addrout : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL m : STD_LOGIC_VECT
29、OR(7 DOWNTO 0); SIGNAL rdaddress : STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN ------------------------------------------------------------ -- 元件例化 ------------------------------------------------------------ INTER_CONTROL: interface PORT MAP( -- 與微控制器接口信號(hào) -- 全局復(fù)位 reset => reset,
30、 -- 全局時(shí)鐘 clk => clk, -- 地址總線 addrbus => addrbus, -- 數(shù)據(jù)總線 databus => databus, -- 片選 cs => cs, -- 地址選通 as => as, -- 數(shù)據(jù)選通 ds => ds, -- 與內(nèi)部模塊接口信號(hào) -- DDS掃頻使能 ddsen => ddsen, -- 經(jīng)比例乘法器分頻后的時(shí)鐘 fclk => fclk, -- 步長(zhǎng) m => m,
31、 -- 數(shù)據(jù)輸出,送至雙端口RAM dataout => dataout, -- 地址輸出,送至雙端口RAM addrout => addrout, -- 雙端口RAM寫使能 wren => wren, -- 雙端口RAM寫時(shí)鐘 wrclock => wrclock ); -- 雙端口RAM DP_RAM: ramdp PORT MAP( wren => wren, wrclock => wrclock, rden => rden, rdclock => rdclock,
32、data => dataout, wraddress=>addrout, rdaddress=>rdaddress, q => q ); -- 相位累加器 PHASE_ADDER: phasesum PORT MAP( -- 全局復(fù)位 reset => reset, -- 分頻時(shí)鐘 fclk => fclk, -- 掃頻使能 ddsen => ddsen, -- 相位累加步長(zhǎng) m => m, -- 讀RAM時(shí)鐘 rdclock => rdclock,
33、 -- 讀RAM使能 rden => rden, -- 讀RAM地址 rdaddress=>rdaddress ); END rtl; 圖 2-2是頂層實(shí)體仿真波形,由圖中可以看到,首先,向地址為000的寄存器寫數(shù)據(jù)00010000,表示將晶振頻率10分頻,然后向地址為100的寄存器寫數(shù)據(jù)10000000,表示相位累加器使能,隨后,輸出波形。讀者可能暫時(shí)還不能理解整個(gè)系統(tǒng)的工作原理,這里只需了解系統(tǒng)的輪廓即可,后面會(huì)詳細(xì)介紹各模塊的設(shè)計(jì)與實(shí)現(xiàn)。 3 模塊設(shè)計(jì)與實(shí)現(xiàn) 如前面所述,頂層實(shí)體由3個(gè)模塊構(gòu)成:
34、微控制器接口模塊、相位累加器模塊及雙端口RAM模塊。由8個(gè)比例乘法器級(jí)聯(lián)組成的分頻器模塊以端口定義的形式例化在微控制器模塊中,屬于后者的子模塊,但是由于比例乘法器的本設(shè)計(jì)中所發(fā)揮的作用很大,加之相關(guān)資料少之又少,為了加深讀者的領(lǐng)悟,決定單獨(dú)作為一節(jié)。 3.1 微控制器接口模塊 微控制器接口向8位、16位、32位微處理器級(jí)微控制器提供友好的操作接口,如圖3-1所示。其輸入引腳前面已經(jīng)介紹過,這里不再重復(fù)?,F(xiàn)在,介紹一下輸出引腳。 圖 3-1 ddsen:相位累加器使能,有效時(shí)為高電平; fclk:分頻時(shí)鐘,作為相位累加器的輸入時(shí)鐘; m:相位累加步長(zhǎng),m=,n=0,1
35、,2, …,7; dataout:數(shù)據(jù)輸出,作為RAM輸入數(shù)據(jù); addrout:地址輸出,作為RAM輸入地址; wern:RAM寫使能信號(hào); wrclock:RAM寫時(shí)鐘信號(hào)。 前面已經(jīng)提到,DDS內(nèi)部實(shí)現(xiàn)了6個(gè)寄存器,其中,4個(gè)位分頻寄存器,1個(gè)位控制寄存器,1個(gè)位數(shù)據(jù)輸入寄存器,這些寄存器的地址在表3-1中。 表 3-1 寄存器地址 名稱 訪問屬性 地址 FWORD1 Write 000 FWORD2 Write 001 FWORD3 Write 010 FWORD4 Write 011 DDSCR Write 100 DATA Wri
36、te 101 3.1.1 分頻寄存器(FWORD1-FWORD4) 以FWORD1為例,如表3-2所示。分頻寄存器用于存儲(chǔ)分頻系數(shù),分頻模塊由8個(gè)BCD比例乘法器構(gòu)成。每一個(gè)比例乘法器需要4位二進(jìn)制碼來確定分頻系數(shù),48=32 bit,也就是4 byte。FWORD1對(duì)應(yīng)第一級(jí)和第二級(jí)比例乘法器,F(xiàn)WORD2對(duì)應(yīng)第三級(jí)和第四級(jí)比例乘法器,以此類推,F(xiàn)WORD4對(duì)應(yīng)第七級(jí)和第八級(jí)比例乘法器。 表3-2 分頻寄存器FWORD1 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 3.1.2 控制寄存器(
37、DDSCR) 如表3-3所示,控制寄存器只有4位是有意義的,ddsen為相位累加器使能,當(dāng)其為有效時(shí)(邏輯1),相位累加器工作,輸出波形。m2、m1、m0是相位累加步長(zhǎng)控制字,由于系統(tǒng)設(shè)計(jì)中規(guī)定相位累加步長(zhǎng)m=,n=0,1,2, …,7,所以使用3位表示他們足夠了,對(duì)應(yīng)的累加步長(zhǎng)值如表3-4所示。 表 3-3 控制寄存器 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 DDSEN 0 0 0 0 M2 M1 M0 表 3-4 m2m1m0與相位累加步長(zhǎng)m對(duì)照表 m2m1m0 m 000 1 001 2
38、010 4 011 8 100 16 101 32 110 64 111 128 3.1.3 數(shù)據(jù)輸入寄存器(DATA) 如表3-5所示,微控制器通過數(shù)據(jù)輸入寄存器緩沖,將數(shù)據(jù)寫入雙端口RAM中。復(fù)位時(shí),地址為0,每向DATA寄存器寫一次數(shù)據(jù),地址自動(dòng)加1,直到地址寫滿,自動(dòng)清零,準(zhǔn)備下一次寫入過程。這意味著可以重復(fù)多次寫波形數(shù)據(jù),從而實(shí)現(xiàn)任意波形輸出和動(dòng)態(tài)波形輸出的功能。 表 3-5 控制寄存器 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 DATA7 DATA6 DATA5 DATA4 DATA
39、3 DATA2 DATA1 DATA0 本模塊通過片選信號(hào)、地址選通信號(hào)、數(shù)據(jù)選通信號(hào)來鎖定地址和數(shù)據(jù),當(dāng)片選信號(hào)CS和地址選通信號(hào)AS有效時(shí),根據(jù)地址總線內(nèi)容使能對(duì)應(yīng)寄存器。在檢測(cè)到數(shù)據(jù)選通信號(hào)DS下降沿后,在系統(tǒng)時(shí)鐘的上升沿將數(shù)據(jù)寫入選中的寄存器中。 微控制器接口模塊的狀態(tài)機(jī)如圖3-2所示: (1) IDLE。當(dāng)系統(tǒng)上電或復(fù)位后,微控制器接口處于此狀態(tài)。此狀態(tài)等待片選信號(hào)有效和AS信號(hào)的下降沿,當(dāng)條件滿足時(shí),狀態(tài)機(jī)切換到STROBE狀態(tài)。 (2) STROBE。當(dāng)片選信號(hào)有效時(shí),狀態(tài)機(jī)在此狀態(tài)等待,直到DS信號(hào)出現(xiàn)下降時(shí)沿,切換到DATA_LAUNCH狀態(tài);當(dāng)片選信號(hào)無效
40、時(shí),狀態(tài)機(jī)切換到IDLE狀態(tài)。 (3) DATA_LAUNCH。 此狀態(tài)只持續(xù)1個(gè)時(shí)鐘周期,在時(shí)鐘上升沿寫入數(shù)據(jù),返回IDLE狀態(tài)。 圖 3-2 微控制器接口狀態(tài)機(jī) 文件interface內(nèi)部的各進(jìn)程說明: 第一個(gè)進(jìn)程延遲信號(hào),目的是檢測(cè)信號(hào)跳變。 第二個(gè)進(jìn)程是狀態(tài)寄存器,同步狀態(tài)。 第三個(gè)進(jìn)程是主狀態(tài)機(jī)。 第四個(gè)進(jìn)程是寫RAM狀態(tài)機(jī)。 第五個(gè)進(jìn)程根據(jù)地址譯碼,使能對(duì)應(yīng)寄存器。 第六個(gè)進(jìn)程根據(jù)使能,寫對(duì)應(yīng)寄存器。 描述微控制器接口模塊的VHDL程序如下: -- interface.vhd LIBRARY IEEE; USE IEEE.STD_LOGIC_
41、1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY interface IS port( -- 與微控制器接口信號(hào) -- 全局復(fù)位 reset : IN STD_LOGIC; -- 全局時(shí)鐘 clk : IN STD_LOGIC; -- 地址總線 addrbus : IN STD_LOGIC_VECTOR(2 DOWNTO 0); -- 數(shù)據(jù)總線 databus : IN STD_lOGIC_VECTOR(7 DO
42、WNTO 0); -- 片選 cs : IN STD_LOGIC; -- 地址選通 as : IN STD_LOGIC; -- 數(shù)據(jù)選通 ds : IN STD_LOGIC; -- 與內(nèi)部模塊接口信號(hào) -- DDS掃頻使能 ddsen : OUT STD_LOGIC; -- 經(jīng)比例乘法器分頻后的時(shí)鐘 fclk : OUT STD_LOGIC; -- 步長(zhǎng) m : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- 數(shù)據(jù)輸出,送至雙端口RAM dataou
43、t : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- 地址輸出,送至雙端口RAM addrout : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- 雙端口RAM寫使能 wren : OUT STD_LOGIC; -- 雙端口RAM寫時(shí)鐘 wrclock : OUT STD_LOGIC ); END interface; ARCHITECTURE rtl of interface IS -- 元件說明 -- 8個(gè)比例乘法器級(jí)聯(lián) COMPONENT fre_div PORT(
44、 -- 輸入時(shí)鐘 FIN : IN STD_LOGIC; -- 分頻系數(shù) BCD1 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); BCD2 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); BCD3 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); BCD4 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); BCD5 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); BCD6 : IN STD_LOGIC_VECTOR(3
45、DOWNTO 0); BCD7 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); BCD8 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); -- 分頻時(shí)鐘 FOUT : OUT STD_LOGIC ); END COMPONENT; -- 常數(shù)聲明 CONSTANT RESET_ACTIVE : STD_LOGIC := 0; CONSTANT FWORD1_ADDR : STD_LOGIC_VECTOR(2 downto 0) := "000"; CONSTANT FWORD2_ADDR :
46、STD_LOGIC_VECTOR(2 downto 0) := "001"; CONSTANT FWORD3_ADDR : STD_LOGIC_VECTOR(2 downto 0) := "010"; CONSTANT FWORD4_ADDR : STD_LOGIC_VECTOR(2 downto 0) := "011"; CONSTANT DDSCR_ADDR : STD_LOGIC_VECTOR(2 downto 0) := "100"; CONSTANT DATA_ADDR : STD_LOGIC_VECTOR(2 downto 0) := "101"; -- 信號(hào)
47、聲明 SIGNAL as_delay : STD_LOGIC; SIGNAL ds_delay : STD_LOGIC; SIGNAL bcd8 : STD_LOGIC_VECTOR(3 downto 0); SIGNAL bcd7 : STD_LOGIC_VECTOR(3 downto 0); SIGNAL bcd6 : STD_LOGIC_VECTOR(3 downto 0); SIGNAL bcd5 : STD_LOGIC_VECTOR(3 downto 0); SIGNAL bcd4 : STD_LOGIC_VECTOR(3 dow
48、nto 0); SIGNAL bcd3 : STD_LOGIC_VECTOR(3 downto 0); SIGNAL bcd2 : STD_LOGIC_VECTOR(3 downto 0); SIGNAL bcd1 : STD_LOGIC_VECTOR(3 downto 0); -- 狀態(tài)機(jī)定義 TYPE STATE_TYPE IS (IDLE,STROBE,DATA_LAUNCH); -- 狀態(tài)機(jī)信號(hào) SIGNAL prs_state, next_state : STATE_TYPE; -- 狀態(tài)機(jī)定義 TYPE WR_STATE_TYPE IS (
49、wr_idle,wr_high,wr_low); -- 狀態(tài)機(jī)信號(hào) SIGNAL wr_state : WR_STATE_TYPE; SIGNAL DDSCR_reg : STD_LOGIC_VECTOR(7 downto 0); SIGNAL wrclock_reg : STD_LOGIC; SIGNAL wren_reg : STD_LOGIC; SIGNAL ramaddress : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL ramdata : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL
50、fout : STD_LOGIC; -- FWORD1寄存器使能 SIGNAL f1_en : STD_LOGIC; -- FWORD2寄存器使能 SIGNAL f2_en : STD_LOGIC; -- FWORD3寄存器使能 SIGNAL f3_en : STD_LOGIC; -- FWORD4寄存器使能 SIGNAL f4_en : STD_LOGIC; -- DDSCR 寄存器使能 SIGNAL cr_en : STD_LOGIC; -- DDSDATA寄存器使能 SIGNAL data_en : STD_LOGIC;
51、 BEGIN ------------------------------------------------------------ -- Delayed Signals Detection Process ------------------------------------------------------------ -- 檢測(cè)延遲信號(hào) Delay_Signals_Proc: PROCESS(reset,clk) BEGIN IF(reset = RESET_ACTIVE) THEN as_delay <= 1; ds
52、_delay <= 1; ELSIF rising_edge(clk) THEN as_delay <= as; ds_delay <= ds; END IF; END PROCESS; ------------------------------------------------------------ -- Status Register Process ------------------------------------------------------------ -- 狀態(tài)寄存器 -- 同步狀態(tài) State_Regi
53、ster_Proc: PROCESS (clk, reset) BEGIN IF reset = RESET_ACTIVE THEN prs_state <= IDLE; ELSIF rising_edge(clk) THEN prs_state <= next_state; END IF; END PROCESS; ------------------------------------------------------------ -- Next Status Logic Process ------------------------
54、------------------------------------ -- 次態(tài)邏輯 Next_Logic_Proc: PROCESS (prs_state, as,as_delay,ds,ds_delay,cs) BEGIN next_state <= prs_state; CASE prs_state IS ------------- 空閑狀態(tài) (00) ------------- WHEN IDLE => -- 等待as的下降沿 IF cs = 0 THEN -- 片選,低有? IF as
55、 = 0 AND as_delay = 1 THEN next_state <= STROBE; END IF; END IF; ------------ 選通狀態(tài) (01) -------------- WHEN STROBE => -- 等待ds的下降沿 IF cs = 0 THEN IF ds = 0 AND ds_delay = 1 THEN next_state <= DATA_LAUNCH; ELSIF ds = 1 THEN next_sta
56、te <= STROBE; END IF; ELSE next_state <= IDLE; END IF; ---------- 讀/寫狀態(tài) (10) --------------- WHEN DATA_LAUNCH => -- 回到空閑狀態(tài) next_state <= IDLE; END CASE; END PROCESS; ------------------------------------------------------------ -- wr state Process -
57、----------------------------------------------------------- -- wr信號(hào)狀態(tài)機(jī) Wr_Logic_Proc: PROCESS (clk,reset) BEGIN IF reset = RESET_ACTIVE THEN wren_reg <= 0; wrclock_reg <= 0; ramaddress <= "00000000"; wr_state <= wr_idle; ELSIF rising_edge(clk) THEN CASE wr_state IS
58、 ------------- 空閑狀態(tài) (00) ------------- WHEN wr_idle => wren_reg <= 0; wrclock_reg <= 0; IF prs_state = DATA_LAUNCH THEN IF data_en = 1 THEN wren_reg <= 1; ramdata <= databus; wr_state <= wr_high; END IF; END IF; -----------
59、- 低狀態(tài) (01) -------------- WHEN wr_high => -- 產(chǎn)生wr上升沿 wrclock_reg <= 1; wr_state <= wr_low; ---------- 高狀態(tài) (10) --------------- WHEN wr_low => wrclock_reg <= 0; -- 計(jì)算RAM地址 IF ramaddress = "11111111" THEN ramaddress <= "00000000"; ELSE
60、 ramaddress <= ramaddress + 1; END IF; -- 回到空閑狀態(tài) wr_state <= wr_idle; END CASE; END IF; END PROCESS; ------------------------------------------------------------ -- 寫雙端口RAM的信號(hào) ------------------------------------------------------------ wrclock <= wrclock_
61、reg; wren <= wren_reg; dataout <= ramdata; addrout <= ramaddress; ------------------------------------------------------------ -- ADDR_DECODE Process ------------------------------------------------------------ -- 地址譯碼 Addr_Decode_Proc: PROCESS (reset, clk, addrbus, cs, as) BEGI
62、N IF reset = RESET_ACTIVE THEN f1_en <= 0; f2_en <= 0; f3_en <= 0; f4_en <= 0; cr_en <= 0; data_en<=0; -- 在時(shí)鐘的上升沿同步 ELSIF rising_edge(clk) THEN IF cs = 0 AND as = 0 THEN -- 根據(jù)地址,使能對(duì)應(yīng)寄存器 CASE addrbus IS WHEN FWORD1_ADDR =>
63、 f1_en <= 1; f2_en <= 0; f3_en <= 0; f4_en <= 0; cr_en <= 0; data_en<=0; WHEN FWORD2_ADDR => f1_en <= 0; f2_en <= 1; f3_en <= 0; f4_en <= 0; cr_en <= 0; data_en<=0; WHEN FWORD3_ADDR
64、 => f1_en <= 0; f2_en <= 0; f3_en <= 1; f4_en <= 0; cr_en <= 0; data_en<=0; WHEN FWORD4_ADDR => f1_en <= 0; f2_en <= 0; f3_en <= 0; f4_en <= 1; cr_en <= 0; data_en<=0; WHEN DDSCR_ADDR =
65、> f1_en <= 0; f2_en <= 0; f3_en <= 0; f4_en <= 0; cr_en <= 1; data_en<=0; WHEN DATA_ADDR => f1_en <= 0; f2_en <= 0; f3_en <= 0; f4_en <= 0; cr_en <= 0; data_en<=1; WHEN others =>
66、 f1_en <= 0; f2_en <= 0; f3_en <= 0; f4_en <= 0; cr_en <= 0; data_en<=0; END CASE; ELSE f1_en <= 0; f2_en <= 0; f3_en <= 0; f4_en <= 0; cr_en <= 0; data_en<=0; END IF; END IF; END PROCESS; ---------------------------------------------
- 溫馨提示:
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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識(shí)競(jìng)賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識(shí)測(cè)試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測(cè)工種技術(shù)比武題庫含解析
- 1 礦山應(yīng)急救援安全知識(shí)競(jìng)賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案