// 该代码仅供网友学习参考,不得用于商业用途!如有问题,请联系pxj4283@163.com
//本来使用DDS(数字信号发生器)核,可是发现很麻烦,所以自己做了一个!也不是很麻烦!
/*我公布的DDS只有调频的功能,频率控制字是32位!我使用50M的16BIT DA输出任意波形都很好,频率可以达到10M,调幅调相功能暂不公开!*/
`timescale 1ns/1ps
module mydds(
DATA, //频率控制字
WE_F, //频率控制字写使能
CLKP, //时钟
CE, //DDS使能
ACLR, //复位
SINE, //正炫信号输出
COSINE //余炫信号输出
);
input [31 : 0] DATA;
input WE_F;
input CLKP;
input CE;
input ACLR;
output [15 : 0] SINE;
output [15 : 0] COSINE;
parameter DATA_DEF=32'H51EB851;
//ADD_A
reg [31:0] ADD_A;
reg [31:0] ADD_B;
wire [31:0] DATA;
always @(posedge CLKP or posedge ACLR)
if(ACLR)
ADD_A<=DATA_DEF;
else if(WE_F)
ADD_A<=DATA;
//ADD_B
always @(posedge CLKP or posedge ACLR) //OLD CLKN
if(ACLR)
ADD_B<=0;
else if(CE)
ADD_B<=ADD_B+ADD_A;
//COS
wire [10:0] ROM_A;
assign ROM_A=ADD_B[31:21];
wire [15:0] COS_D;
rom_cos cos( //余炫信号ROM
.addr(ROM_A),
.clk(CLKP),
.dout(COS_D),
.en(CE)) ;
reg [15:0] COS_DR;
always @(posedge CLKP or posedge ACLR) //OLD CLKN
if(ACLR)
COS_DR<=0;
else if(CE)
COS_DR<=COS_D;
assign COSINE=COS_DR;
//SINE
wire [15:0] SIN_D;
rom_sin sin( //正炫信号ROM
.addr(ROM_A),
.clk(CLKP),
.dout(SIN_D),
.en(CE)) ;
reg [15:0] SIN_DR ;
always @(posedge CLKP or posedge ACLR) ////OLD CLKN
if(ACLR)
SIN_DR<=0;
else if(CE)
SIN_DR<=SIN_D;
assign SINE=SIN_DR;
endmodule