基于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;\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 <= 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,选择如下图所示参数。

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

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

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

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

时间: 2024-12-28 20:29:49

基于Vivado调用ROM IP core设计DDS的相关文章

基于 Redis 的代理 ip 池设计

代理 ip 因为配置简单而且廉价,经常用来作为反反爬虫的手段,但是稳定性一直是其诟病.筛选出优质的代理 ip 并不简单,即使付费购买的代理 ip 源,卖家也不敢保证 100% 可用:另外代理 ip 的生命周期也无法预知,可能上一秒能用,下一秒就扑街了.基于这些原因,会给使用代理 ip 的爬虫程序带来很多不稳定的因素.要排除代理 ip 的影响,通常的做法是建一个代理 ip 池,每次请求前来池子取一个 ip,用完之后归还,保证池子里的 ip 都是可用的.本文接下来就探讨一下,如何使用 Redis 构

只读储存器ROM IP核设计

原文地址:https://www.cnblogs.com/mengyi1989/p/11515982.html

基于ZigBee的家居控制系统的设计与应用

基于ZigBee的家居控制系统的设计与应用 PPT简介:http://pan.baidu.com/s/1i38PC6D 摘  要 智能家居是未来家居的发展方向,其利用先进的网络技术.计算机技术和无线通信技术等将家居中的各种电子电气设备连接起来,统一管理.远程监控和资源共享,实现了高效.便利的生活环境.近些年互联网的迅猛发展,网络的稳定性.安全性和网络带宽都有了长足的发展,由互联网提供的各种服务已经深入到人们生活的方方面面,因此将智能家居系统同互联网结合起来,为用户提供远程控制服务,延伸智能家居系

基于basys2驱动LCDQC12864B的verilog设计图片显示

前言 在做这个实验的时候在网上找了许多资料,都是关于使用单片机驱动LCD显示,确实用单片机驱动是要简单不少,记得在FPGA学习交流群里问问题的时候,被前辈指教,说给我最好的指教便是别在玩这个了,多看看关于FPGA方面的书籍,比做这个单片机做的东西价值强多了.现在想来确实,自从学习FPGA以来,看过的书没有多少,只是想做个什么了,就在网上找找例程,照抄下来,把算法推理一遍,下个板子实现了,便以为自己会了懂了,要是自己在写一个便问题百出.那么菜鸟始终是菜鸟.自己根本没有掌握FPGA的设计思想和优势,

调用altera IP核的仿真流程—上

调用altera IP核的仿真流程—上 在学习本节内容之后,请详细阅读<基于modelsim-SE的简单仿真流程>,因为本节是基于<基于modelsim-SE的简单仿真流程>的基础上进行设计的,关于设计仿真流程的过程所涉及到的重复内容将不再详述,将会一笔带过,如果深入学习了<基于modelsim-SE的简单仿真流程>这一小节,则下面的内容将会非常的简单. 编写RTL功能代码 本小节通过调用altera的ROM宏功能模块,FPGA的ROM模块主要用于存储数据,可以在上电的

Xilinx 7系列例化MIG IP core DDR3读写

昨晚找了一下,发现DDR3读写在工程上多是通过例化MIG,调用生成IPcore的HDL Functional Model.我说嘛,自己哪能写出那么繁琐的,不过DDR读写数据可以用到状态机,后期再添砖加瓦吧,当下先对比一下网上找的一段程序和自己例化后的程序. 另外,仿真了十余分钟,最后的是什么鬼?一头雾水T.T.想着每一次要分析信号要等那么久就难受. 更重要的是分享一波关于"Xilinx平台下DDR3设计教程"的资料.就其中的"仿真篇"而言,亲测可行,还是中文版 da

IP包设计

IP包 IP核(Intellectual Property core)就是知识产权核或知识产权模块的意思,用于配置FPGA或其它硅芯片上的逻辑资源. 引用链接https://blog.csdn.net/u012224606/article/details/60958524 IP(Intelligent Property)核是具有知识产权核的集成电路芯核总称,是经过反复验证过的.具有特定功能的宏模块,与芯片制造工艺无关,可以移植到不同的半导体工艺中.到了SOC阶段,IP核设计已经成为ASIC电路设

基于Linux的智能家居的设计(4)

3  开发环境的搭建 本次课题使用的开发环境比较特殊,没有一个现成的集成开发环境,需要自己一步一步的搭建开发环境,开发环境的搭建的过程十分复杂,而且如果没有这个开发环境本次课题就无法进行.因此,在进行设计时,必须要进行开发环境的搭建. 3.1  虚拟机安装和系统安装 在PC机上安装VMware workstation 10.0虚拟机,将虚拟网络改为桥接模式,在虚拟机中安装Ubuntu12.04的系统,然后安装VM-tools. 在windows下面的创建共享目录G:/share,实现window

利用IP核设计高性能的计数器

利用Quartus II的LPM_counter IP核进行设计(利用IP核设计可以迅速高效的完成产品的设计) 新建工程 调用IP核 创建一个新的IP核 选择LMP_COUNTER,语言类型,输出路径. 选择希望输出的寄存器是多少位的,计数类型, 选择计数器类型(直接计数还是以模的形式计数),是否需要时钟使能和计数使能信号.进位链的输入和进位链的输出. 清零加载等信号 之后一直next直到finish 创建成功后的IP核的文件信息 将counter.v文件加载到软件中 打开可以看到其中的接口文件