基于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,由此证明实验验证成功。

猜你喜欢

转载自blog.csdn.net/explode_boom/article/details/109749231