首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[转帖]DDS的VERILOG原代码(经验证)

[转帖]DDS的VERILOG原代码(经验证)


// 该代码仅供网友学习参考,不得用于商业用途!如有问题,请联系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  




http://www.epcb.net/dispbbs.asp?boardID=144&ID=578&page=2

我不是高手
希望能对大家有用处
我不是高手
返回列表