• 基于Vivado调用ROM IP core设计DDS


     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;
    ');
     6 fprintf(fid,'MEMORY_INITIALIZATION_VECTOR=
    ');
     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,'
    ');
    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;
    ');
    24 fprintf(fid,'MEMORY_INITIALIZATION_VECTOR=
    ');
    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,'
    ');
    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;
    ');
    42 fprintf(fid,'MEMORY_INITIALIZATION_VECTOR=
    ');
    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,'
    ');
    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 <= 32'd0;
    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,选择如下图所示参数。

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

     

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

     

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

    个人微信订阅号:NingHeChuan

    如果你想及时收到个人撰写的博文推送,可以扫描左边二维码(或者长按识别二维码)关注个人微信订阅号

    知乎ID:NingHeChuan

    微博ID:NingHeChuan

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

  • 相关阅读:
    B-tree/B+tree/B*tree
    java拆装箱(转)
    C语言身份证信息查询系统(修改版)
    UC编程:字符读取与行读取
    UC编程:通过fwrite()和write()比较标准库函数和系统调用的速度
    UC编程:输入输出重定向(系统调用)
    UC编程:输入输出重定向(标准IO)
    UC编程:环境变量的查询与修改
    Perl基础(1)chop与chomp的区别
    假期“实习”20天生存实录
  • 原文地址:https://www.cnblogs.com/ninghechuan/p/6421360.html
Copyright © 2020-2023  润新知