当前位置:   article > 正文

正弦波发生器的verilog实现(一)_verilog正弦波的产生

verilog正弦波的产生

正弦波发生器的verilog实现(一)

使用工具:

Matlab、Modelsim、ISE(也可以使用vivado,这里以ISE为例)

离散正弦波的产生

  1. 将连续的正弦波离散化,通过matlab实现。在这里,产生256个采样点。
clc;
clear all;

s_p = 0:255; %正弦波一个周期的采样点
N = 2^8;
sin_data = sin(2*pi*s_p/N);

%定点化
fix_p_sin_data = fix(sin_data*127);
for i=1:N
    if fix_p_sin_data(i) < 0
        fix_p_sin_data(i) = N + fix_p_sin_data(i);
    else 
        fix_p_sin_data(i) = fix_p_sin_data(i);
    end
end
fid = fopen('/home/sp_ram_256X8.coe','wt');
fprintf(fid, "%8.0f\n", fix_p_sin_data);
fclose(fid);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  1. 在matlab中plot结果如下图:

matlab中plot的结果

  1. .coe文件中,在生成的每一行采样后面(不包括最后一行采样)添加逗号",",然后在最后一行采样后面添加分号";"

  2. 打开生成的.coe文件,在文件的前两行添加下面两行代码:

memory_initialization_radix=10;
memory_initialization_vector=
  • 1
  • 2
  1. .coe文件最后格式,部分截图:

    在这里插入图片描述

在这里插入图片描述

verilog实现正弦波发生器

  1. 在ISE中建立正弦波发生器项目;

  2. 创建RAM IP核,用来存储生成的.coe文件(在这里完全可以使用ROM来实现):

    这里选择使用单口RAM

在这里插入图片描述

RAM规格选择256*8bit的ram

在这里插入图片描述

在Memory Initialization中选择前面生成的.coe文件

在这里插入图片描述

  1. 创建正弦波发生器的.v文件“

    module ex_dds(
    	input	wire 			clk,
    	input 	wire			rst_n,
    	output	wire	[7:0]	o_wave
    );
    
    reg	[7:0]	addr;
    always @(posedge clk)begin
    	if(!rst_n)
    		addr <= 8'd0;
    	else 
    		addr <= addr + 1'b1;
    end
    
    sp_ram_256x8 sp_ram_256x8_inst (
      .clka(clk), // input clka
      .wea(1'b0), // input [0 : 0] wea
      .addra(addr), // input [7 : 0] addra
      .dina(8'd0), // input [7 : 0] dina
      .douta(o_wave) // output [7 : 0] douta
    );
    
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  2. ex_dds()模块进行例化

    `timescale 1ns/1ns
    module tb_ex_dds();
    
    reg clk;
    reg rst_n;
    wire [7:0]	o_wave;
    
    initial begin
    	clk = 0;
    	rst_n = 0;
    	#100
    	rst_n = 1;
    
    end
    
    always #10 clk = ~clk;
    
    ex_dds ex_dds_inst (
    	.clk(clk), 
    	.rst_n(rst_n), 
    	.o_wave(o_wave)
    );
        
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  3. 在modelsim中对生成的正弦波发生器进行仿真,仿真图如下:

    在这里插入图片描述


    下一篇将介绍DDS发生器

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

闽ICP备14008679号