赞
踩
Matlab、Modelsim、ISE(也可以使用vivado,这里以ISE为例)
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);
plot
结果如下图:将.coe
文件中,在生成的每一行采样后面(不包括最后一行采样)添加逗号","
,然后在最后一行采样后面添加分号";"
打开生成的.coe
文件,在文件的前两行添加下面两行代码:
memory_initialization_radix=10;
memory_initialization_vector=
.coe
文件最后格式,部分截图:
在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发生器
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。