一、实验设计
① 利用DDS(Direct DIgital Frequency Synthesis,即直接数字频率合成)技术产生稳定的正弦波,三角波和方波输出,输出频率为10~1000kHz且频率可调,步进为10Hz,1kHz,10kHz,100kHz。 ② 用VerilogHDL进行建模和模拟仿真,再利用FPGA进行实现D/A转换。 ③ 下载到DE0板上利用VGA端口的一个四位孔进行A/D转换显示在示波器上。
二、实验原理
一个直接数字频率合成器由相位累加器、波形ROM、D/A转换器和低通滤波器构成。
其中K为频率控制字, fc为时钟频率,N为相位累加器的字长,D为ROM数据位及D/A转换器的字长。相位累加器在时钟 fc的控制下以步长K作为累加,输出N位二进制码作为波形ROM的地址,对波形ROM进行寻址,波形ROM输出的幅码S(n)经D/A转换器变成梯形波S(t),再经低通滤波器平滑后就可以得到合成的信号波形了。合成的信号波形形状取决于波形ROM中存放的幅码,因此用DDS可以产生任意波形。
三、实验内容:1、相位累加器和数据锁存器的设计 本设计采用模24的二进制累加器和寄存器,其中累加器和寄存器在一个模块中,只取锁存数据的高十位作为查表的地址值。 //地址计数器模块; module counter(clk,fre_word,address); input clk; //声明系统时钟为clk input [23:0] fre_word; //声明24为频率控制字 output reg [9:0] address; reg [23:0] phaseadder; always @ (posedge clk) begin phaseadder=phaseadder+fre_word; address=phaseadder[23:14]; //地址取输出锁存后十位(对应波形为一个周期取1024点) end endmodule 2、波形存储器设计 本设计要求DDS系统能输出方波、三角波及正弦波三种波形。可以调用FPGA的LPM_ROM模块制作三张ROM表,地址计数器可以同时访问这三张表,再使用数据选择器输出指定波形。实际上,方波,三角波的实现算法比较简单,所以只把正弦波的算法用ROM实现。 //方波产生模块 module squwave(clk,address,qsquare); input clk; //系统时钟; input [9:0] address; //10位地址输入信号; output reg [7:0] qsquare; //输出方波幅度信号8位宽送至DAC always @ (posedge clk) if (address<=10'b01_1111_1111) qsquare[7:0]=8'b1111_1111; else qsquare[7:0]=8'b0000_0000;endmodule //三角波产生模块 module triawave(clk,address,qtriangle); input clk; input [9:0] address; output reg [7:0] qtriangle; always @ (posedge clk) begin if (address<=10'b01_1111_1111) qtriangle[7:0]=address[8:1]; else qtriangle[7:0]=~address[8:1]; end endmodule //正弦波形文件制作(C语言) #include<stdio.h> #include<math.h> void main() { int s; int i; FILE* fp; fp=fopen("1024.mif","w+"); fprintf(fp,"--MAX+plusII-generated Memory Initialization File\n"); fprintf(fp,"--By 00022809\n\n\n\n\n"); fprintf(fp,"WIDTH=8;\n\n"); fprintf(fp,"DEPTH=1024;\n\n"); fprintf(fp,"ADDRESS_RADIX=HEX;\n\n"); fprintf(fp,"DATA_RADIX=HEX;\n\n"); fprintf(fp,"CONTENT BEGIN\n"); for(i=0;i<1024;i++) { s=128+sin(atan(1.0)*8/1024*i)*127; fprintf(fp,"%x\t:\t%x;\n"); } fprintf(fp,"END;\n"); fclose(fp);} 

生成mif格式文件,然后可以调用LPM_ROM模块实现正弦波产生模块。
5、DDS函数信号发生器顶层设计 顶层文件是将上述几个模块联系在一起就可以得到DDS核心实现模块。 //顶层文件
module dds(clk,clk1,keyin,wavevalue,single_state,single_frc); input clk,clk1; //系统时钟和控制按键 input [3:0] keyin; //四位状态输入信号 input [1:0]single_frc; //频率及步进输入模式信号 input [1:0]single_state; //波形选择开关 output [7:0] wavevalue; //输出波形信号 wire [9:0] address; wire [1:0] wavemode; wire [23:0] length; control u1(clk1,keyin,wavemode,length,single_state,single_frc); //调用其他三个模块 counter u2(clk,length,address); boxing u3(clk,address,wavemode,wavevalue); endmodule

转载于:https://www.cnblogs.com/miao962464/p/6567983.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐