正弦波发生器的verilog实现(一)
使用工具:
Matlab、Modelsim、ISE(也可以使用vivado,这里以ISE为例)
离散正弦波的产生
- 将连续的正弦波离散化,通过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);
讯享网
- 在matlab中
plot结果如下图:
- 将
.coe文件中,在生成的每一行采样后面(不包括最后一行采样)添加逗号",",然后在最后一行采样后面添加分号";"
- 打开生成的
.coe文件,在文件的前两行添加下面两行代码:
讯享网memory_initialization_radix=10; memory_initialization_vector=
.coe文件最后格式,部分截图:

verilog实现正弦波发生器
- 在ISE中建立正弦波发生器项目;
- 创建RAM IP核,用来存储生成的
.coe文件(在这里完全可以使用ROM来实现):这里选择使用单口RAM


RAM规格选择256*8bit的ram

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

- 创建正弦波发生器的
.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 - 对
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 - 在modelsim中对生成的正弦波发生器进行仿真,仿真图如下:

下一篇将介绍DDS发生器




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/75020.html