实验二 DDS波形发生器设计实验报告.docx
《实验二 DDS波形发生器设计实验报告.docx》由会员分享,可在线阅读,更多相关《实验二 DDS波形发生器设计实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
实验二DDS波形发生器设计实验报告
实验二DDS波形发生器设计实验报告
一.实验任务及要求
任务:
利用FPGA+DAC,设计一个DDS信号发生器。
要求:
(1)分辨率优于1Hz
(2)ROM表长度8位、位宽10位
(3)输出频率优于100kHz(每周期大于50个点)
(4)显示信号频率/频率控制字
二.实验设计方案
用CPLD,FPGA实现DDS波形发生器设计
用QuartusII的原理图输入来完成系统的顶层设计。
相位累加器调用用HDL编写。
波形存储器通过调用lpm_rom元件实现,其LPM_FILE的值*.mif是一个存放波形幅值的文件。
频率-频率控制字之间的转换,可用乘、除法模块(LPM)设计以及用VHDL语言编写。
其具体实现方案如下原理图
输出频率:
(1)通过时钟频率,改变输出波形的频率
(2)改变寻址的步长来改变输出信号的频率—DDS
设:
相位累加器为N位,Sin表的大小为2P,累加器的高P位用于寻址Sin表.时钟频率为fC,若累加器按步进为M地累加直至溢出,称M为频率控制字。
三.系统硬件设计
1)DDS参数计算
相位寄存器每经过2N/M个时钟fc后回到初始状态,相应地正弦查询表经过一个循环回到初始位置,整个DDS系统输出一个正弦波。
则输出正弦波周期To=Tc*2n/M
即输出正弦波频率fout=M×fc/2n
要求分辨率优于1Hz则fc/2n<1
输出频率优于100kHz(每周期大于50个点)
则fout=M×fc/2n>100KH
2n/M>50
由
、
可得输入频率fc>5MHZ,在实验中我们设脉冲频率为10MHZ。
2)在实验中采用24位相位累加器(即n=24),用VHDL创建功能模块。
原理:
通过频率控制字控制相位累加,直至溢出,取其高8位作为查询sin表的地址,从而控制输出的波形。
3)频率控制字M的设置,用VHDL创建功能模块aa
设置a1,a2,a3三个输入端,其不同的输入组合对应控制频率控制字M的各个位,确定控制位后,通过输入单脉冲控制其大小,直到输入所需控制字,同时设置了复位端rst1。
4)LPM_ROM模块功能及原理
通过公式1023/2*[sin(2*3.14*A/256)+1]制作sin表,设置长度8位、位宽10位。
波形存储器通过调用lpm_rom元件实现,其LPM_FILE的值*.mif是制作的sin表文件。
5)输出频率-频率控制字之间的转换,用VHDL创建功能模块chang。
通过设置使能端en,控制输出频率与频率控制字之间的显示转换。
6)输出频率显示设置,采用乘、除法模块(LPM)设计以及用VHDL语言编写。
其中通过编写VHDL,设置其输出单位,创建功能模块ij和xz。
当LED1灯亮时则输出单位为KHZ,否则为HZ。
并且通过乘除法的转换输出使数码管最后一位显示的为小数位。
因为数码管为16进制显示所以在设置输出时,把fout=M×fc/2n之后乘以16,这样在数码管上显示的最后一位即为小数位。
7)具体电路原理图见附录1
四.系统软件设计
1)部分功能模块流程图
相位累加器(ljq)流程图
输出频率-频率控制字转换(chang)流程图
2)具体程序清单见附录2
五.系统测试
1)电路的测试方案
通过参数的计算公式fout=M×fc/2n,控制M的大小,测出输出频率并与理论数据相比较。
2)电路测试结果
通过调试得到完整稳定的波形图
当输入控制字M大小为28F14H(十进制167700)时,经理论计算得输出频率为100KHZ;示波器中显示输出频率为99.9578KHZ;此时实验箱中LED1灯变亮,数据显示为665,因为数码管最后一位显示为小数,则显示输出数据应为(66.5H)KHZ,转换为10进制即102.03125KHZ.
当输入控制字M大小为68DH(十进制1677)时,经理论计算得输出频率为1KHZ;示波器中显示输出频率为999.578HZ;此时实验箱中LED1灯未变亮,数据显示为10,同上,则显示输出数据应为(1.0H)KHZ,转换为10进制即1KHZ.
当输入控制字M大小为10400H(十进制66560)时,经理论计算得输出频率为1KHZ;示波器中显示输出频率为999.578HZ;此时实验箱中LED1灯未变亮,数据显示为10,同上,则显示输出数据应为(1.0H)KHZ,转换为10进制即1KHZ.
当输入控制字M大小为1H(十进制1)时,经理论计算得输出频率为596mHZ;示波器中显示输出频率为599.3mHZ;此时实验箱中LED1灯未变亮,数据显示为0,同上,则显示输出数据应为0HZ,最小输出频率。
当输入控制字M大小为FFFFFH,经理论计算得输出频率为625KHZ;示波器中显示输出频率为625.004KHZ;此时实验箱中LED1灯未变亮,数据显示为2712,同上,则显示输出数据应为(271.2H)KHZ,转换为10进制即625.125KHZ.即为最大书出频率。
六.实验结论
由电路测试数据可知,测试结果与理论数据几乎相等,则实验设计正确。
在实验过程中,在对小数进行处理时出现了一些问题,为了在数码管中显示出一位小数点,即显示的数据向左移动一位,刚开始直接在数据输出显示fout=M×fc/2n之后乘以10,忘了数码管显示为16进制,从而导致了数据显示结果总是与理论相差很多。
通过这次实验,我们对数字系统设计的方法有了更进一步的掌握。
附录1
附录2
程序清单
1.控制字M的设置
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
entityaais
port(a1,a2,a3,rst1:
inbit;
q1,q2,q3,q4,q5:
bufferunsigned(3downto0);
cp:
inbit);
endaa;
architecturertlofaais
signaltmp_in:
bit_vector(2downto0);
begin
tmp_in<=a3&a2&a1;
process(cp,tmp_in,rst1)
begin
ifrst1='1'thenq1<="0000";q2<="0000";q3<="0000";q4<="0000";q5<="0000";
elsifcp'eventandcp='1'then
iftmp_in="001"thenq1<=q1+1;
elsiftmp_in="010"thenq2<=q2+1;
elsiftmp_in="011"thenq3<=q3+1;
elsiftmp_in="100"thenq4<=q4+1;
elsiftmp_in="101"thenq5<=q5+1;
endif;
endif;
endprocess;
endrtl;
2.累加器ljq
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
entityljqis
port(m:
inunsigned(19downto0);
cp2,rst:
inbit;
data:
outunsigned(23downto0));
endljq;
architectureatlofljqis
signaliq:
unsigned(23downto0);
begin
process(m,cp2,rst,iq)
begin
ifrst='1'theniq<="000000000000000000000000";
elsif(cp2'eventandcp2='1')then
iq<=iq+m;
endif;
data<=iq;
endprocess;
endatl;
3输出频率显示设置ij和xz
Ij:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
entityjjis
port(qi:
inunsigned(25downto0);
z:
outbit;
r1,r2:
outunsigned(25downto0));
endjj;
architecturerlofjjis
begin
process(qi)
begin
ifqi<10000thenr1<=qi;
elser2<=qi;z<='1';
endif;
endprocess;
endrl;
xz:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
entityxzis
port(z:
inbit;
r1,r2:
inunsigned(25downto0);
r:
outunsigned(24downto0));
endxz;
architecturetofxzis
begin
process(z,r1,r2)
begin
ifz='1'thenr<=r2(24downto0);
elser<=r1(24downto0);
endif;
endprocess;
endt;
4输出频率与频率控制字的转换
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
entitychangeis
port(en:
inbit;
m:
inunsigned(19downto0);
n:
inunsigned(19downto0);
fo:
outunsigned(19downto0));
endchange;
architectureqieofchangeis
begin
process(en)
begin
ifen='1'then
fo<=m;
elsefo<=n;
endif;
endprocess;
endqie;