1JANGSU UNIVERSITY OF TECHNOLOGY FPGA技术实验报告基于FPGA的直接数字频率合成器设计学院:电气信息工程学院专业:电子信息工程班级:姓名:学号:指导教师:戴霞娟、陈海忠时间: 2015.9.241目录绪论.......................................................................................... 错误!未定义书签。
一、背景与意义 (2)二、设计要求与整体设计 (2)2.1 设计要求 (2)2.2 数字信号发生器的系统组成 (3)2.3 DDS技术 (3)三、硬件电路设计及原理分析 (4)3.1 硬件电路设计图 (4)3.2 设计原理 (5)四、程序模块设计、仿真结果及分析 (5)4.1顶层模块设计 (6)4.2分频模块设计 (6)4.3时钟模块设计 (11)4.4数据选择模块设计 (12)4.5正弦波产生模块设计........................................................ 错误!未定义书签。
4.6三角波产生模块设计 (15)4.7方波产生模块设计............................................................ 错误!未定义书签。
4.8锯齿波模块设计 (18)五、软硬件调试 (21)5.1正弦波 (22)5.2锯齿波 (22)5.3方波 (23)5.4三角 (23)六、调试结果说明及故障分析 (24)七、心得体会 (24)八、参考文献 (25)九、附录 (25)绪论直接数字频率合成技术(DirectDigitalFrequencySynthesi,即DDFS一般简称DDS)是从相位直接合成所需波形的一种新的频率合成技术。
近年来,直接数字频率合成器由于其具有频率分辨率高、频率变换速度快、相位可连续变化等特点,在数字通信系统中已被广泛采用。
随着微电子技术的发展,现场可编程门阵列( FPGA)器件得到了飞速发展。
由于该器件具有速度快、集成度高和现场可编程的优点,因而在数字处理中得到广泛应用,越来越得到硬件电路设计工程师的青睐。
一、背景与意义信号发生器是一种常用的信号源,广泛运用于科学研究、生产实践和教学试验等领域。
特别是在通信系统的科研实验中,常常需要用到不同频率和幅度的信号,如正弦波、三角波、方波和锯齿波等。
作为一种为电子测量和计量提供电信号的设备,它和万用表、示波器、频率计等仪器一样,是最普通、最基本,也是运用最广泛的电子仪器之一,几乎所有电参量的测量都需要用到信号发生器。
凡是能产生测试信号的仪器,统称为信号源,也称为信号发生器,它用于产生被测电路所需特定参数的电测试信号。
本课题的主要研究内容是参考直接数字频率合成原理(DDS)技术[6],利用Quartus II9.0软件作为平台,VHDL语言作为开发语言,基于FPGA配合相应外围电路实现一个数字信号发生器,其电路结构简单,容易扩展,具有极大的灵活性和方便性,实现了产生频率可调的正弦波、三角波、方波的信号发生器。
二、设计要求与整体设计:2.1设计要求设计多功能波形发生器,该波形发生器能产生正弦波、方波、三角波和由用户编辑的特定形状波形,并且幅度、频率可调。
具体要求如下:(1)具有产生正弦波、方波、三角波、锯齿波4种周期性波形的功能。
(2)输出波形的频率范围为100KHZ~200KHZ。
(3)输出波形幅度不大于5V(峰-峰值),且幅度可调。
2.2 数字信号发生器系统组成原理框图该数字信号发生器系统主要由输入部分、FPGA 部分、D/A 转换部分、频率、幅值调节和波形转换部分组成。
如图2.1所示。
图2.1数字信号发生器系统组成2.3 DDS 技术DDS 与大多数的数字信号处理技术一样,它的基础仍然是奈圭斯特采定理。
奈圭斯特采样定理是任何模拟信号进行数字化处理的基础,它描述的是一个带限的模拟信号经抽样变成离散序列后可不可以由这些离散序列恢复出原始模拟信号的问题。
奈圭斯特采样定理告诉我们,当抽样频率大于或者等于模拟信号最高频率的分频器FPGA 部分系统控制器时钟复位 波形调幅调频正弦波三角波方波其他波型波形 D\A转换滤波输出两倍时,可以由抽样得到的离散序列无失真地恢复出原始模拟信号。
只不过在DDS 技术中,这个过程被颠倒过来了。
DDS不是对模拟信号进行抽样,而是一个假定抽样过程已经发生且抽样值已经量化完成,如何通过某种方法把已经量化的数值重建原始信号的问题。
DDS电路一般由参考时钟、相位累加器、波形存通滤波器(LPF)组成。
其结构如图2.1所示。
图2.2 DDS基本结构框图三、硬件电路设计及原理分析3.1硬件电路设计图3.2原理分析利用FPGA-EP2C5T144C8编程实现直接数字频率合成器,能生成正弦波、三角波及锯齿波。
频率,相位可调可控。
DDS 具体工作过程如下:每来一个时钟脉冲clk,N 位全加器将频率控制数据M 与累加寄存器输出的累加相位数据N 相加,把相加后的结果送至累加寄存器的输入端。
累加寄存器一方面将上一时钟周期作用后所产生的新的数据反馈到加法器的输入端,以使加法器在下一时钟的作用下继续与频率控制数据M 相加;另一方面将这个值作为取样地址值送入幅度/相位转换电路,此电路根据取样地址输出相应的波形数据。
最后经D/A 转换器和低通滤波器将波形数据转换成所需要的模拟波形。
四、程序模块设计、仿真结果及分析波形发生器可以由顶层模块、分频模块、时钟模块、数据选择器模块、正弦波产生模块、三角波产生模块、方波产生模块、锯齿波产生模块。
4.1顶层模块4.2分频模块:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY wxm_CLK ISPORT(CLK:IN STD_LOGIC;EN,EN1,EN2:IN STD_LOGIC;CLKOUT:OUT STD_LOGIC);END;ARCHITECTURE BEHAVE OF wxm_CLK IS SIGNAL CNT:STD_LOGIC_VECTOR(19 DOWNTO 0); SIGNAL EN3,EN4,EN5: STD_LOGIC;SIGNAL EN6:STD_LOGIC_VECTOR(2 DOWNTO 0); BEGINEN6<=EN3&EN4&EN5;PROCESS(EN)BEGINIF EN'EVENT AND EN='0' THEN IF EN3 ='0' THENEN3<='1';ELSEEN3<='0';END IF;END IF;END PROCESS;PROCESS(EN1)BEGINIF EN1'EVENT AND EN1='0' THEN IF EN4 ='0' THENEN4<='1';ELSEEN4<='0';END IF;END IF;END PROCESS;PROCESS(EN2)BEGINIF EN2'EVENT AND EN2='0' THEN IF EN5 ='0' THENEN5<='1';ELSEEN5<='0';END IF;END IF;END PROCESS;PROCESS(CLK,EN6)BEGINIF CLK'EVENT AND CLK='1' AND EN6="000" THEN IF CNT>4 THENCNT<=(OTHERS=>'0');CLKOUT<='0';ELSIF CNT>2 THENCLKOUT<='1' ;CNT<=CNT+1;ELSECNT<=CNT+1;END IF;ELSIF CLK'EVENT AND CLK='1' AND EN6="001" THEN IF CNT>8 THENCNT<=(OTHERS=>'0');CLKOUT<='0';ELSIF CNT>4 THENCLKOUT<='1' ;CNT<=CNT+1;ELSECNT<=CNT+1;END IF;ELSIF CLK'EVENT AND CLK='1' AND EN6="010" THEN IF CNT>16 THENCNT<=(OTHERS=>'0');CLKOUT<='0';ELSIF CNT>8 THENCLKOUT<='1' ;CNT<=CNT+1;ELSECNT<=CNT+1;END IF;ELSIF CLK'EVENT AND CLK='1' AND EN6="011" THEN IF CNT>30 THENCNT<=(OTHERS=>'0');CLKOUT<='0';ELSIF CNT>15 THENCLKOUT<='1' ;CNT<=CNT+1;ELSECNT<=CNT+1;END IF;ELSIF CLK'EVENT AND CLK='1' AND EN6="100" THEN IF CNT>62 THENCNT<=(OTHERS=>'0');CLKOUT<='0';ELSIF CNT>31 THENCLKOUT<='1' ;CNT<=CNT+1;ELSECNT<=CNT+1;END IF;ELSIF CLK'EVENT AND CLK='1' AND EN6="101" THEN IF CNT>124 THENCNT<=(OTHERS=>'0');CLKOUT<='0';ELSIF CNT>62 THENCLKOUT<='1' ;CNT<=CNT+1;ELSECNT<=CNT+1;END IF;ELSIF CLK'EVENT AND CLK='1' AND EN6="110" THEN IF CNT>250 THENCNT<=(OTHERS=>'0');CLKOUT<='0';ELSIF CNT>125 THENCLKOUT<='1' ;CNT<=CNT+1;ELSECNT<=CNT+1;END IF;ELSIF CLK'EVENT AND CLK='1' AND EN6="111" THEN IF CNT>500 THENCNT<=(OTHERS=>'0');CLKOUT<='0';ELSIF CNT>250 THENCLKOUT<='1' ;CNT<=CNT+1;ELSECNT<=CNT+1;END IF;END IF;END PROCESS;END;4.3时钟模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT1024 ISPORT(CLK:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(9 DOWNTO 0)); END;ARCHITECTURE BHV OF CNT1024 ISSIGNAL Q1:STD_LOGIC_VECTOR(9 DOWNTO 0);BEGINPROCESS(CLK)BEGINIF CLK'EVENT AND CLK='1' THENQ1<=Q1+1;END IF;END PROCESS;Q<=Q1;END;4.4数据选择模块设计:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY wxm_MUX ISPORT(Q1,Q2,Q3,Q4:IN STD_LOGIC_VECTOR(9 DOWNTO 0); A1,A0:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(9 DOWNTO 0));END;ARCHITECTURE ONE OF wxm_MUX IS SIGNAL A:STD_LOGIC_VECTOR(1 DOWNTO 0); SIGNAL A2,A3:STD_LOGIC;BEGINPROCESS(A1)BEGINIF A1'EVENT AND A1='0' THENIF A2='0' THENA2<='1';ELSEA2<='0';END IF;END IF;END PROCESS;PROCESS(A0)BEGINIF A0'EVENT AND A0='0' THENIF A3='0' THENA3<='1';ELSEA3<='0';END IF;END IF;END PROCESS;A<=A2&A3;Q<=Q1 WHEN A="11" ELSEQ2 WHEN A="10" ELSEQ3 WHEN A="01" ELSEQ4;END;4.5正弦波产生模块设计:LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.all;ENTITY wxm_sin ISPORT(address : IN STD_LOGIC_VECTOR (9 DOWNTO 0);clock : IN STD_LOGIC ;q : OUT STD_LOGIC_VECTOR (9 DOWNTO 0) );END wxm_sin;ARCHITECTURE SYN OF wxm_sin ISSIGNAL sub_wire0 : STD_LOGIC_VECTOR (9 DOWNTO 0);COMPONENT altsyncramGENERIC (clock_enable_input_a : STRING;clock_enable_output_a : STRING;init_file : STRING;intended_device_family : STRING;lpm_hint : STRING;lpm_type : STRING;numwords_a : NATURAL;operation_mode : STRING;outdata_aclr_a : STRING;outdata_reg_a : STRING;widthad_a : NATURAL;width_a : NATURAL;width_byteena_a : NATURAL);PORT (clock0 : IN STD_LOGIC ;address_a : IN STD_LOGIC_VECTOR (9 DOWNTO 0);q_a : OUT STD_LOGIC_VECTOR (9 DOWNTO 0) );END COMPONENT;BEGINq <= sub_wire0(9 DOWNTO 0);altsyncram_component : altsyncramGENERIC MAP (clock_enable_input_a => "BYPASS",clock_enable_output_a => "BYPASS",init_file => "E:/wxm/wxm_sin.mif",intended_device_family => "Cyclone II",lpm_hint => "ENABLE_RUNTIME_MOD=NO",lpm_type => "altsyncram",numwords_a => 1024,operation_mode => "ROM",outdata_aclr_a => "NONE",outdata_reg_a => "CLOCK0",widthad_a => 10,width_a => 10,width_byteena_a => 1)PORT MAP (clock0 => clock,address_a => address,q_a => sub_wire0);END SYN;由图 4.5可知,输出的幅值为所设计,正弦波选点正常,与相位能相互对应。