DDS算法的Verilog实现.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
DDS算法的Verilog实现

一、 DDS设计要求 用Verilog HDL语言实现基于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,先将数值放大 y1=y1*32678; y2=y2*32768; %再将放大的浮点值量化,并写到存放在E盘的文本中 fid = fopen(e:/cos_coe.txt, wt); fprintf(fid, %16.0f\n, y1); %在写文件时量化成16bit fclose(fid) fid = fopen(e:/sin_coe.txt, wt); fprintf(fid, %16.0f\n, y2); fclose(fid) 2.产生.coe 文件 在 e 盘根目录下,将 cos_coe.txt 和 sin_coe.txt 的后缀改成.coe,打开文件,把每一行之间的空格用文本的替换功能换成逗号“,”,并在最后一行添加一个分号“;”。最后在文件的最开始添加下面两行: memory_initialization_radix=10; memory_initialization_vector = 然后保存文件退出。 三、将 coe 文件加载到BLOCKROM所生成的ROM中 新建一个BLOCKRAM的 IP Core,其位置为Memories Storage Elements/RAMs ROMs/Block Memory Generator v4.3,在第一页选择single port rom,在第二页选择位宽为16、深度为1 024,在第三页下载.coe 文件,然后双击 finish,完成IP core 的生成。如果.coe文件生成的不对,图中用椭圆标志之处是红色的,.coe 文件错误的类型主要有数据基数不对和数据的长度不对这两类。 四、 DDS的Verilog HDL的实现 `timescale 1ns / 1ps module dds(data, we, clk, ce, reset, sine, cose); input [31 : 0] data; //频率控制字 input we; //频率控制字写使能 input clk; //时钟 input ce; //DDS使能 input reset; //复位 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; assign cose = cose_DR; assign sine = sine_DR; assign ROM_A = ADD_B[31 : 22]; always @ (posedge clk or posedge reset) begin if(reset) //系统初始化时,默认的频率控制字为0 ADD_A = 0; else if(we) ADD_A = data; end always @ (posedge clk or posedge reset) begin if(reset) ADD_B = 0; else if(ce) ADD_B = ADD_B + ADD_A; //ADD_B为累加的结果 end always @ (posedge clk or posedge reset) begin if(reset) cose_DR = 0; else if(ce) cose_DR = cose_D; end always @ (posedge clk or posedge reset) begin if(reset) sine_DR = 0; else if(ce) sine_DR = sine_D; end //调用两个ROM,存储着正余弦波形一个周期的数值 c

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档