资源描述:
《DDS算法的Verilog实现》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、一、DDS设计要求用VerilogHDL语言实现基于DDS技术的余弦信号发生器,其输出位宽为16bit。二、使用MATLAB定点正、余弦波形数值借助MATLAB生成ROM中的定点正、余弦波形数值,形成.coe文件。1.利用MATLAB计算出正、余弦波形的浮点值,并量化16bit的定点波形数值[2]。x=linspace(0,6.28,1024);%在区间[0,6.28]之间等间隔地取1024个点y1=cos(x);%计算相应的正余弦值y2=sin(x);%由于正余弦波形的值在[0,1]之间,需要量化成16bit,先将数值
2、放大y1=y1*32678;y2=y2*32768;%再将放大的浮点值量化,并写到存放在E盘的文本中fid=fopen('e:/cos_coe.txt','wt');fprintf(fid,'%16.0f',y1);%在写文件时量化成16bitfclose(fid)fid=fopen('e:/sin_coe.txt','wt');fprintf(fid,'%16.0f',y2);fclose(fid)2.产生.coe文件在e盘根目录下,将cos_coe.txt和sin_coe.txt的后缀改成.coe,打开文件,
3、把每一行之间的空格用文本的替换功能换成逗号“,”,并在最后一行添加一个分号“;”。最后在文件的最开始添加下面两行:memory_initialization_radix=10;memory_initialization_vector=然后保存文件退出。三、将coe文件加载到BLOCKROM所生成的ROM中新建一个BLOCKRAM的IPCore,其位置为Memories&StorageElements/RAMs&ROMs/BlockMemoryGeneratorv4.3,在第一页选择singleportrom,在第二页选择
4、位宽为16、深度为1024,在第三页下载.coe文件,然后双击finish,完成IPcore的生成。如果.coe文件生成的不对,图中用椭圆标志之处是红色的,.coe文件错误的类型主要有数据基数不对和数据的长度不对这两类。四、DDS的VerilogHDL的实现`timescale1ns/1psmoduledds(data,we,clk,ce,reset,sine,cose);input[31:0]data;//频率控制字inputwe;//频率控制字写使能inputclk;//时钟inputce;//DDS使能inputr
5、eset;//复位output[15:0]sine;//正弦信号输出output[15:0]cose;//余弦信号输出reg[31:0]ADD_A;//正弦波产生模块的相位累加器reg[31:0]ADD_B;//余弦波产生模块的相位累加器reg[15:0]cose_DR;//余弦波的查找表输出reg[15:0]sine_DR;//正弦波的查找表输出wire[31:0]data;//频率控制字wire[9:0]ROM_A;wire[15:0]cose_D;wire[15:0]sine_D;assigncose=cose_D
6、R;assignsine=sine_DR;assignROM_A=ADD_B[31:22];always@(posedgeclkorposedgereset)beginif(reset)//系统初始化时,默认的频率控制字为0ADD_A<=0;elseif(we)ADD_A<=data;endalways@(posedgeclkorposedgereset)beginif(reset)ADD_B<=0;elseif(ce)ADD_B<=ADD_B+ADD_A;//ADD_B为累加的结果endalways@(posedgec
7、lkorposedgereset)beginif(reset)cose_DR<=0;elseif(ce)cose_DR<=cose_D;endalways@(posedgeclkorposedgereset)beginif(reset)sine_DR<=0;elseif(ce)sine_DR<=sine_D;end//调用两个ROM,存储着正余弦波形一个周期的数值cosu1(.clka(clk),.addra(ROM_A),.douta(cose_D));sinu2(.clka(clk),.addra(ROM_A),.d
8、outa(sine_D));endmodule