基于TLC5615芯片的DDS波形发生器(FPGA)
基于TLC5615芯片的DDS波形发生器(FPGA)
1. 前言
前面在我的博客中已经写过关于TLC5615的FPGA程序驱动以及DDS的原理和代码实现,这里便不多做介绍,这一次主要是把这两部分合并起来利用DA芯片实现正弦波输出,并且用示波器观察信号的频率。
2. 模块示意图
TLC5615是一款SPI接口的10位高精度DA转换芯片,因此将DDS模块整个封装成SPI接口。ROM根据FPGA提供的地址,将查找表中的数据输出到CTRL,由DIN输入到DA芯片TLC5615中。在Quartus中生成的RTL视图如下所示。
3. 代码部分
前面的博客中已经由DDS模块和TLC5615驱动模块的代码,这里就不在贴上,有需要的朋友可以查看我前面的博客中的代码。这里只给出例化这两个模块的顶层文件代码,如下。
module DDS_TLC5615(
input sys_clk,
input rst,
output cs,
output tlc5615_clk,
output tlc5615_data
);
wire [9:0] DA;
TLC5615_CTRL TLC5615_CTRL(
.sys_clk(sys_clk),
.rst(rst),
.conv_en(1'b1),
.conv_data({DA,2'b00}),
.cs(cs),
.conv_end(),
.tlc5615_clk(tlc5615_clk),
.tlc5615_data(tlc5615_data)
);
DDS u_DDS(
.clk (sys_clk),
.rst_n(rst),
.fword(85910),
.pword(256),
.DA (DA)
);
endmodule
4. ROM初始化mif文件生成
mif文件的生成有多种方式,可以用matlab方法生成,也可以用人家做好的波形数据生成器一键自动生成,只是没有matlab方式可以有多种设置和选择,包括添加直流分量等等。matlab代码如下所示。
depth =1024;%采样深度,即采样个数
widths =10 ;%采样数据位宽
N=0:depth-1 ;%采样时刻
s= sin(2*pi*N/1024);%信号生成
fidc = fopen('D:\Quartus\sinx.mif','wt') %创建mif文件
%写入mif文件的开头
fprintf(fidc,'depth=%d\n',depth);
fprintf(fidc,'width=%d\n',widths);
fprintf(fidc,'address_radix=UNS;\n');%地址格式,UNS表示保持现有格式
fprintf(fidc,'data_radix=UNS;\n');%数据格式
fprintf(fidc,'content begin\n');
%采样数据的输出
for(x =1:depth)
fprintf(fidc,'%d:%d;\n',x-1,round(31*sin(2*pi*(x-1)/32)+32));
end;%round(A)将A中的元素按最近的整数取整,即四舍五入;
fprintf(fidc,'end;');
fclose(fidc);
L=31*sin(2*pi*(N-1)/32)+32;
plot(L);
数据深度为1024,位宽为10位(跟DA芯片保持一致);如果要修改,只需要根据需求修改前面四行代码即可。注意:应用于ROM时,sinx.mif文件里的第一和第二行后面要加“;” 分号。
在这里我采用的是用波形数据生成器,如下图所示。
生成的数据部分如下所示。
5.验证总结
连接好TLC5615模块各个引脚,将程序全编译后把sof文件下载到开发板上,然后将输出信号接入示波器观察,得到下图。
前面我设置的频率控制字为85910,系统时钟为50M,根据计算得到输出信号频率f=85910*50_000_000/2^32=1000Hz=1KHz,我们可以看到示波器测量显示的频率为1KHz,由此证明实验验证成功。