1、 JIANGSU UNIVERSITY OF TECHNOLOGYFPGA 技术实验报告基于 FPGA 的直接数字频率合成器设计学 院: 电气信息工程学院 专 业: 测控技术与仪器 班 级: 11 测控 2 姓 名: 学 号: 指导教师: 时 间: 2014 年 12 月 目 录一、功能要求与整体设计-(3)1.1 功能要求-(3)1.2 整体设计-(3) 二、 DDS 技术的基本原理-(3)三、 基本 DDS 设计-(5)3.1 频率预置与调节电路-(5)3.2 累加器-(5)3.3 波形存储器-(6)3.4 D/A 转换器-(6)3.5 低通滤波器-(6)四 、基于 DDS 的正弦信号发生
2、器设计实现-(6)4.1 32 位加法器 ADDER32 设计-(6)4.2 32 位寄存器 REG32B 设计-(7)4.3 正弦波 ROM 设计-(8)五、程序设计-(9)5.1 正弦波产生程序设计-(9)5.2 三角波产生程序设计-(11)5.3 方波产生程序设计-(12)5.4 锯齿波产生程序设计-(14)5.5 顶层仿真-(16)六、 DAC0832 接口电路及程序设计-(17)6.1 DAC0832 接口电路设计-(17)6.2 DAC0832 接口程序设计-(18)七、 软硬件调试-(18)7.1 软件下载-(18)7.2 硬件调试-(19)八、心得体会-(22)九、参考文献-(
3、22)十、附录-(23)附录 1 源程序清单-(23)附录 2 实物图-(27)一、功能要求和整体设计1.1 功能要求设计一个多功能波形发生器。该波形发生器能产生正弦波、方波、三角波和由用户编辑的特定形状波形。具体要求如下:(1)具有产生正弦波、方波、三角波、锯齿波 4 种周期性波形的功能。(2)用键盘输入编辑生成上述 4 种波形(同周期)的线性组合波形。(3)具有波形存储功能。(4)输出波形的频率范围为 100Hz200kHz ;重复频率可调,频率步进间隔100Hz。(5)具有显示输出波形的类型、重复频率(周期)和幅度的功能。 1.2 整体设计多功能波形发生器系统由输入部分、FPGA 部分、
4、DAC、显示部分四部分组成。其系统框图如图 1-1 所示。图 1-1 系统框图二、DDS 技术的基本原理对于正弦信号发生器,它的输出可以用下式来描述:sinsin(2)out outAtf(1)其中,Sout 是指该信号发生器的输出信号波形,f out 只输出信号对应的频率。上式的表述对于时间 t 是连续的,为了用数字逻辑实现该表达式,必须进行离散化处理,用基准时钟 clk 进行抽样,令正弦信号的的相位 为2outf(2)在一个 clk 周期clk,相位 的变化量为(3)其中 fclk 指 clk 的频率对于 2 可以理解为“满”相位,为了对 进行数字量化,把 2 切割成 2N,用词每个 cl
5、k 周期的相位增量 用量化值 B来描述:B=(2 N)/2,且 B 为整数与上式联立可得:(4)显然,信号发生器可以描述(5)其中 k-1 指前一个 clk 周期的相位值,同样得出(6)由以上推倒可以得出,只要对相位的量化值进行简单的累加运算,就可以得到正弦信号的当前相位值,而用于累加的香味增量量化值 B 决定了信号的输出频率 fout 并呈现简单的线性关系。直接数字合成器 DDS 就是根据以上原理而设计的数控频率合成器,图 2-1为其基本 DDS 结构,主要有相位累加器、相位调制器、正弦 ROM 查找表构成图中的相位累加器、相位调制器、正弦 ROM 查找表是 DDS 结构中的数字部分。图 2
6、-1 基本 DDS 结构三、 基本 DDS 设计DDS 基本组成如图 3-1 所示。图 3-1 为 DDS 基本组成3.1 频率预置与调节电路此部分主要实现频率控制量的输入与调节,不变量 K 被称为相位增量,也叫频率控制字,通过调节频率控制字可以改变信号的输出频率。3.2 累加器相位累加器由加法器和寄存器组成,其组成框图如图 3-2 所示。图 3-2 相位累加器组成框图在时钟的作用下,进行相位累加,当相位累加器累加满量时就会产生一次溢出,完成一个周期性的动作。3.3 波形存储器可以进行波形的相位幅值转换。ROM 的 N 位地址:把 0360 度的正弦角度离散成具有 2N 个样值的序列 ;ROM
7、 的 D 位数据位:2N 个样值的幅值量化为D 位二进制数据。3.4 D/A 转换器D/A 转换器可以把已经合成的波形的数字量转换成模拟量。3.5 低通滤波器滤除生成的阶梯形正弦波中的高频成分,将其变成光滑的波形。四、基于 DDS 的正弦信号发生器设计实现根据设计原理框图分别设计出加法器、寄存器、正弦波等 ROM。 4.1 32 位加法器 ADDER32 设计在原理图文件下在空白处双击,单击“MegaWizard Plug-In Manager”选择第一项,如图 4-1 所示 。图 4-1 原理图设置 选择器件为 cyclone,语言方式为 VerilogHDL。在算数项 Arithmetic
8、 中选择计数器 LPM_ADD_SUB.存于所建工程文件夹下命名为 ADDER32.单击 NEXT,进入以后对话框后选择 32 位加法器工作模式选择有一位加法进位输出,选择有符号加法方式,选择 2 级流水线工作模式 ,此时该加法器变为有时序电路的模块,最后至 finish 按钮,编辑完成,32 位加法器模块如图 4-2所示。 图 4-2 32 位加法器模块4.2 32 位寄存器 REG32B 设计寄存器 DFF32 由 LMP_FF 宏模块担任,生成方法同 ADDER32 相同,设置位数为 32 位,且为时序控制模块,如图 4-3 所示。图 4-3 32 位寄存器模块DFF32 与 ADDER
9、32 构成一个 32 位累加器其高十位 A3122为波形数据ROM 的地址。 十位加法器和寄存器与 32 位方法相同。4.3 正弦波 ROM 设计a.首先通过 mif 文件来产生正弦波注意:在生成正弦波的时候要注意与 sin_rom 中的数据一致。即位 DEPTH = 1024;WIDTH = 10;这样才能保证在最后的输出中能够有完整的正弦波图形输出。存盘并命名为 sin_rom.mifb.LPM_ROM 的订制:按 ADDER32 的产生方法来产生 LMP_ROM,在宏模块选择中选“Memory Complier”中“ROM:1-PORT”项,依次设定地址线与数据线的位宽均为十位,最后产生
10、 LMP_ROM,如图 4-4 所示。图 4-4 正弦波模块其他波形 ROM 与正弦波类似。五、程序设计5.1 正弦波产生程序设计通过循环不断地从 RAM 中依次读取正弦波一个周期在时域上 64 个采样点的波形数据送入波形 DAC,从而产生正弦波。正弦波的频率取决于读取数据的速度。程序如下:LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.all;ENTITY sin_rom ISPORT( address : IN STD_LOGIC_VECTOR (9 DOWNTO 0);inclock : I
11、N STD_LOGIC ;q: OUT STD_LOGIC_VECTOR (9 DOWNTO 0);END sin_rom;ARCHITECTURE SYN OF sin_rom 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;
12、lpm_type : STRING;numwords_a : NATURAL;operation_mode : STRING;outdata_aclr_a : STRING;outdata_reg_a : STRING;ram_block_type : 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 (
13、9 DOWNTO 0);END COMPONENT;BEGINq “BYPASS“,clock_enable_output_a = “BYPASS“,init_file = “myrom.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“,ram_block_type
14、 = “M4K“,widthad_a = 10,width_a = 10,width_byteena_a = 1)PORT MAP (clock0 = inclock,address_a = address,q_a = sub_wire0);END SYN; 5.2 三角波产生程序设计三角波波形是对称的,每边呈线形变化,所以可以根据地址数据做简单运算,就可以得到三角波。程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; -程序包entity triangle is -定义三角波实体port
15、(clk,reset:in std_logic;q:out std_logic_vector(7 downto 0);end triangle;architecture behav of triangle is -定义三角波结构体beginprocess(clk,reset) -进程开始variable tmp:std_logic_vector(7 downto 0);-定义中间变量 tmp、avariable a:std_logic;beginif reset=0then -复位信号设置tmp:=“00000000“;elsif rising_edge(clk) then -捕捉时钟信号上升
16、沿if a=0then -a=0 时依次输出三角波上升沿if tmp=“11111110“thentmp:=“11111111“;a:=1;else tmp:=tmp+1;end if;else -a=1 时依次输出三角波下降沿if tmp=“00000001“thentmp:=“00000000“;a:=0;else tmp:=tmp-1;end if;end if;end if;q “BYPASS“,clock_enable_output_a = “BYPASS“,init_file = “juxing.mif“,intended_device_family = “Cyclone II“,
17、lpm_hint = “ENABLE_RUNTIME_MOD=NO“,lpm_type = “altsyncram“,numwords_a = 1024,operation_mode = “ROM“,outdata_aclr_a = “NONE“,outdata_reg_a = “CLOCK0“,ram_block_type = “M4K“,widthad_a = 10,width_a = 10,width_byteena_a = 1 )PORT MAP (clock0 = clock,address_a = address,q_a = sub_wire0);END SYN;5.5 顶层仿真设
18、置波形选择位,以方便控制各种波形的显示。仿真结果如图 5-1 所示。频率控制字为 2 的仿真波形频率控制字为 12 的仿真波形频率控制字为 13 的仿真波形图 5-1 波形仿真结果六、DAC0832 接口电路及程序设计6.1 DAC0832 接口电路设计(1)FPGA_IO1-8 向 DAC0832 的数据输入口(DI0-DI7)输送数据。(2)FPGA_IO9 提供 DAC0832 数据锁存允许控制信号 ILE,高电平有效。(3)FPGA_IO10 提供 DAC0832 控制信号(CS:片选信号;XFER:数据传输控制信号;WR1、WR2:DAC 寄存器写选通信号),低电平有效;(4)IOU
19、T1、IOUT2、RFB 与运算放大器 LM324 完成电流/电压的转换(DAC0832属电流输出型);(5)FPGA 与 DAC0832 接口电路原理图如图 6-1 所示。图 6-1 FPGA 与 DAC0832 接口电路原理图6.2 DAC0832 接口程序设计根据图 6-2 DAC0832 输出控制时序,利用接口电路图,通过改变输出数据设计一个锯齿波发生器。DAC0832 是 8 位的 D/A 转换器,转换周期为 1s。锯齿波形数据可以由 256 个点构成,每个点的数据长度为 8 位。又因为 FPGA 的系统时钟为 50MHz,必须对其进行分频处理,这里进行 64 分频,得到的锯齿波的频
20、率为 762.9Hz。图 6-2 DAC0832 输出控制时序图七、软硬件调试7.1 软件下载调试、仿真成功后进行硬件调试阶段,在“Assignment”菜单下选择“Device”项进行器件选择 Cyclone 中的 EP2C5T144C8 器件,在“Assignment”菜单下选择”pins”项,进行管脚锁定。引脚锁定如图 7-1 所示。图 7-1 引脚锁定管脚锁定后再次进行编译,成功后选择“tools”菜单下“programmer”项进行下载。7.2 硬件调试将 FPGA 与 D/A 转换模块连好,接示波器进行观察调试。波形输出频率应满足 102clkoutFTWORDf。图 7-2 所示
21、为频率控制字是 0CH 的四种波形调试结果;图 7-3 所示为频率控制字是 1CH 的四种波形调试结果;图 7-4 所示为频率控制字是 3CH 的四种波形调试结果。图 7-2 控制字为 08H 的四种波形根据公式 102clkoutFTWORDf,求得输出频率为 195.31Hz,四种波形频率与理论值基本一致,但每个波形都有一定的误差。图 7-3 控制字为 0CH 的四种波形根据公式 102clkoutFTWORDf,求得输出频率为 292.968Hz,四种波形频率与理论值基本一致,但每个波形都有一定的误差。图 7-4 控制字为 0DH 的四种波形根据公式 102clkoutFTWORDf,求
22、得输出频率为 390.625Hz 四种波形频率与理论值基本一致,但每个波形都有一定的误差。八、心得体会两周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程”千里之行始于足下 ”,通过这次课程设计,我深深体会到这句千古名言的真正含义我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是
23、为明天能稳健地在社会大潮中奔跑打下坚实的基础通过这次 FPGA 课程设计,本人在多方面都有所提高。通过这次设计,综合运用本专业所学课程的理论和知识进行设计工作的实际训练从而培养和提高学生独立工作能力,巩固课程所学的内容,掌握设计的方法和步骤,掌握设计的基本的技能懂得了怎样分析,怎样确定方案,了解基本结构,提高了计算能力,绘图能力,熟悉了规范和标准,同时各科相关的课程都有了全面的复习,独立思考的能力也有了提高。在这次设计过程中,体现出自己单独设计的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。在此感谢我们的老师.,老师
24、严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;这次设计的每个实验细节和每个数据,都离不开老师您的细心指导。同时感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。 由于本人的设计能力有限,在设计过程中难免出现错误,恳请老师们多多指教,我十分乐意接受你们的批评与指正,本人将万分感谢。九、参考文献1朱小斌电子测量仪器 北京:电子工业出版社,19962Michael Lauterbach Artpin任意波形发生器在通讯测试中的应用电子产品世界,19973史海明个人仪器多功能任意波形发生器的研制 仪表技术,19884林青D
25、DS 在数字调制中的应用无线电工程,20015张开增,张迎新,王尚忠高分辨率高稳度宽带函数发生器的研制 华北工学院学报6华清远见嵌入式培训中心FPGA 应用开发入门与典型实例北京:人民邮电出版社,2008十、附录附录 1 源程序清单LIBRARY IEEE; -DDS 顶层设计USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DDS_VHDL IS PORT ( CLK : IN STD_LOGIC;selz: in std_logic_vector(1 downto 0);FWORD : IN STD_LOG
26、IC_VECTOR(7 DOWNTO 0); -频率控制字PWORD : IN STD_LOGIC_VECTOR(7 DOWNTO 0); -相位控制字FOUT : OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );END;ARCHITECTURE one OF DDS_VHDL IScomponent fre isport( clk1:in std_logic;outclk:out std_logic);end component;component juxing ISPORT(address : IN STD_LOGIC_VECTOR (9 DOWNTO 0);cloc
27、k : IN STD_LOGIC ;q : OUT STD_LOGIC_VECTOR (9 DOWNTO 0);END component;COMPONENT sanjiao ISPORT(address : IN STD_LOGIC_VECTOR (9 DOWNTO 0);clock : IN STD_LOGIC ;q : OUT STD_LOGIC_VECTOR (9 DOWNTO 0);END COMPONENT;COMPONENT fangbo ISPORT(address : IN STD_LOGIC_VECTOR (9 DOWNTO 0);clock : IN STD_LOGIC
28、;q : OUT STD_LOGIC_VECTOR (9 DOWNTO 0);END COMPONENT;COMPONENT mux41 isport(sel:in std_logic_vector(1 downto 0);-定义输入端口 seld1,d2,d3,d4: in std_logic_vector(9 downto 0);-定义输入端口d1,d2,d3,d4q: out std_logic_vector(9 downto 0);-定义输出端口end COMPONENT;COMPONENT mux411 isport(sel:in std_logic_vector(1 downto
29、0);-定义输入端口 seld1,d2,d3,d4: out std_logic_vector(9 downto 0);-定义输入端口d1,d2,d3,d4q: in std_logic_vector(9 downto 0);-定义输出端口end COMPONENT;COMPONENT REG32BPORT ( LOAD : IN STD_LOGIC;DIN : IN STD_LOGIC_VECTOR(31 DOWNTO 0);DOUT : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) );END COMPONENT;COMPONENT REG10B PORT ( LOA
30、D : IN STD_LOGIC;DIN : IN STD_LOGIC_VECTOR(9 DOWNTO 0);DOUT : OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );END COMPONENT;COMPONENT ADDER32BPORT ( A : IN STD_LOGIC_VECTOR(31 DOWNTO 0);B : IN STD_LOGIC_VECTOR(31 DOWNTO 0);S : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) );END COMPONENT;COMPONENT ADDER10BPORT ( A : IN STD_
31、LOGIC_VECTOR(9 DOWNTO 0);B : IN STD_LOGIC_VECTOR(9 DOWNTO 0);S : OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );END COMPONENT;COMPONENT SIN_ROMPORT( address : IN STD_LOGIC_VECTOR(9 DOWNTO 0);inclock : IN STD_LOGIC ;q : OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );END COMPONENT;signal clk2 : std_logic;SIGNAL F32B : STD_LO
32、GIC_VECTOR(31 DOWNTO 0);SIGNAL D32B : STD_LOGIC_VECTOR(31 DOWNTO 0);SIGNAL DIN32B : STD_LOGIC_VECTOR(31 DOWNTO 0);SIGNAL P10B : STD_LOGIC_VECTOR( 9 DOWNTO 0);SIGNAL LIN10B : STD_LOGIC_VECTOR( 9 DOWNTO 0);SIGNAL SIN10B : STD_LOGIC_VECTOR( 9 DOWNTO 0);SIGNAL SANJIAO10B : STD_LOGIC_VECTOR( 9 DOWNTO 0);
33、SIGNAL FANG10B : STD_LOGIC_VECTOR( 9 DOWNTO 0);SIGNAL juxing10B : STD_LOGIC_VECTOR( 9 DOWNTO 0);signal d11,d22,d33,d44: std_logic_vector(9 downto 0);signal MOUT: std_logic_vector(9 downto 0);BEGIN F32B(27 DOWNTO 20)clk,outclk=clk2); u2 : ADDER32B PORT MAP( A=F32B,B=D32B, S=DIN32B );u3 : REG32B PORT
34、MAP( DOUT=D32B,DIN= DIN32B, LOAD=CLK2 );u4 : SIN_ROM PORT MAP( address=SIN10B, q=d11, inclock=CLK2 );u5 : SANJIAO PORT MAP( address=SANJIAO10B, q=d22, clock=CLK2 );u6 : FANGBO PORT MAP( address=FANG10B, q=d33, clock=CLK2 );u7 : juxing PORT MAP( address=juxing10B, q=d44, clock=CLK2 );u8 : ADDER10B PORT MAP( A=P10B,B=D32B(31 DOWNTO 22),S=LIN10B );u9 : mux411 port map(sel=selz,d1=SIN10B,d2=SANJIAO10B,d3=FANG10B,d4=juxing10b,q=MOUT);u10 : REG10B PORT MAP( DOUT=MOUT,DIN=LIN10B, LOAD=CLK2 );u11 : mux41 port map(sel=selz,d1=d11,d2=d22,d3=d33,d4=d44,q=FOUT);END;附录 2 实物图