vivado 產生sin信號

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-

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章