欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于TLC5615芯片的DDS波形发生器(FPGA)

程序员文章站 2024-02-23 23:17:38
...

基于TLC5615芯片的DDS波形发生器(FPGA)

1. 前言
         前面在我的博客中已经写过关于TLC5615的FPGA程序驱动以及DDS的原理和代码实现,这里便不多做介绍,这一次主要是把这两部分合并起来利用DA芯片实现正弦波输出,并且用示波器观察信号的频率。

2. 模块示意图
基于TLC5615芯片的DDS波形发生器(FPGA)
         TLC5615是一款SPI接口的10位高精度DA转换芯片,因此将DDS模块整个封装成SPI接口。ROM根据FPGA提供的地址,将查找表中的数据输出到CTRL,由DIN输入到DA芯片TLC5615中。在Quartus中生成的RTL视图如下所示。
基于TLC5615芯片的DDS波形发生器(FPGA)
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文件里的第一和第二行后面要加“;” 分号。
         在这里我采用的是用波形数据生成器,如下图所示。
基于TLC5615芯片的DDS波形发生器(FPGA)
         生成的数据部分如下所示。
基于TLC5615芯片的DDS波形发生器(FPGA)
5.验证总结
         连接好TLC5615模块各个引脚,将程序全编译后把sof文件下载到开发板上,然后将输出信号接入示波器观察,得到下图。
基于TLC5615芯片的DDS波形发生器(FPGA)
         前面我设置的频率控制字为85910,系统时钟为50M,根据计算得到输出信号频率f=85910*50_000_000/2^32=1000Hz=1KHz,我们可以看到示波器测量显示的频率为1KHz,由此证明实验验证成功。

相关标签: 嵌入式 fpga