FPGA31 DDS

DDS

1 用ROM生成普通的正弦波

在这里插入图片描述
—>用ROM生成三角波

2 频率控制字和相位控制字

在这里插入图片描述

3 数位的确认

在这里插入图片描述

4 频率控制的实现

在这里插入图片描述

代码

1 获取mif文件

在这里插入图片描述

2 DDS

module DDS_Module(
	Clk,
	Rst_n,
	EN,
	Fword,
	Pword,
	DA_Clk,
	DA_Data
);

	input Clk;/*系统时钟*/
	input Rst_n;/*系统复位*/
	input EN;/*DDS模块使能*/
	input [31:0]Fword;/*频率控制字*/
	input [10:0]Pword;/*相位控制字*/
	
	output DA_Clk;    /*DA数据输出时钟*/
	output [9:0]DA_Data;/*D输出输出A*/
	
	reg [31:0]Fre_acc;	
	reg [10:0]Rom_Addr;

/*---------------相位累加器------------------*/	
	always @(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		Fre_acc <= 32'd0;
	else if(!EN)
		Fre_acc <= 32'd0;	
	else 
		Fre_acc <= Fre_acc + Fword;

/*----------生成查找表地址---------------------*/		
	always @(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		Rom_Addr <= 11'd0;
	else if(!EN)
		Rom_Addr <= 11'd0;
	else
		Rom_Addr <= Fre_acc[31:21] + Pword;	

/*----------例化查找表ROM-------*/		
	ddsrom ddsrom(
		.address(Rom_Addr),
		.clock(Clk),
		.q(DA_Data)
	);

/*----------输出DA时钟----------*/	
	assign DA_Clk = (EN)?Clk:1'b1;

endmodule

3 rom

module ddsrom (
	address,
	clock,
	q);

	input	[10:0]  address;
	input	  clock;
	output	[9:0]  q;

4 testbench

`timescale 1ns/1ns
`define clk_period 20
module DDS_Module_tb;


	reg Clk;/*系统时钟*/
	reg Rst_n;/*系统复位*/
	reg EN;/*DDS模块使能*/
	reg [31:0]Fword;/*频率控制字*/
	reg [10:0]Pword;/*相位控制字*/
	
	wire DA_Clk;/*DA数据输出时钟*/
    wire[9:0]DA_Data;/*D输出输出A*/

    DDS_Module f1(
	.Clk(Clk),
	.Rst_n(Rst_n),
	.EN(EN),
	.Fword(Fword),
	.Pword(Pword),
	.DA_Clk(DA_Clk),
	.DA_Data(DA_Data)
);


initial Clk = 0;
always #10 Clk = ~Clk;
initial begin
 Rst_n = 1'b0;
 EN = 1'b0;
 Fword = 32'd0;
 Pword = 11'd0;

 #(`clk_period*20)
 Rst_n = 1'b1;
 #(`clk_period*20)
 EN = 1'b1;
 Pword = 11'd20;
 Fword = 32'h400000; 
 /*上面测试了当频率控制字为32'h400000 32'h200000  32'h100000的正弦波输出*/
 #(`clk_period*2000000)
 $stop;
end
endmodule

猜你喜欢

转载自blog.csdn.net/helloworld573/article/details/105785038
dds