一文详解Vivado调用ROM IP core设计DDS

dds直接数字式频率合成器(direct digital synthesizer)
下面是使用matlab生成正弦波、三角波、方波的代码,直接使用即可。
t=0:2*pi/2^12:2*pi
y=0.5*sin(t)+0.5;
r=ceil(y*(2^8-1)); %将小数转换为整数,ceil是向上取整。
fid = fopen(‘sin.coe’,‘w’); %写到sin.coe文件,用来初始化sin_rom
fprintf(fid,‘memory_initialization_radix=10;\n’);
fprintf(fid,‘memory_initialization_vector=\n’);
for i = 1:1:2^12
fprintf(fid,‘%d’,r(i));
if i==2^12
fprintf(fid,‘;’);
else
fprintf(fid,‘,’);
end
if i%15==0
fprintf(fid,‘\n’);
end
end
fclose(fid);
t=1:1:2^12;
y=(t《=2047);
r=ceil(y*(2^8-1));
fid = fopen(‘square.coe’,‘w’); %写到square.coe,用来初始化rom_square
fprintf(fid,‘memory_initialization_radix=10;\n’);
fprintf(fid,‘memory_initialization_vector=\n’);
for i = 1:1:2^12
fprintf(fid,‘%d’,r(i));
if i==2^12
fprintf(fid,‘;’);
else
fprintf(fid,‘,’);
end
if i%15==0
fprintf(fid,‘\n’);
end
end
fclose(fid);
t=1:1:2^12;
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];
r=ceil(y*(2^8-1));
fid = fopen(‘triangular.coe’,‘w’); %写到triangular.coe,初始化三角波rom
fprintf(fid,‘memory_initialization_radix=10;\n’);
fprintf(fid,‘memory_initialization_vector=\n’);
for i = 1:1:2^12
fprintf(fid,‘%d’,r(i));
if i==2^12
fprintf(fid,‘;’);
else
fprintf(fid,‘,’);
end
if i%15==0
fprintf(fid,‘\n’);
end
end
fclose(fid);
设计dds的核心就是调用ip rom,vivado调用rom的方法和ise相类似,都是加载.coe文件,我这里特地做笔记,以防忘记。
这是dds的原理图,dds并没有像它的名字一样说的那么玄乎,它的核心便是控制频率的fword字输入,和相位字pword输入,最后调用ip核查找表即可,代码也十分简单,下面给出dds design代码。
module dds(
input mclk,
input rst_n,
input [31:0]fword,//frequency control
input [11:0]pword,//phase control
output [9:0]da_data
);
reg [31:0]r_fword;
reg [11:0]r_pword;
reg [31:0]fcnt;
wire [11:0]addr_rom;
//同步寄存器
always @(posedge mclk)
begin
r_fword 《= fword;
r_pword 《= pword;
end
always @(posedge mclk or negedge rst_n)
begin
if(!rst_n)
fcnt 《= 32‘d0;
else
fcnt 《= fcnt + r_fword;
end
assign addr_rom = fcnt[31:20] + r_pword;
//custom sin_rom
sin_rom sin_rom (
.clka(mclk), // input wire clka
.addra(addr_rom), // input wire [11 : 0] addra
.douta(da_data) // output wire [9 : 0] douta
);
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,选择如下图所示参数。
最后便大功告成,即可得打方波的波形图
大家还可以按照这种方法将其他两种波形都做出来。

威海公司建成基于智能融合终端的能源互联网示范台区
紫光展锐新品发布会:春藤V8910DM全系新品将展示
2022华强电子网评选活动企业提名阶段即将截止
西门子博途S7-1200使用SCL语言实现双重循环
强国之“芯” 伟业之志 ——2023亚洲智能芯片展,梦想助力
一文详解Vivado调用ROM IP core设计DDS
三星s8什么时候上市?三星s8最新消息:三星s8将在5月中旬发布!三星Galaxy S8国行曝光,售价5288?
华灿光电既是大客户又是供应商
高通Q1营收稳居全球第一,英特尔地位受到威胁
学习ifix的七个阶段分享
汽车芯片供应短缺,多家车企实施停产
XboxOne拆解 与PS4哪个做工更好
给正常眼睛做手术,3D技术之原罪
飞思卡尔半导体公司推出新的微机电系统加速计 用于智能电表应用的物理篡改防护
半导体光敏元件基础知识
服务机器人革新家居生活 普及仍需时间
改善汽车中的卫星导航系统的新方法详细剖析
计算机组成原理 考前串讲资料(二)
Level Shifting Digital Signals
京东家电为空调市场注入新活力 让空调行业进化到未来