资源描述
河南科技大学
课 程 设 计 说 明 书
课程名称 __现代电子系统______
题 目 __数字移相信号发生器设计___
学 院 __电信学院________
班 级 _ 电信科083______
学生姓名 _ 吴艳芳_______
指导教师 _齐晶晶 张雷鸣_______
日 期 ______________
课程设计任务书
(指导教师填写)
课程设计名称 现代电子系统课程设计 学生姓名吴艳芳 专业班级 信科083
设计题目 数字移相信号发生器设计
一、 课程设计目的
掌握数字移相信号发生器的工作原理和设计方法;
掌握DDS技术的工作原理;
掌握GW48_SOPC实验箱的使用方法;
了解基于FPGA的电子系统的设计方法。
二、 设计内容、技术条件和要求
基于DDS技术利用VHDL设计并制作一个数字式移相信号发生器。
(1)基本要求:
a.频率范围:1Hz~4kHz,频率步进为1Hz,输出频率可预置。
b.A、B两路正弦信号输出,10位输出数据宽度
c.相位差范围为0~359°,步进为1.4°,相位差值可预置。
d.数字显示预置的频率(10进制)、相位差值。
(2)发挥部分
a.修改设计,增加幅度控制电路(如可以用一乘法器控制输出幅度)。
b.输出幅度峰峰值0.1~3.0V,步距0.1V
c.其它。
三、 时间进度安排
布置课题和讲解:1天
查阅资料、设计:4天
实验:3天
撰写报告:2天
四、 主要参考文献
何小艇 《电子系统设计》 浙江大学出版社 2008.1
潘松 黄继业 《EDA技术实用教程》 科学出版社 2006.10
齐晶晶 《现代电子系统设计》实验指导书 电工电子实验教学中心 2009.8
指导教师签字: 2011年 11月28日
摘 要
在测量与仪器仪表领域,经常需要数字移相信号发生器,它目前广泛应用于船舶、航空、检测等各行各业。采用DDS技术设计数字移相信号发生器,能得到频率及相位精确可调的信号且实现方便,并能实现幅度的可调。
本文介绍了基于FPGA芯片的直接数字频率合成器(DDS)的设计方法,实现了输出两路频率相同、相位差精度可调的正弦信号。本次设计采用相位累加器构成DDS控制电路,利用ROM存储正弦信号数据,再经过DA转换成波形输出。这种电路系统具有较高的频率分辨率,可以实现快速的频率切换,并且在改变时能够保持相位的连续,很容易实现频率、相位和幅度的数控调制。这里用一个加法器作为相位调制器对ROM地址产生偏移量,用一个乘法器作为幅度调制器对ROM数据的变化。对于频率字、相位字、幅度字的输入采用一个数据分配器控制;同时对输出显示采用一个数据选择器控制。因为DDS的实现依赖于高速、高性能的数字器件,使用现场可编程器件FPGA,利用其高速、高性能及可重构性的特性,就能根据需要方便地实现各种不同频率的信号输出。
关键词:信号发生器、频率、移相、VHDL、FPGA、DDS
目录
1 任务解析 5
1.1 频率调节和指示部分技术要求 5
1.2 输出波形部分技术要求 5
1.3 输出信号幅度调节与指示部分技术要求 5
1.4 输出信号相位调节与指示部分技术要求 5
2 系统方案与论证 6
2.1 总体方案与比较论证 6
2.2 系统原理与结构 8
2.2.1 主要芯片选择 8
2.2.2 系统结构 9
3 单元电路设计 10
3.1 数字DDS(DDFS)模块设计 10
3.1.1 DDS原理 10
3.1.2 频率加法模块 10
3.1.3 相位加法模块 12
3.1.4 幅度调节模块 12
3.2 时钟模块设计 13
3.3 预置、显示模块 13
3.3.1 输入设计 13
3.3.2 输出设计 14
3.4 波形ROM的设计 15
4 时序仿真分析 15
5 测试结果及分析 16
5.1 测试性能概览 16
5.2 测量误差分析 17
6 心得体会 18
参考文献 18
附录 19
顶层文件原理图 19
主要源程序 20
1 任务解析
1.1 振荡部分技术要求
频率范围:1Hz~4kHz
1.1 频率调节和指示部分技术要求
(1) 频率步进为1Hz。
(2) 输出频率可预置。
(3) 数字显示预置的频率(10进制)。
1.2 输出波形部分技术要求
A、B两路正弦信号输出,10位输出数据宽度。
1.3 输出信号幅度调节与指示部分技术要求
(1) 输出幅度峰峰值0.1~3.0V,步距0.1V
(2) 用十进制数显示输出信号的幅度值。
1.4 输出信号相位调节与指示部分技术要求
(1) 相位差范围为0~359°,步进为1.4°。
(2) 相位差值可预置。
(3) 数字显示预置的相位差值。
根据以上分析,整个系统可以表示为如图1所示的原理图。
预置及显示电路
振荡部分
波形调节
幅度调节
输出电路
输出
图 1 数字移相信号发生器的原理图
2 系统方案与论证
2.1 总体方案与比较论证
方案一:采用单片机控制合成各种波形。
单片机内部有功能很强的算术逻辑单元,并且具有很多接口,因此具有使用灵活、适应性强的优点。用单片机可以产生任何波形的数字信号,波形的选择,生成及频率控制均由单片机编程实现。此方案产生的频率范围,步进值取决于所采用的每个周期的输出点数及单片机执行指令的时间。此方案的优点是硬件电路简单,所用器件少,且实现各种波形相对容易,在低频区基本能实现要求的功能;缺点是精度不易满足,产生波形频率范围小,特别难以生成高频波形。
方案二:直接数字合成方法产生正弦波。
利用DDS技术产生信号波形的原理框图如下图2。
图 2 DDS方法产生信号的原理框图
相位累加器是DDS的核心部分,它由一个N位的加法器和N位的寄存器构成,通过把上一个时钟的累加结果反馈回加法器的输入端实现累加功能。这里的N是相位累加器的字长,K叫做频率控制字。每经过一个时钟周期,相位累加器的值递增K。
波形ROM示意图如图2.3所示
图2.3 波形 ROM示意图
当 ROM 地址线上的地址(相位)改变时,数据线上输出相应的量化值(幅度量化序列)。
D/A 转换器将波形ROM输出的幅度量化序列转化成对应的电平输出,将数字信号转换成模拟信号。但输出波形是一个阶梯波形,必须经过抗镜像滤波,滤除输出波形中的镜像才能得到一个平滑的波形。抗镜像滤波器是一个低通滤波器,要求在输出信号的带宽内有较平坦的幅频特性,在输出镜像频率处有足够的抑止。
根据 DDS的基本结构,可以推出以下一些结论:
频率控制字K唯一地确定一个单频模拟余弦信号的频率, (2.1)
当K =1的时候DDS输出最低频率为,
= (2.2)
这就是DDS的频率分辨率,所以,当N不断增加的时候DDS的频率分辨率可以不断的提高。D/A转换器的输出波形相当于是一个连续平滑波形的采样,根据奈奎斯特采样定律,采样率必需要大于信号频率的两倍。也就是说D/A转化器的输出如果要完全恢复的话,输出波形的频率必须小于。一般来说,由于低通滤波器的设计不可能达到理想情况,即低通滤波器总是有一定的过渡带的,所以输出频率还要有一定的余量,一般来说在实际应用当中DDS的输出频率不能超过0.4。
此方案简单可靠、控制方便,且具有很高的频率分辨率和转换速度,可以实现可编程和全数字化,控制灵活方便,并具有极高的性价比。
方案三:锁相频率合成技术方案
锁相环合成法 通过锁相环完成频率的加、减、乘、除运算。该方法结构简化、便于集成,且频谱纯度高,目前使用比较广泛,但存在高分辨率和快转换速度之间的矛盾,一般只能用于大步进频率合成技术中。
比较以上三种方案的优缺点,方案二简洁、灵活、可扩展性好,能完全达到设计要求,故采用第二种方案。
2.2 系统原理与结构
2.2.1 主要芯片选择
本设计除了用到FPGA芯片外,主要用到了两片10位超高速DAC,转换速率最高150MHz。GW_ADDA板上的A/D和D/A全部处于使能状态,除了10位数据线外,控制信号线只有时钟线。
EP1C0Q240C8(Cyclone系列FPGA):
Cyclone(飓风):Altera中等规模FPGA,2003年推出,0.13um工艺,1.5v内核供电,与Stratix结构类似,是一种低成本FPGA系列 ,是目前主流产品,其配置芯片也改用全新的产品。
DA5651:10位超高速DAC(转换速率最高150MHz)。
2.2.2 系统结构
图 3 系统结构原理图
在本次设计中,相位累加器为32位,取其中的高10位(31~22)作为ROM地址发生器,在紧跟着的21~10位作为频率字(有效字)的输入。相位字(有效字)作为对ROM地址产生偏移的值取高8位有效,即9~2位,低2位取0。这样可以实现一个周期的移相。频率字的输入为12位,相位字的输入为8位,以及后来的发挥部分中幅度字的输入也为8位,输出的两路正弦信号为10位数据位宽,分别接入两片高速DAC,最后由示波器显示波形。
3 单元电路设计
3.1 数字DDS(DDFS)模块设计
3.1.1 DDS原理
DDS 以数控的方式产生频率、相位和幅度可以控制的正弦波,DDS 的基本结构主要由相位累加器、相位调制器、正弦ROM查找表、D/A转换器、和低通滤波器组成。相位累加器是整个 DDS 核心,完成相位累加运算。
所谓移相是指两路同频的信号,以其中的一路为参考,另一路相对于该参考作超前或滞后的移动,即称为是相位的移动。两路信号的相位不同,便存在相位差。
直接数字合成(DDS)移相原理是:先将正弦波信号数字化,并形成一张数据表存入两片ROM芯片中,此后可通过两片D/A转换芯片在计数器的控制下连续地循环输出该数据表,就可获得两路正弦波信号。当两片D/A转换芯片所获得的数据序列完全相同时,则转换所得到的两路正弦波信号无相位差称为同相。当两片D/A转换芯片所获得的数据序列不同时,则转换所得到的两路正弦波信号就存在着相位差。相位差的值与数据表中数据的总个数及数据地址的偏移量有关。这种处理方式的实质是将数据地址的偏移量映射为信号间的相位值。数据的偏差可以通过外部微处理器来获得相应的数字量输入,这个数值对应着正弦信号的移相角度。
数字移相信号发生器的核心是 DDS,相位累加器输出与相位增量相加,相加后的结果形成正弦查询表地址,取出表中与该相位对应的单元中的幅度量化正弦函数值,经高速 D/A转换器输出模拟信号。两路信号的相位差用相位字来控制,只要相位字不同,就可得到两路不同相位的移相信号。一张数据表格由 1024 个数据点组成,存储了一个周期的正弦波,相位差的分辨率为:,具有很高的相位分辨率
3.1.2 频率加法模块
设计要求频率范围:1Hz~4kHz,频率步进为1Hz。根据原理可以确定频率为1HZ时,一个波形需采样4096000个点即4096000Ts=1s。由于ROM的字数一定即1024个,因此ROM中每个点需采样4000次。实现每个点采样4000次,可以通过设置一个22位的加法器来实现,选取加法器输出端高10位作为ROM地址线,加法器一输入端低12位和频率控制字相连,则可实现ROM中每点最多4096次采样!若用4096近似4000,此时也可得到输出频率与控制字一一对应的关系。(即控制字为多少(十进制),输出频率为多少)。本设计采用32位。
模块连接图如图4。
图 4 累加器连接图
仿真结果如下:
以400步进累加
图 5 累加器电路仿真结果
相位累加器流程图如图6所示
开 始
时钟上升沿到?
NO
YES
相位累加
累加值寄存
高10位输出
结 束
图 6 累加器流程图
3.1.3 相位加法模块
相位加法器是实现相移的关键。设计要求相位差范围为0~359°,步进为1.4°,需要将360°等分成256个单位(相位控制字8位二进制数),如今一个完整的正弦波ROM有1024个字,对应360°,因此可以用一个10位加法器可以实现,其一输入端接基准地址线,另一输入端高8位接相位控制字便可实现步进1.4°、移相范围0~359°的要求。
模块连接图如图7。
图 7 相位加法电路连接图
仿真结果如下:
以1递增,实现以1.4度移相
图 8 相位加法电路仿真结果
3.1.4 幅度调节模块
输出幅度峰峰值0.1~3.0V,步距0.1V。因此需要8位的幅度字。定制的sin模块输出数据10位,因此幅度控制字位10位(低2位不用)。
幅度调节模块如下图9。
图 9 幅度调节电路
幅度字(有效字)取高8位,当最大为30时,幅度字为7CH=124=2^7,与ROM的10位输出数据相乘,结果取中间10位(16—7)作为输出数据,结果略小于实际值。
3.2 时钟模块设计
本设计要求频率以1HZ步进,由DDS理论可知,频率间隔与时钟频率fclk及累加器位数n的关系式是Δfmin=fclk/2^n。相位累加器为32位,取其中的高10位(31~22)作为ROM地址发生器。为实现输出1Hz,则高10位地址最低位第22位必须以1kHz进行计数,在紧跟着的21~10位作为频率字(有效字)的输入,那么频率字(有效字)的最低位第10位必须以4MHz进行计数。当n=22时,计算可得,fclk=4MHZ。
由实验箱上的50M经过锁相环输出32M,在经过八分频的到。其原理如下:
图 10 时钟产生电路
其中输入为50MHz,输出为4MHz仿真如下:
图 11 时钟产生电路仿真结果
3.3 预置、显示模块
3.3.1 输入设计
由设计任务可知:频率范围为1Hz~4000Hz=2^12,所以fxian、fword分别为16位和12位有效字,数值大小相同,不同的是fxian为10进制、fword为16进制。相位差范围为0~359°,步进为 1.4°,由359/1.4=256可以设置pxian、pword分别为8位和8位有效字,数值相等都为16进制。输出幅度峰峰值0.1~3.0V,步距0.1V,由30=1Fh,同样设置axian、aword分别为8位和8位有效字,数值大小相同,不同的是axian为10进制、aword为16进制。
24
由于受到按键限制,输入部分采用数据分配器,由3位键控制数据的输入。s作为输入片选信号,clk作为输入采样时钟,fword、pword、aword作为频率字、相位字、幅度字输出;fxian、pxian、axian作为频率预置值、相位预置值、幅度预置值输出到数码管显示。
当s=’0’时,输入数据以频率有效,当s=’1’时,输入数据以相位和幅度有效。
具体控制如下表1:
表 1 输出显示与按键关系
s=’0’
s=’1’
key控制
说明
频率
15~12
幅度
7~4
计数满复位
11~8
3~0
Key(0)
加法计数,产生进位
7~4
相位
7~4
Key(1)
加法计数,不产生进位
3~0
3~0
Key(2)
加法计数,不产生进位
3.3.2 输出设计
输出设计是将预置值以十进制显示出来。其中显示频率要用到4个数码管,显示相位要用到2个数码管,显示幅度需要2个数码管。由于只有四个数码管显示数据,因此采用一个数据选择器对输出作调整。输入部分有三个数据,x1表示频率(十进制)、x2表示相位(16进制)、x3表示幅度(十进制); d 作为输出片选信号,当d=’0’时,输出数据为x1(频率),当 d=’1’时,输出数据为 x2(相位)和x3(幅度)并置。
对于两路正弦信号分别采用两片位超高速DAC(转换速率最高150MHz),两个电位器可分别调协两个D/A输出的幅度(输出幅度峰峰值不可大于5V,否则波形失真);J1和J2分别是模拟信号输出的PA、PB口,也可在挂钩处输出,分别是两个10位DA5651输出口。
本次设计调幅最大为3V,以30显示,步进为1,则最大值为2^10*2^7=2^17,以10显示表示1V,10≈2^3,所以取乘法器结果的16~7中间10位,此时基准幅度略微小于0.1V,最大为3.0V。
3.4 波形ROM的设计
首先要确定波形ROM的地址线位数和数据的字长,根据噪声功率的角度看波形ROM的地址线位数应该等于或略大于字长。由于设计选择的DAC位数为10,这样ROM的字长很明显该和DAC的字长相一致。而地址线的位数同样确定为10位。
波形存储器利用相位累加器输出的高10位作为地址线来对其进行寻址,最后输出该相位对应的二进制正弦幅值。SIN_ROM由LPM_ROM定制生成的,内部含有一个正弦波的.mif格式文件。其输出接高速D/A的数据输入,便可生成一个完整的正弦波。其仿真见整体模块仿真。
4 时序仿真分析
综合仿真结果如下:
(1)当s='1',d='1'时,调节相位,按下key(0)(即key=”110”),以增加相位,相应的显示dabcd中相位数据在增加,可以从pout中看出步距减小,即经过移相后,波形向左移,产生相位差。
pout增加,dabcd后两位数据也相应增加
(2)当s='0',d='0'时,按下key(0)(即key=”110”)以100的步进增加频率,可以从fout和pout中看出频率逐渐增大,dabcd显示数据也相应增大,如下图:
频率均在增加
(3)当s='0',d='0'时,按下key(0)(即key=”110”)以100的步进增加频率,一段时间后松开,可以从fout和dabcd中看出频率保持恒定且相等,如下图:
fout和dabcd显示频率相等
5 测试结果及分析
5.1 测试性能概览
频率幅度测试:
表 2 测试结果
输入频率(HZ)
输出频率(HZ)
输入相位
输出相位
输入幅度(V)
输出幅度(V)
1000
967
80
80
2.0
2.05
2000
1936
FF
FF
3.0
2.94
示波器观察结果如下图:
图 12 相位显示为80时的波形 图 13 预置频率为2000HZ时的波形
图 14 幅度为3V时的波形
5.2 测量误差分析
(1) 在正弦波生成.mif文件时,存在量化噪声。
(2) 由于时钟不稳定的原因造成输出波形的畸变。
(3) 在计算时存在近似误差。
(4) 电压幅度截断,就是ROM的存储容量有限引起的舍位误差,也可以认为是D/A转换器分辨率有限引起的误差。
(5) 相位截断,相位累加器的字长一般不等于ROM地址线的位数,因此在这个过程当中也又会引入相位截断误差。
(6) 用示波器测量时会引入随机噪声,也会影响到波形的变化。
6 心得体会
短短几天的课程设计很快就结束了,回顾这次设计大赛,受益匪浅。在本次设计中,遇到不少困难,但通过分析问题,请教同学老师,最终顺利完成预期设计要求和任务,为这次设计画上了圆满的句号。
本次设计是基于FPGA芯片的DDS技术设计一个波形发生器,用高速A/D进行转换,DDS技术通过模拟到数字再到模拟,提高了其输出频率的稳定性。通过本次设计,加深了我对DDS原理的理解和运用。刚开始拿到题目时,在老师的讲解下,按照课本上的方法,首先算出了其系统时钟,加法器位数、频率控制字位数及在32位总线的安排等等。但在设计之前一直不理解时钟的计算及如何实现1HZ的步进,如何实现幅度调节等。通过查阅相关资料,对设计原理有了更深的理解。
在设计的过程中,加深了对FPGA实验箱的了解,对QUARTUS软件的应用,提高了我分析问题解决问题的能力。用示波器验证输出波形时,满怀期待能够实现要求,但连个波形都没,也不知道问题的原因。经过分析、改正及下载,可结果仍令人大失所望。在老师的指导下,才知道系统时钟不准确。最后利用定制锁相环的方法解决了系统时钟问题。
还有利用软件对各个模块的仿真系统、误差来源的分析、毛刺的消除等等,都让我积累了宝贵的设计经验,为进行系统设计打下了基础。
课程设计能够让我们把自己所学的知识用到实践上去,还能够充分调动学生的积极性,增加对电子课程学习的兴趣,希望学习能够多安排这样的机会,增强同学们各方面的综合素质。
参考文献
何小艇 《电子系统设计》 浙江大学出版社 2008.1
潘松 黄继业 《EDA技术实用教程》 科学出版社 2006.10
王勇 《EDA》实验指导书 电工电子实验教学中心 2006.8
齐晶晶 李娜 《现代电子系统》实验指导书 电工电子实验教学中心 2009
附录
顶层文件原理图
主要源程序
--数据分配器
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity demux is
port(clk:in std_logic;
key:in std_logic_vector(2 downto 0);
s:in std_logic;
fxian:out std_logic_vector(15 downto 0); --频率显示
fword:out std_logic_vector(31 downto 0) ; --频率字输出
pxian:out std_logic_vector(7 downto 0); --相位显示
pword:out std_logic_vector(9 downto 0); --相位字输出
axian:out std_logic_vector(7 downto 0); --幅度显示
aword:out std_logic_vector(9 downto 0)); --幅度字输出
end;
architecture one of demux is
signal fx:std_logic_vector(15 downto 0);
signal fw:std_logic_vector(11 downto 0);
signal px:std_logic_vector(7 downto 0);
signal pw:std_logic_vector(7 downto 0);
signal ax:std_logic_vector(7 downto 0):="00000001";
signal aw:std_logic_vector(7 downto 0):="00000001";
signal a,b,c:std_logic:='1';
begin
a<=key(0);b<=key(1);c<=key(2);
process(a,b,c,s)
begin
if clk'event and clk='1' then
if s='0' then --频率输入有效
if c='0' then --个位加
if fx>"0011100110011001" then
fx<=(others=>'0');fw<=(others=>'0');
elsif fx(3 downto 0)="1001" then fx(3 downto 0)<="0000";
fw<=fw-"000000001001"; --个位加满,不产生进位
else fx(3 downto 0)<=fx(3 downto 0)+"0001";
fw<=fw+"000000000001";
end if;
elsif b='0' then --十位加
if fx>"0011100110011001" then
fx<=(others=>'0');fw<=(others=>'0');
elsif fx(7 downto 4)="1001" then fx(7 downto 4)<="0000";
fw<=fw-"000001011010"; --十位加满,不产生进位
else fx(7 downto 4)<=fx(7 downto 4)+"0001";
fw<=fw+"000000001010";
end if;
elsif a='0' then --百位加
if fw>"111110010000" then
fx<=(others=>'0');fw<=(others=>'0');
elsif fx(11 downto 8)="1001" then
fx(15 downto 12)<=fx(15 downto 12)+"0001";
fx(11 downto 8)<="0000";
fw<=fw+"000001100100"; --百位加满,产生进位
else fx(11 downto 8)<=fx(11 downto 8)+"0001";
fw<=fw+"000001100100";
end if;
else fx<=fx;fw<=fw;
end if;
else --相位,幅度输入有效
if c='0' then --相位个位
pw(3 downto 0)<=pw(3 downto 0)+"0001";
px(3 downto 0)<=px(3 downto 0)+"0001";
elsif b='0' then --相位百位加
pw(7 downto 4)<=pw(7 downto 4)+"0001";
px(7 downto 4)<=px(7 downto 4)+"0001";
elsif a='0' then --幅度加
if aw>"00011101" then
ax<="00000001";aw<="00000001";
elsif ax(3 downto 0)="1001" then
ax(7 downto 4)<=ax(7 downto 4)+"0001";
ax(3 downto 0)<="0000";
aw<=aw+"00000001"; --个位加满,向十位产生进位
else aw<=aw+"00000001";ax<=ax+"00000001";
end if;
else pw<=pw;px<=px;ax<=ax;aw<=aw;
end if;
end if;
end if;
fxian<=fx;pxian<=px;axian<=ax;
fword<="0000000000"&fw&"0000000000";
pword<=pw&"00";aword<=aw&"00";
end process;
end one;
--10位乘法器
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity mac10 is
port(l1,l2:in std_logic_vector(9 downto 0);
lx:out std_logic_vector(9 downto 0));
end;
architecture one of mac10 is
signal tmp:std_logic_vector(19 downto 0);
begin
process(l1,l2)
begin
tmp<=l1*l2;
lx<=tmp(16 downto 7); --相乘结果取中间10位
end process;
end one;
--数据选择器,用来显示选择
library ieee;
use ieee.std_logic_1164.all;
entity mux2 is
port(x1:in std_logic_vector(15 downto 0);
x2:in std_logic_vector(7 downto 0);
x3:in std_logic_vector(7 downto 0);
d:in std_logic;
dax:out std_logic_vector(15 downto 0));
end;
architecture one of mux2 is
begin
process(x1,x2,x3,d)
begin
case d is
when '0'=>dax<=x1; --显示频率
when '1'=>dax<=x2&x3; --显示相位和幅度
end case;
end process;
end one;
评 语
成绩:
展开阅读全文