码迷,mamicode.com
首页 > 其他好文 > 详细

基于Vivado调用ROM IP core设计DDS

时间:2017-03-19 16:03:06      阅读:2067      评论:0      收藏:0      [点我收藏+]

标签:tor   方法   des   begin   code   init   disabled   put   十分   

 

 DDS直接数字式频率合成器(Direct Digital Synthesizer)

  下面是使用MATLAB生成正弦波、三角波、方波的代码,直接使用即可。

 1 t=0:2*pi/2^12:2*pi
 2 y=0.5*sin(t)+0.5;
 3 r=ceil(y*(2^8-1)); %将小数转换为整数,ceil是向上取整。
 4 fid = fopen(sin.coe,w); %写到sin.coe文件,用来初始化sin_rom
 5 fprintf(fid,MEMORY_INITIALIZATION_RADIX=10;\n);
 6 fprintf(fid,MEMORY_INITIALIZATION_VECTOR=\n);
 7 for i = 1:1:2^12
 8 fprintf(fid,%d,r(i));
 9 if i==2^12
10 fprintf(fid,;);
11 else
12 fprintf(fid,,);
13 end
14 if i%15==0
15 fprintf(fid,\n);
16 end
17 end
18 fclose(fid);
19 t=1:1:2^12;
20 y=(t<=2047);
21 r=ceil(y*(2^8-1));
22 fid = fopen(square.coe,w); %写到square.coe,用来初始化rom_square
23 fprintf(fid,MEMORY_INITIALIZATION_RADIX=10;\n);
24 fprintf(fid,MEMORY_INITIALIZATION_VECTOR=\n);
25 for i = 1:1:2^12
26 fprintf(fid,%d,r(i));
27 if i==2^12
28 fprintf(fid,;);
29 else
30 fprintf(fid,,);
31 end
32 if i%15==0
33 fprintf(fid,\n);
34 end
35 end
36 fclose(fid);
37 t=1:1:2^12;
38 y=[0.5:0.5/1024:1-0.5/1024, 1-0.5/1024:-0.5/1024:0, 0.5/1024:0.5/1024:0.5];
39 r=ceil(y*(2^8-1));
40 fid = fopen(triangular.coe,w); %写到triangular.coe,初始化三角波rom
41 fprintf(fid,MEMORY_INITIALIZATION_RADIX=10;\n);
42 fprintf(fid,MEMORY_INITIALIZATION_VECTOR=\n);
43 for i = 1:1:2^12
44 fprintf(fid,%d,r(i));
45 if i==2^12
46 fprintf(fid,;);
47 else
48 fprintf(fid,,);
49 end
50 if i%15==0
51 fprintf(fid,\n);
52 end
53 end
54 fclose(fid);

   设计DDS的核心就是调用IP ROM,vivado调用ROM的方法和ISE相类似,都是加载.coe文件,我这里特地做笔记,以防忘记。

技术分享

  这是DDS的原理图,DDS并没有像它的名字一样说的那么玄乎,它的核心便是控制频率的fword字输入,和相位字pword输入,最后调用IP核查找表即可,代码也十分简单,下面给出DDS design代码。

技术分享
 1 module DDS(
 2             input mclk,
 3             input rst_n,
 4             input [31:0]fword,//frequency control
 5             input [11:0]pword,//phase control
 6             
 7             output [9:0]da_data
 8     );
 9     
10     reg [31:0]r_fword;
11     reg [11:0]r_pword;
12     reg [31:0]fcnt;
13     
14     wire [11:0]addr_rom;
15     
16     //同步寄存器
17     always @(posedge mclk)
18     begin
19             r_fword <= fword;
20             r_pword <= pword;
21         end
22       
23     always @(posedge mclk or negedge rst_n)
24     begin
25         if(!rst_n)
26             fcnt <= 32d0;
27         else
28             fcnt <= fcnt + r_fword;
29         end
30     
31     assign addr_rom = fcnt[31:20] + r_pword;
32     
33     //custom sin_rom
34     sin_rom sin_rom (
35     .clka(mclk),    // input wire clka
36     .addra(addr_rom),  // input wire [11 : 0] addra
37     .douta(da_data)  // output wire [9 : 0] douta
38     );
39 
40 endmodule
DDS_design

  使用vivado调用IP核ROM教程如下

技术分享

点击IP catalog 

技术分享

选择block memory,然后双击

技术分享

将show disabled ports 选项勾选掉

技术分享

输入ROM名,我这里为了演示重新配置一个方波ROM,命名为square_rom

技术分享

这里选择single ports ROM 

技术分享

  按如上图所示勾选参数,port width是数据宽度,我们根据代码要求设置为10位,

  port width是数据深度,即有多少个这样的数据,我打开生成的square.coe文件可以清楚的看到一共有4096这样的数据。

  always enable是ROM一直处于工作状态,不需要使能信号。

技术分享

这里是加载.coe文件,勾选load init file 然后点击browse将刚才生成的square.coe文件加载到ROM中,最后点击OK。

技术分享

选择generate生成IP核

技术分享

打开如图所示文件,

技术分享

技术分享

 

将生成的IP核实例化,即可

最后编写测试文件进行测试

最后右键点击da_data选择wave style选择analog,将会看到模拟波形,但是有时候还是需要设置一下模拟波形的显示,同样右键点击da_data选择wave style选择analog setting,选择如下图所示参数。

技术分享

最后便大功告成,即可得打方波的波形图

技术分享

 

大家还可以按照这种方法将其他两种波形都做出来。

 

转载请注明出处:Tough Enough(宁河川)

原文地址:http://www.cnblogs.com/ninghechuan/p/6421360.html 

 

基于Vivado调用ROM IP core设计DDS

标签:tor   方法   des   begin   code   init   disabled   put   十分   

原文地址:http://www.cnblogs.com/ninghechuan/p/6421360.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!