当前位置:首页 > > FPGA开源工作室

基于LUTDDS的设计

DDS(Direct Digital Synthesis)直接数字频率合成技术由USA J.Tierncy首先提出。它是一种以数字信号处理理论为基础,从相位概念出发直接合成所需波形的一种新的全数字技术的频率合成方法。DDS主要出现在数字混频系统中。在数字混频中,通过DDS产生正交的本地振荡信号即正、余弦信号与输入信号相乘实现频谱搬移,如通信系统的调制、解调。目前FPGA实现DDS有三种途径:基于IIR滤波器的实现方法、基于查找表LUT的实现方法以及基于CORDIC算法的实现方法。其中采用LUT的方法较为通用且比较容易实现。

1 基于LUTDDS理论

一个典型的基于LUTDDS系统由相位累加器和波形存储器两部分构成,如图1所示。图中相位累加器的位宽为nbit,步进值为μ,LUT的深度N2n,宽度为LbitLUT中依相位顺序存储一个周期的波形数据。

1 基于LUTDDS架构

2 matlab 仿真

2 相位累加器位宽为4bitLUT地址与存储数据的对应关系

如图2所示,我们要制作地址位宽为10bit数据位宽为32bitLUT查找表。Matlab源码如下:

clear all

close all

clc

FS = 44100;%采样率

fc = 1000;

N  = 1024;%1024点一个正玄周期

t =0:2*pi/(N-1):2*pi;

sin_dds = sin(t);

figure,

hold on

plot(t,sin_dds,'*');

legend('sin');

grid;

hold off


3 matlab 10241个周期的正玄波

3 FPGA仿真

整个仿真结构如图1所示,由相位累加控制器和sin波形存储器组成。仿真生成采样率为44.1KHZ @1KHZ正玄波和余弦波(相位相差90)

tb_dds源码:

1. `timescale 1ns / 1ps

2. `define NULL 0

3. module tb_dds();

4.

5. parameter KHZ1 =44;

6. parameter KHZ2 =22;

7. parameter KHZ4 =11;

8. reg clk;

9. initial begin

10. clk = 0;

11. #313333 clk = 0;

12. forever #11.072 clk = ~clk;

13. end//45.1584MHZ

14.

15. reg reset_n;

16. initial begin

17. reset_n = 1;

18. #10000 reset_n = 0;

19. #100000 reset_n = 1;

20. end

21.

22. reg [9:0] addr;

23. reg [9:0] cnt;

24. reg [31:0] k;

25. integer fb;

26.

27. wire signed [31:0]     sin;

28. wire signed [31:0]     cos;

29.

30. //Phase accumulation controller

31. always @(posedge clk or negedge reset_n) begin

32. if(!reset_n) begin

33. addr <= 0;

34. cnt  <= 0;

35. end

36. else if(cnt == KHZ1-1) begin

37. cnt <= 0;

38. addr <= addr +10'd1;

39. end

40. else begin

41. cnt <= cnt + 1;

42. addr <= addr;

43. end

44. end

45.

46. //reg [8:0] i;//88.2khz

47. reg [9:0] i;//44.1khz Sample rate

48. reg signed [31:0] sin_slow;

49. reg signed [31:0] cos_slow;

50.

51. always @(posedge clk or negedge reset_n) begin

52. if(!reset_n) begin

53. i <= 0;

54. sin_slow <= 0;

55. cos_slow <= 0;

56. k <=0;

57. fb = $fopen("sin.dat","w");

58. if(fb == `NULL) begin

59. $display("Can not open sin.dat");

60. $finish;

61. end

62. end

63. else begin

64. i <= i+1;

65. if(i == 0) begin

66. sin_slow <= sin;

67. cos_slow <= cos;

68. k <= k +1;

69. $display("time=[%d],%d",$realtime,sin);

70. $fwrite(fb,"%d\n",sin);

71. if(k == 4096) begin

72. $fclose(fb);

73. $stop;

74. end

75. end

76. end

77. end

78.

79.

80.

81. dds_rom U_dds_rom(

82. .clk(clk),

83. .addr(addr),//0-1023 1T

84. .sin(sin),

85. .cos(cos)

86. );

87. endmodule



仿真结果:

生成Sample rate 44.1KHZ@1KHZ的正玄和余弦波相位相差90°。

4 modelsim 仿真结果

Matlab FFT分析:

5 FFT分析结果

由图5可知产生的正玄波频率为1KHZ。基于LUTDDS设计完成,此节将是后期基于FPGA数字信号处理的基础和关键。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭