当前位置:   article > 正文

【FPGA/verilog -入门学习10】verilog 查表法实现正弦波形发生器

【FPGA/verilog -入门学习10】verilog 查表法实现正弦波形发生器

0,需求

查找表设计实现一个正弦波形发生器

寻址的位宽是10位,数据量是1024个,输出的数据是16位

1,需求分析

数据量是1024个:

x = linspace(0,2*pi,1024)

输出数据是16位:

y范围:0~2^16 -1 = 0~65535

y =( sin(x)+1)*65535/2

寻址的位宽是10位

输入是0~1023 1023 占用10位

操作步骤

1,使用matlab 生成数据,制作sin_rom.coe文件

  1. x = linspace(0,2*pi,1024);
  2. y =floor( (sin(x)+1)*(65535/2));
  3. plot(x,y);
  4. format long g
  5. filesize = size(y,2);
  6. fileID = fopen('sin_rom.txt','w');
  7. for i= 1:filesize
  8. fprintf(fileID,'%d\n',y(i));
  9. end

2,打开vivado,制作ROM原语

这里要注意一下,只要在IP中勾选了Primitives Output Register,那么就意味着你会延时两个时钟周期输出数据,在Summary中也可查看

3,生成原语例化文件,供程序调用

vlg_design

  1. /
  2. /*
  3. 用查找表设计实现一个正弦波形发生器
  4. 寻址的位宽是10位,数据量是1024个,输出的数据是16
  5. y = linspace(0,65535,1024)
  6. */
  7. /
  8. `timescale 1ns/1ps
  9. module vlg_design(
  10. input i_clk,
  11. input i_rst_n,
  12. input i_en,
  13. input[9:0] i_data,
  14. output o_vld, //有效信号
  15. output[15:0] o_data
  16. );
  17. //
  18. //o_vld是i_en两个时钟周期的延时
  19. reg[1:0] r_vld;
  20. always@(posedge i_clk)
  21. if(!i_rst_n) r_vld <= 'b00;
  22. else r_vld <= {r_vld[0],i_en};
  23. assign o_vld = r_vld[1];
  24. //IP ROM_LUT
  25. blk_mem_gen_0 your_instance_name (
  26. .clka(i_clk), // input wire clka
  27. .addra(i_data), // input wire [9 : 0] addra
  28. .douta(o_data) // output wire [15 : 0] douta
  29. );
  30. endmodule

testbench_top

  1. `timescale 1ns/1ps
  2. module testbench_top();
  3. //参数定义
  4. `define CLK_PERIORD 20
  5. //接口申明
  6. reg i_clk;
  7. reg i_rst_n;
  8. reg i_en;
  9. reg[9:0] i_data;
  10. wire o_vld; //有效信号
  11. wire[15:0] o_data;
  12. vlg_design vlg_design_inst (
  13. .i_clk(i_clk),
  14. .i_rst_n(i_rst_n),
  15. .i_en(i_en),
  16. .i_data(i_data),
  17. .o_vld(o_vld),
  18. .o_data(o_data)
  19. );
  20. integer i;
  21. initial begin
  22. i_en <= 0;
  23. i_clk <= 0;
  24. i_rst_n <= 0;
  25. i_data <= 0;
  26. #2000;
  27. i_rst_n <= 1;
  28. end
  29. always #(`CLK_PERIORD/2) i_clk = ~i_clk;
  30. //产生激励
  31. initial begin
  32. @(posedge i_clk);
  33. @(posedge i_rst_n);
  34. i_en <= 1;
  35. @(posedge i_clk);
  36. for (i = 1;i <= 1024;i = i+1) begin
  37. i_data <= i;
  38. @(posedge i_clk);
  39. end
  40. @(posedge i_clk);
  41. i_en <= 0;
  42. #50_000;
  43. $stop;
  44. end
  45. //实时显示
  46. always@(posedge i_clk) begin
  47. if(o_vld) $display("%d",o_data);
  48. else ;
  49. end
  50. endmodule

4,仿真验证输出

5,仿真波形展开,模拟输出正弦波效果

右击属性

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/441026
推荐阅读
相关标签
  

闽ICP备14008679号