0


【FPGA】 十二、Vivado DDS IP核实现扫频信号

文章目录


前言

  1. 在我前面的工程中,都是一些比较通用的设计工程,没有用到哪一家的IP核,所以代码具有很好的移植性;今天我就来讲一下基于Xilinx厂家的芯片做一期DDS的设计与验证,这里我所采用的EDA工具是Vivado 2018.3,里面集成了DDSIP核,我们直接进行调用即可。
  2. Xilinx公司是FPGA的主要生产商,即使在现在的FPGA领域它都有着很大的话语权,目前市面上的FPGA芯片主要有XilinxAltera两家,其中Xilinx占据主导地位,其产品在各个方面的应用更是炉火纯青。我们都知道FPGA的优点是基于它的可编程性,使得其开发周期短,但为了提升FPGA开发的周期性,各家都提供了一些通用功能的IP核,包括固化在芯片内的硬IP核和可编程调用的软IP核,并在开发工具中提供了IP和的实例化和调用功能,下面我就在Vivado中调用DDS IP核来进行设计。

一、DDS IP核概述

  1. 上图是DDS IP核的方案图,从图中我们可以看到DDS IP核主要由5部分组成,其中DDS IP核的核心是相位累加器和LUT查找表,它们可以独立使用,也可与一个可选的相位发生器一起使用。相位累加器实现查找表地址的产生,LUT查找表用来存储输出波形。还有泰勒级数矫正模块和抖动产生器,用来改善SFDR。最两边是AXI4接口,是基于AXI4总线协议的接口模块,用来实现相位累加字配置,多通道配置以及相位累加器输出和sin/cos波形输出。

二、DDS IP核配置

1、首先创建一个工程文件,然后点击IP Catalog,直接在搜索框中搜索DDS,创建DDS IP核。

2、 然后双击DDS Compiler,进行DDS IP核的配置界面。

  1. DDS IP核可以配置成三种模式,分别是相位累加器和SIN/COS LUT模式、仅相位产生器模式、仅SIN/COS LUT模式;这里我们选择第一种相位累加器和SIN/COS LUT模式。
  2. 输入时钟:根据系统时钟定,我这里选择100MHz
  3. 通道数:我这里选择单通道
  4. 参数选择有系统参数(System Parameter)和硬件参数(Hardware Parameter)两种,当选择系统参数时,需要根据频率位宽来计算SFDRFR(频率控制字);当选择硬件参数时,直接定义输出的相位宽度和频率宽度即可,我这里选择硬件参数,相位位宽是32位,频率位宽是8位。
  1. 根据Xilinx官方手册,phase width(相位位宽),Frequency Resolution(频率分辨率),channels(通道数),output width(输出波形位宽),SFDR之间的对于关系为:

  1. 关于output width的位宽不同,输出的数据格式如下:

3、进入第二页配置界面,配置频率控制字、相位控制字和输出波形。

  1. 由于在本次实验中需要连续输出不同的频率信号,达到一个扫频的目的,所以这里将频率可控制字和相位控制字都设置为可编程模式,输出的波形为正余弦波形。如果你想输出固定频率的波形,就可以选择锁定模式。这个根据实验要求进行更改即可。

4、第三页和第四页本次实验没有要求,保持默认即可。在第四页,由于频率控制字是可编程的,在代码中会进行改变,这里就不用做任何处理。

5、第5页就是配置的总览界面了,在这里你可以看到你所配置的信息,方便查看配置是否有问题。

6、最后点击OK就生成DDS IP核了,然后就将DDS IP核例化到我们所设计的工程当中,就可以直接使用了。


三、调用DDS IP核

  1. 调用DDS IP核实现扫频信号,我这里设计的扫频范围是1KHz--10KHz,通过控制频率控制字来更改输出的波形的频率,让其在1KHz10KHz直接变化,又让其从10KHz变化到1KHz,展现在频域中是三角波的形式。

1、顶层模块

  1. `timescale 1ns / 1ps
  2. //
  3. //
  4. // Create Date: 2023/03/16 09:54:38
  5. // Design Name: 卡夫卡与海
  6. // Module Name: DDS_top
  7. // Project Name: DDS顶层模块
  8. //
  9. //
  10. //
  11. module DDS_top(
  12. input sys_clk ,//系统时钟 100MHz
  13. input sys_rst_n ,//系统复位
  14. output m_data_tvalid ,//数据有效标志
  15. output [7:0] m_data_sin ,//sin波形
  16. output [7:0] m_data_cos //cos波形
  17. );
  18. //中间信号定义
  19. wire s_phase_tvalid ;//相位有效标志
  20. wire [31:0] s_phase_tdata ;//相位控制字
  21. wire s_config_tvalid ;//频率有效标志
  22. wire [31:0] s_config_tdata ;//频率控制字
  23. wire m_phase_tvalid ;//输出相位有效标志
  24. wire [31:0] m_phase_tdata ;//输出相位
  25. wire [15:0] m_data_tdata ;//输出为16位,高8位是sin波形,低8位是cos波形
  26. //assign m_data_sin = m_data_tdata[15:8];
  27. //assign m_data_cos = m_data_tdata[7:0];
  28. assign m_data_sin = {~m_data_tdata[15],m_data_tdata[14:8]};//将输出转为有符号数据输出 sin
  29. assign m_data_cos = {~m_data_tdata[7],m_data_tdata[6:0]} ;//将输出转为有符号数据输出 cos
  30. //模块例化
  31. //DDS_IP模块
  32. dds_compiler_0 u_dds_0 (
  33. .aclk (sys_clk ),// input wire aclk
  34. .s_axis_phase_tvalid (s_phase_tvalid ),// input wire s_axis_phase_tvalid
  35. .s_axis_phase_tdata (s_phase_tdata ),// input wire [31 : 0] s_axis_phase_tdata
  36. .s_axis_config_tvalid (s_config_tvalid),// input wire s_axis_config_tvalid
  37. .s_axis_config_tdata (s_config_tdata ),// input wire [31 : 0] s_axis_config_tdata
  38. .m_axis_data_tvalid (m_data_tvalid ),// output wire m_axis_data_tvalid
  39. .m_axis_data_tdata (m_data_tdata ),// output wire [15 : 0] m_axis_data_tdata
  40. .m_axis_phase_tvalid (m_phase_tvalid ),// output wire m_axis_phase_tvalid
  41. .m_axis_phase_tdata (m_phase_tdata ) // output wire [31 : 0] m_axis_phase_tdata
  42. );
  43. //控制模块
  44. dds_control u_dds_control(
  45. .clk (sys_clk ),//时钟
  46. .rst_n (sys_rst_n ),//复位
  47. .phase_valid (s_phase_tvalid ),//相位有效标志
  48. .phase_data (s_phase_tdata ),//相位控制字
  49. .config_valid (s_config_tvalid),//频率有效标志
  50. .config_data (s_config_tdata ) //频率控制字
  51. );
  52. endmodule

2、DDS IP核控制模块:控制频率控制字的变化

  1. `timescale 1ns / 1ps
  2. //
  3. //
  4. // Create Date: 2023/03/16 10:26:29
  5. // Design Name: 卡夫卡与海
  6. // Module Name: dds_control
  7. // Project Name: DDS控制模块
  8. //
  9. //
  10. //
  11. module dds_control(
  12. input clk ,//时钟
  13. input rst_n ,//复位
  14. output phase_valid ,//相位有效标志
  15. output [31:0] phase_data ,//相位控制字
  16. output config_valid ,//频率有效标志
  17. output [31:0] config_data //频率控制字
  18. );
  19. //参数定义
  20. parameter F_word_1KHz = 32'hA7C5 ;//1KHz频率控制字 M = 1_000*2^32/100_000_000
  21. parameter F_word_10KHz = 32'h68DB8 ;//10KHz频率控制字 M = 10_000*2^32/100_000_000
  22. parameter F_word_change = 32'h1 ;//1KHz-10KHz变化精度
  23. //信号定义
  24. reg [31:0] config_data_reg ;//频率控制字寄存器
  25. reg max_flag ;//当频率控制字最大时,拉高
  26. //max_flag
  27. always @(posedge clk or negedge rst_n)begin
  28. if(!rst_n)begin
  29. max_flag <= 1'b0;
  30. end
  31. else if(config_data_reg >= F_word_10KHz)begin
  32. max_flag <= 1'b1;
  33. end
  34. else if(config_data_reg == F_word_1KHz)begin
  35. max_flag <= 1'b0;
  36. end
  37. end
  38. //控制频率控制字均匀变化
  39. always @(posedge clk or negedge rst_n)begin
  40. if(!rst_n)begin
  41. config_data_reg <= F_word_1KHz;
  42. end
  43. else if(max_flag == 1'b1)begin
  44. config_data_reg <= config_data_reg - F_word_change;
  45. end
  46. else begin
  47. config_data_reg <= config_data_reg + F_word_change;
  48. end
  49. end
  50. //输出
  51. assign phase_valid = 1'b1;
  52. assign phase_data = 32'h0;//设置相位控制字为0
  53. assign config_valid = 1'b1;
  54. assign config_data = config_data_reg;
  55. endmodule

3、仿真模块

  1. `timescale 1ns / 1ps
  2. //
  3. //
  4. // Create Date: 2023/03/16 14:04:09
  5. // Design Name: 卡夫卡与海
  6. // Module Name: DDS_top_tb
  7. //
  8. //
  9. //
  10. module DDS_top_tb();
  11. reg sys_clk ;
  12. reg sys_rst_n ;
  13. wire m_data_tvalid ;
  14. wire [7:0] m_data_sin ;
  15. wire [7:0] m_data_cos ;
  16. //模块例化
  17. DDS_top u_DDS_top(
  18. .sys_clk (sys_clk ),//系统时钟 100MHz
  19. .sys_rst_n (sys_rst_n ),//系统复位
  20. .m_data_tvalid (m_data_tvalid),//数据有效标志
  21. .m_data_sin (m_data_sin ),//sin波形
  22. .m_data_cos (m_data_cos ) //cos波形
  23. );
  24. //产生激励
  25. initial begin
  26. sys_clk = 1'b0;
  27. sys_rst_n = 1'b0;
  28. #20;
  29. sys_rst_n = 1'b1;
  30. #20000000;
  31. $stop;
  32. end
  33. always #5 sys_clk = ~sys_clk;
  34. endmodule

4、仿真波形如下:

  1. 通过仿真波形,可以看到生成了一个连续变化的正弦波和余弦波,并且波形由慢到快再由快到慢,成周期性变化,满足设计要求。

总结

  1. DDS IP核的配置还是比较简单的,在使用封装好的IP核时,不论是Xilinx的还是Altera的,看官方手册还是很重要的,只不过是纯英文的,但是可以提升我们的英文阅读能力嘛!当你阅读了很多IP核的手册过后,你就会发现那些手册的排版基本上都是差不多的,这样阅读起来也就没那么费劲了。

本文转载自: https://blog.csdn.net/weixin_62912626/article/details/129619307
版权归原作者 卡夫卡与海 所有, 如有侵权,请联系我们删除。

“【FPGA】 十二、Vivado DDS IP核实现扫频信号”的评论:

还没有评论