基于fpga的直接數(shù)字頻率合成器的設(shè)計 本科畢業(yè)設(shè)計
《基于fpga的直接數(shù)字頻率合成器的設(shè)計 本科畢業(yè)設(shè)計》由會員分享,可在線閱讀,更多相關(guān)《基于fpga的直接數(shù)字頻率合成器的設(shè)計 本科畢業(yè)設(shè)計(55頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、河南理工大學(xué)畢業(yè)設(shè)計(論文)說明書 畢業(yè)設(shè)計論文 基于FPGA的直接數(shù)字頻率合成器的設(shè)計 摘要 在頻率合成領(lǐng)域,常用的頻率合成技術(shù)有直接模擬合成、模擬鎖相環(huán)、小數(shù)分頻鎖相環(huán)等,直接數(shù)字頻率合成(Direct Digital Frequency Synthesis ,DDFS,簡稱DDS)是近年來的新的頻率合成技術(shù)。本文介紹了直接數(shù)字頻率合成器的基本組成及設(shè)計原理,給出了基于FPGA的具體設(shè)計方案及編程實現(xiàn)方法。仿真結(jié)果表明,該設(shè)計簡單合理,使用靈活方便,通用性好,可寫入各種FPGA芯片,最高可將頻率提高100萬倍。具有良好的性價比。 關(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ù)字信號處理,再通過高速D/A變換器產(chǎn)生所需的數(shù)字波形,這個數(shù)字濾波經(jīng)過一個模擬濾波器后,得到最終的模擬信號波形。DDS是產(chǎn)生高精度、快速頻率變換、輸出波形失真小的優(yōu)先選用技術(shù)。 隨著可編程邏輯器件的飛速發(fā)展,使用FPGA(Field-Programmable Gate Array)設(shè)計DDS系統(tǒng)成為一種很好的選擇,由于FPGA現(xiàn)場可編程,設(shè)計復(fù)雜或者簡單系統(tǒng)
6、完全從實際需要出發(fā),通過重寫RAM/ROM數(shù)據(jù),可以做到任意波形輸出和動態(tài)波形輸出,這是其他方法所無法比擬的。本章提出了一種基于FPGA的直接數(shù)字頻率合成設(shè)計方法,并利用比例乘法器,將頻率分辨率提高到驚人的程度。 目錄 1 DDS原理 1 1.1 直接模擬(DAS) 1 1.2 間接式頻率合成(PLL) 1 1.3 直接數(shù)字頻率合成(DDS) 2 2 系統(tǒng)設(shè)計 6 2.1 微控制器接口模塊 8 2.2 相位累加寄存器 8 2.3 雙端口RAM 8 3 模塊設(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 參考文獻 49 51 1 DDS原理 顧名思義頻率合成技術(shù),就是能從一個高穩(wěn)定和準確度的標準頻率中產(chǎn)生千百萬個同一高穩(wěn)定度和準確度的頻率。頻率合成技術(shù)廣泛地應(yīng)用于通信、導(dǎo)航、雷達、儀器儀表、軍事裝備等領(lǐng)域、現(xiàn)代的電子系統(tǒng)對頻率合成
8、器提出越來越高的要求,主要表現(xiàn)在:轉(zhuǎn)換速度快、頻段寬、步進間隔小、雜散小、體積小、重量輕、功耗低等。隨著大規(guī)模集成電路的發(fā)展,頻率合成技術(shù)日趨完善,目前,主要有以下幾種方式。 1.1 直接模擬(DAS) 直接模擬合成技術(shù)是通過對標準參考頻率進行加、減、乘、除運算而合成一系列相干頻率,其換頻率速度主要由電路部件響應(yīng)速度決定,相位噪聲指標也還不錯。主要技術(shù)問題是雜波干擾,由于直接模擬合成引入了大量的混頻器、倍頻器、分頻器,這些非線性的部件使得雜波抑制相當困難、在實際應(yīng)用中,這種技術(shù)的電路結(jié)構(gòu)比較復(fù)雜,體積、重量、成本等方面缺點大大限制其應(yīng)用、 1.2 間接式頻率合成(PLL)
9、間接式頻率合成技術(shù)重要有鑒頻器、環(huán)路濾波器、壓控振蕩器、分頻器等4個基本部件構(gòu)成,如下圖1-1所示。鎖相環(huán)是一個相位誤差反饋控制系統(tǒng),它比較輸入信號和壓控振蕩器經(jīng)分頻后輸出信號之間的相位差,從而產(chǎn)生誤差控制電壓來調(diào)整壓控制振蕩器的輸出頻率,以達到與輸入信號倍頻的關(guān)系。鎖相環(huán)的頻率轉(zhuǎn)換速度與環(huán)路濾波器的帶寬有關(guān),環(huán)路帶寬越寬,轉(zhuǎn)換速度越快,而環(huán)路帶寬又取決于鑒相器頻率。才用這種技術(shù)產(chǎn)生的頻譜較純,系統(tǒng)體積小、重量輕、成本低、易集成,具有廣泛的應(yīng)用前景。但是,它也有一個致命的缺點,就是在高分辨率情況下,換頻速度較慢。 分頻器 鑒相器 壓控振蕩器
10、 低通濾波器 合成頻率 參考頻率 圖 1-1 鎖相環(huán)電路基本結(jié)構(gòu) 為了解決高分辨率于高鑒相頻率之間的矛盾,可以采用多環(huán)技術(shù)或者小數(shù)分頻技術(shù)。如果要求分辨率很高,那么采用多環(huán)PLL就顯得電路結(jié)構(gòu)復(fù)雜、成本高、調(diào)試困難;而采用小數(shù)分頻技術(shù),可以輕易解決高分辨率問題,但是小數(shù)分頻的主要問題是“尾數(shù)難抑”,國內(nèi)外對這方面的研究不少,但是還沒有徹底解決。 1.3 直接數(shù)字頻率合成(DDS) DDS的概念最初是有美國學(xué)者J.Tierncy,C.M.Rader 和 B.Gold 提出的,它是以全數(shù)字技術(shù),從相位概念出發(fā)直接合成所需波形的一種新的頻率合成技術(shù),典型的DDS系統(tǒng)
11、由相位累加器,波形查找表(ROM/RAM),D/A,低通濾波器(Low Pass Filter簡稱LPF)構(gòu)成,如圖 1-2所示。 低通濾波器 m 相位累加器 波形查找表 D/A 圖 1-2 DDS原理框圖 圖中,m為相位累加器步長,也有資料稱為頻率控制字,是參考頻率,是合成頻率。其系統(tǒng)的核心是相位累加器,它由一個累加器和一個n位相位寄存器組成(也可用帶有輸出鎖存的累加器代替),如圖1-3所示。每來一個時鐘脈沖,相位累加器以步長m累加,其結(jié)果作為波形查找表地址。當相位累加器加滿量程,就會產(chǎn)生一次溢出,完成一個周期性的動作,這個周期是
12、合成信號的一個周期,換句話說,累加器的溢出頻率也就是DDS的合成信號頻率。 相位累加器的輸出數(shù)據(jù)作為波形查找表地址,進行波形的相位—幅值的轉(zhuǎn)換,即可在給定的時間上確定輸出波形的抽樣幅值,如圖1-4所示。n位的尋址RAM/ROM相當于把正弦信號離散成具有個樣值的序列,以二進制數(shù)值形式存儲在個地址單元,按照地址不同輸出相應(yīng)的信號幅值。 D/A轉(zhuǎn)換器的作用是把合成的數(shù)字波形轉(zhuǎn)換成模擬波形。離散量化幅度序列S(n)經(jīng)D/A轉(zhuǎn)換后變成了階梯波S(t),值得注意的是,頻率合成系統(tǒng)對D/A轉(zhuǎn)換器的分辨率有一定要求,D/A轉(zhuǎn)換器的分辨率越高,合成的階梯波S(t)臺階數(shù)越多,輸出的波形的精度也就越高,減少了
13、量化失真。 寄存器 累加器步長m 參考時鐘 相位碼序列 圖 1-3 相位累加器 波形存儲器 (ROM/RAM) 幅度量化序列 數(shù)據(jù) 相位嗎序列 地址 圖 1-4 相位幅度變換原理圖 低通濾波器的作用不容忽視。對D/A輸出的階梯波S(t)進行頻譜分析,可知S(t)中除了主頻外,還存在分布在,2……兩邊處的非諧波分量。因此,為了取出主頻,必須在D/A轉(zhuǎn)換器的輸出端接入截止頻率為的低通濾波器。 DDS具有以下特點: (1) 頻率分辨率高。DDS的頻率分辨率在固定時,取決于相位累加器的位數(shù)n,只要n足夠大,理論上就可以
14、獲得相應(yīng)的分辨率精度,這是傳統(tǒng)方法難以實現(xiàn)的。 (2) 頻率變換速度快。在DDS中,一個頻率的建立時間通常取決于濾波器的帶寬。影響因素為相位累加器,ROM/RAM的工藝結(jié)構(gòu),D/A轉(zhuǎn)換器及它信號處理過程中可能產(chǎn)生的時延。其中,信號處理的時延與時鐘周期相關(guān)。由于DDS中不要相位反饋控制,頻率建立及切換快,與頻率分辨率,頻譜純度相互獨立,明顯優(yōu)于PLL。 (3) DDS中相位改變是線性過程。數(shù)字相位累加器是優(yōu)良的線性數(shù)字增值發(fā)生器。因此,DDS的相位誤差主要依賴于時鐘的相位特性,相位誤差小。另外,DDS的相位是連續(xù)變化的,形成的信號具有良好的頻譜特性,這是傳統(tǒng)的直接頻率合成法所無法實現(xiàn)的。
15、(4)輸出頻率范圍寬。 理論上,DDS輸出的頻率范圍在,實際上,考慮到低通濾波器的設(shè)計,為,而FPGA的時鐘頻率可達到100MHz,因此,利用FPGA,可以實現(xiàn)輸出頻率范圍很寬的信號。 根據(jù)前面的講述,可以得到一下公式: 其中,是輸出波形的周期,n是相位累加器位數(shù),m是相位累加器步長,是輸入波形周期。是參考頻率,是輸出波形頻率,是最小分辨率,是最高合成頻率。根據(jù)奈奎斯特(Nyquist)定理,即采樣頻率必須不小于被采樣信號的最高頻率,否則原信號不能被恢復(fù),所以當時,得到最高合成頻率,當然,這僅是理論值,實際上與D/A精度、轉(zhuǎn)換速度,
16、濾波網(wǎng)絡(luò)性能密切相關(guān),一般取,例如,晶振時鐘為100MHz時,可知輸出合成波頻率將出現(xiàn)在較寬頻段上。 2 系統(tǒng)設(shè)計 本章所需要設(shè)計的直接數(shù)字頻率合成系統(tǒng)與前面介紹的DDS原理完全一致。從實現(xiàn)方式上看,有如下特色: (1) 引入8級級聯(lián)的BCD比例乘法器,將頻率分辨率提高100萬倍! (2) 利用FPGA內(nèi)部嵌入式存儲單元,在FPGA內(nèi)部集成了2Kbit容量雙端口RAM,降低了硬件難度,提高了系統(tǒng)可靠性。 從前面的介紹中可以知道,增加相位累加器的位數(shù)n,可以提高頻
17、率分辨率,最低輸出頻率可達Hz、mHz甚至是μHz,即DDS的最低合成頻率接近零頻。有人計算過,如果為50MHz,那么當n為48位時,其分辨率可達179nHz。但是,增加相位累加器的位數(shù)n將使加法算法過于龐大,消耗驚人的FPGA資源。何不從入手,對實現(xiàn)任意可分頻,利用降低來換取高分辨率呢? 事實證明,使用比例乘法器是可行的,經(jīng)過8級BCD比例乘法器的分頻,分頻比達到,例如,晶振頻率為100MHz,經(jīng)過分頻可以是Hz任意整數(shù)頻率,整個分頻模塊僅消耗65個宏單元。 現(xiàn)代FPGA內(nèi)部集成了存儲單元,這些是寶貴的存儲資源,通常只有通過利用開發(fā)商提供的知識產(chǎn)權(quán)核(IP CORE)才能使用,這些知識產(chǎn)
18、權(quán)核經(jīng)過嚴格的測試和優(yōu)化,可以在特定器件上發(fā)揮最大效能,利用這些模塊,就是將優(yōu)秀EDA開發(fā)人員的硬件成果嵌入到自己設(shè)計中,縮短了開發(fā)時間,提高了效率。 本章設(shè)計的參數(shù)選取如下。 由相位累加器位數(shù)n=8,存儲容量2568=2048 bit,晶振頻率為100MHz,可知: (1) 頻率分辨率 Hz (2) 最高合成頻率 MHZ 前面講過,這僅是理論值,實際中與具體電路(D/A,濾波器)有關(guān)。 (3) 相位步進 本設(shè)計按照模塊化層次化設(shè)計方法,根據(jù)結(jié)構(gòu)功能,可以劃分出3個功能模塊,即微控制器接口模塊、相位累加器模塊、雙端口RAM模塊,其連接關(guān)系如圖2-1所示。
19、圖 2-1 2.1 微控制器接口模塊 微控制器接口模塊向微控制器提供友好,方便的操作接口,MCU可通過片選(CS)、地址選通(AS)、數(shù)據(jù)選通(DS)、數(shù)據(jù)總線和地址總線來操作其內(nèi)部寄存器。微控制器接口模塊內(nèi)部實現(xiàn)了6個寄存器,其中,4個位分頻寄存器,1個位控制寄存器,1個位數(shù)據(jù)輸入寄存器。此外,8級比例乘法器組成的分頻模塊以端口映射的方式例化在控制器接口模塊中,對外輸出參考時鐘頻率fclk。 2.2 相位累加寄存器 相位累加寄存器是系統(tǒng)的核心模塊,使用經(jīng)過分頻器分頻后的時鐘,范圍相當寬廣。相位累加器輸出相位碼序列,作為查尋地址送入雙端口RAM,相應(yīng)地,還有讀使能和讀時鐘信號。相
20、位累加步長m可取,n=0,1,2, …,7這里,為了減小失真,一般m取值不超過32 2.3 雙端口RAM 利用ALtera提供的Mega Wizard Plug-In Manager定制了數(shù)據(jù)線和地址線寬度均為8位,存儲容量為2048bit的雙端口RAM,獨立的兩套讀/寫接口,有興趣的讀者不妨使用Mega Wizard Plug-In Manager定制其他的存儲器,看看哪種存儲器使用起來最方便。 接口信號說明如下: RESET,系統(tǒng)復(fù)位,低電平有效; CS,片選信號,低電平有效; AS,地址選通信號,低電平有效; DS,數(shù)據(jù)選通信號,低電平有效; DATABUS,數(shù)
21、據(jù)總線;寬度為8位; ADDRBUS,地址總線,寬度為3位。 頂層實體的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( -- 與微控制器接口信號 -- 全局復(fù)位 reset : IN STD_LOGIC; -- 全局時鐘 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( -- 與微控制器接口信號 -- 全局復(fù)位 reset : IN STD_LOGIC; -- 全局時鐘 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)部模塊接口信號 -- DDS掃頻使能 ddsen : OUT STD_LOGIC; -- 經(jīng)比例乘法器分頻后的時鐘 fclk : OUT STD_LOGIC; -- 步長 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寫時鐘 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; -- 分頻時
27、鐘 fclk : IN STD_LOGIC; -- 掃頻使能 ddsen : IN STD_LOGIC; -- 相位累加步長 m : IN STD_LOGIC_VECTOR(7 DOWNTO 0); -- 讀RAM時鐘 rdclock : OUT STD_LOGIC; -- 讀RAM使能 rden : OUT STD_LOGIC; -- 讀RAM地址 rdaddress:OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END COMPONENT; -- 信號說明 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( -- 與微控制器接口信號 -- 全局復(fù)位 reset => reset,
30、 -- 全局時鐘 clk => clk, -- 地址總線 addrbus => addrbus, -- 數(shù)據(jù)總線 databus => databus, -- 片選 cs => cs, -- 地址選通 as => as, -- 數(shù)據(jù)選通 ds => ds, -- 與內(nèi)部模塊接口信號 -- DDS掃頻使能 ddsen => ddsen, -- 經(jīng)比例乘法器分頻后的時鐘 fclk => fclk, -- 步長 m => m,
31、 -- 數(shù)據(jù)輸出,送至雙端口RAM dataout => dataout, -- 地址輸出,送至雙端口RAM addrout => addrout, -- 雙端口RAM寫使能 wren => wren, -- 雙端口RAM寫時鐘 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, -- 分頻時鐘 fclk => fclk, -- 掃頻使能 ddsen => ddsen, -- 相位累加步長 m => m, -- 讀RAM時鐘 rdclock => rdclock,
33、 -- 讀RAM使能 rden => rden, -- 讀RAM地址 rdaddress=>rdaddress ); END rtl; 圖 2-2是頂層實體仿真波形,由圖中可以看到,首先,向地址為000的寄存器寫數(shù)據(jù)00010000,表示將晶振頻率10分頻,然后向地址為100的寄存器寫數(shù)據(jù)10000000,表示相位累加器使能,隨后,輸出波形。讀者可能暫時還不能理解整個系統(tǒng)的工作原理,這里只需了解系統(tǒng)的輪廓即可,后面會詳細介紹各模塊的設(shè)計與實現(xiàn)。 3 模塊設(shè)計與實現(xiàn) 如前面所述,頂層實體由3個模塊構(gòu)成:
34、微控制器接口模塊、相位累加器模塊及雙端口RAM模塊。由8個比例乘法器級聯(lián)組成的分頻器模塊以端口定義的形式例化在微控制器模塊中,屬于后者的子模塊,但是由于比例乘法器的本設(shè)計中所發(fā)揮的作用很大,加之相關(guān)資料少之又少,為了加深讀者的領(lǐng)悟,決定單獨作為一節(jié)。 3.1 微控制器接口模塊 微控制器接口向8位、16位、32位微處理器級微控制器提供友好的操作接口,如圖3-1所示。其輸入引腳前面已經(jīng)介紹過,這里不再重復(fù)。現(xiàn)在,介紹一下輸出引腳。 圖 3-1 ddsen:相位累加器使能,有效時為高電平; fclk:分頻時鐘,作為相位累加器的輸入時鐘; m:相位累加步長,m=,n=0,1
35、,2, …,7; dataout:數(shù)據(jù)輸出,作為RAM輸入數(shù)據(jù); addrout:地址輸出,作為RAM輸入地址; wern:RAM寫使能信號; wrclock:RAM寫時鐘信號。 前面已經(jīng)提到,DDS內(nèi)部實現(xiàn)了6個寄存器,其中,4個位分頻寄存器,1個位控制寄存器,1個位數(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所示。分頻寄存器用于存儲分頻系數(shù),分頻模塊由8個BCD比例乘法器構(gòu)成。每一個比例乘法器需要4位二進制碼來確定分頻系數(shù),48=32 bit,也就是4 byte。FWORD1對應(yīng)第一級和第二級比例乘法器,F(xiàn)WORD2對應(yīng)第三級和第四級比例乘法器,以此類推,F(xiàn)WORD4對應(yīng)第七級和第八級比例乘法器。 表3-2 分頻寄存器FWORD1 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 3.1.2 控制寄存器(
37、DDSCR) 如表3-3所示,控制寄存器只有4位是有意義的,ddsen為相位累加器使能,當其為有效時(邏輯1),相位累加器工作,輸出波形。m2、m1、m0是相位累加步長控制字,由于系統(tǒng)設(shè)計中規(guī)定相位累加步長m=,n=0,1,2, …,7,所以使用3位表示他們足夠了,對應(yīng)的累加步長值如表3-4所示。 表 3-3 控制寄存器 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 DDSEN 0 0 0 0 M2 M1 M0 表 3-4 m2m1m0與相位累加步長m對照表 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ù)位時,地址為0,每向DATA寄存器寫一次數(shù)據(jù),地址自動加1,直到地址寫滿,自動清零,準備下一次寫入過程。這意味著可以重復(fù)多次寫波形數(shù)據(jù),從而實現(xiàn)任意波形輸出和動態(tài)波形輸出的功能。 表 3-5 控制寄存器 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 DATA7 DATA6 DATA5 DATA4 DATA
39、3 DATA2 DATA1 DATA0 本模塊通過片選信號、地址選通信號、數(shù)據(jù)選通信號來鎖定地址和數(shù)據(jù),當片選信號CS和地址選通信號AS有效時,根據(jù)地址總線內(nèi)容使能對應(yīng)寄存器。在檢測到數(shù)據(jù)選通信號DS下降沿后,在系統(tǒng)時鐘的上升沿將數(shù)據(jù)寫入選中的寄存器中。 微控制器接口模塊的狀態(tài)機如圖3-2所示: (1) IDLE。當系統(tǒng)上電或復(fù)位后,微控制器接口處于此狀態(tài)。此狀態(tài)等待片選信號有效和AS信號的下降沿,當條件滿足時,狀態(tài)機切換到STROBE狀態(tài)。 (2) STROBE。當片選信號有效時,狀態(tài)機在此狀態(tài)等待,直到DS信號出現(xiàn)下降時沿,切換到DATA_LAUNCH狀態(tài);當片選信號無效
40、時,狀態(tài)機切換到IDLE狀態(tài)。 (3) DATA_LAUNCH。 此狀態(tài)只持續(xù)1個時鐘周期,在時鐘上升沿寫入數(shù)據(jù),返回IDLE狀態(tài)。 圖 3-2 微控制器接口狀態(tài)機 文件interface內(nèi)部的各進程說明: 第一個進程延遲信號,目的是檢測信號跳變。 第二個進程是狀態(tài)寄存器,同步狀態(tài)。 第三個進程是主狀態(tài)機。 第四個進程是寫RAM狀態(tài)機。 第五個進程根據(jù)地址譯碼,使能對應(yīng)寄存器。 第六個進程根據(jù)使能,寫對應(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( -- 與微控制器接口信號 -- 全局復(fù)位 reset : IN STD_LOGIC; -- 全局時鐘 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)部模塊接口信號 -- DDS掃頻使能 ddsen : OUT STD_LOGIC; -- 經(jīng)比例乘法器分頻后的時鐘 fclk : OUT STD_LOGIC; -- 步長 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寫時鐘 wrclock : OUT STD_LOGIC ); END interface; ARCHITECTURE rtl of interface IS -- 元件說明 -- 8個比例乘法器級聯(lián) COMPONENT fre_div PORT(
44、 -- 輸入時鐘 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); -- 分頻時鐘 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"; -- 信號
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)機定義 TYPE STATE_TYPE IS (IDLE,STROBE,DATA_LAUNCH); -- 狀態(tài)機信號 SIGNAL prs_state, next_state : STATE_TYPE; -- 狀態(tài)機定義 TYPE WR_STATE_TYPE IS (
49、wr_idle,wr_high,wr_low); -- 狀態(tài)機信號 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 ------------------------------------------------------------ -- 檢測延遲信號 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信號狀態(tài)機 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; -- 計算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的信號 ------------------------------------------------------------ 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; -- 在時鐘的上升沿同步 ELSIF rising_edge(clk) THEN IF cs = 0 AND as = 0 THEN -- 根據(jù)地址,使能對應(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等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。