1.利用matlib產生.coe文件,
clear ;
close all;
width=12; %寬度
depth=4096; %深度是1024
n=0:depth-1;
yn=sin(2*pi/4096*n);
yn=round((yn+1)*2047);
plot(n,yn);
%===============================開始寫coe文件===============================
addr=0:depth-1;
str_width=strcat('WIDTH=',num2str(width));
str_depth=strcat('DEPTH=',num2str(depth));
fid=fopen('./sin_code.coe','wt'); %打開或者新建coe,存放位置和文件名任意
%********************************************************************************/
fprintf(fid,'MEMORY_INITIALIZATION_RADIX=16;\n\n');
fprintf(fid,'MEMORY_INITIALIZATION_VECTOR=\n');
fprintf(fid,'%X,\n',yn) %開始寫數據了
fclose(fid);
注意開頭兩個語句,必須符合要求,數據最後一行逗號要改爲分號。
主程序:
module my_dds(
input clk,
input rst_n,
input start,
output [11:0]data_out,
output [11:0]phase
);
/******************************/
//wire [11:0]rom_phase;
blk_mem_gen_0 myrom (
.clka(clk), // input wire clka
.addra(phase), // input wire [11 : 0] addra
.douta(data_out) // output wire [11 : 0] douta
);
/*******************************/
reg [11:0]cnt=12'd0;
always@(posedge clk or negedge rst_n)
begin
if(rst_n==1'b0)
cnt<=12'd0;
else if(start)
cnt<=cnt+1'b1;
else
cnt<=cnt;
end
assign phase=cnt;
endmodule
測試程序
`timescale 1 ns/1 ns
module my_dds_sim();
reg clk;
reg rst_n;
reg start=1;
wire [11:0]data_out;
wire [11:0]phase;
/*******************************/
my_dds U1(.clk(clk),.rst_n(rst_n),.start(start),.data_out(data_out),.phase(phase));
initial
begin
rst_n=1'b0;
#5;
rst_n=1'b1;
end
initial
begin
clk=0;
forever #5 clk=~clk;
end
endmodule
仿真結果
參考博客:https://blog.csdn.net/qq_38492080/article/details/78558976?depth_1-