FPGA设计与应用之基于AD9833芯片的信号发生器设计

改了好几天的程序,不知道说什么,直接上代码吧
/****************************************************/
/****************************************************/
                /*  made by jerry            */
/****************************************************/
/****************************************************/
`timescale 1ns/1ns
module happy(
 clk,
 rst_n,
 sclk,
 din,
 fsy
);
//黄正
 input clk;      //系统输入时钟
 input rst_n;    //复位信号
output reg din;  //ad9833输入数据
 output reg fsy;  //数据输入控制信号
 output reg sclk; //串行通信时钟
/*
 串行通信:采用三线spi(serial串行 peripheral外设 interface接口)形式
 几个重要的串行接口说明
  sclk:串行时钟输入,数据在时钟下降沿输入ad9833
  din:串行数据输入接口,输入数据位数为16bit
  fsync:低有效控制输入active low control input. this is the frame synchronization signal for the input data. when fsync is taken low, the internal logic is informed that a new word is
being loaded into the device.输入的帧同步信号数据,当fsync变低时,会通知内部逻辑一个字节输入完毕。数据只有在fsync为低电平时才可以向芯片输入
 在第16个sclk下降沿之后fsync拉高,
*/ 
 wire trans_done;  //2 byte 数据传输完成标志信号
reg[3:0]cishu;  //字通信次数寄存器,用于控制传输进程
reg[3:0]div_cnt; //分频计数器,用于序列机控制
reg sclk2x;   //2倍sclk的采样时钟
reg [8:0]sclk_gen_cnt;//sclk生成暨序列机计数器
reg en;//转换使能信号
parameter div_param=2;
parameter 
      dac_data0=16'h2100,  //0010_0001_0000_0000  db13=1表示即将两次写入完整频率控制字,同时将寄存器复位
dac_data1=16'h69f1,  //6886   //0110_1001_1111_0001: 低14bit是输入的频率数据,db15:db14=01表示选择频率寄存器feg0
dac_data2=16'h4000,  // 0100_0000_0000_0000 高14bit=0
dac_data3=16'hc000, //1100_0000_0000_0000:选择相位寄存器0,data=0 
dac_data4=16'h0100,  // 0000_0001_0000_0000
dac_data5=16'h2100,  //选择数据一次写入,db13&rest=1
dac_data6=16'h2000,  //设置相位寄存器0作为相位累加器
dac_data7=16'h2000;  //选择正弦波
//数据传输使能控制模块
  always@(posedge clk or negedge rst_n)
if(!rst_n)
en  <=#1 1'b1;
else if(trans_done)
en  <=#1 1'b0;
else
en  <=en;
//完整数据传输完成标志信号
 assign trans_done = (cishu ==4'd8 ) && sclk2x;
//生成2倍sclk使时钟计数器   
always@(posedge clk or negedge rst_n)
if(!rst_n)
div_cnt  <= #1  4'd0;
else if(en)begin
if(div_cnt == (div_param - 1'b1))
div_cnt  <= #1  4'd0;
else 
div_cnt  <= #1  div_cnt + 1'b1;
end else
div_cnt  <= #1  4'd0;
  //生成2倍sclk时钟计数器  结果是使sclk周期为40ns完美
always@(posedge clk or negedge rst_n)
if(!rst_n)
sclk2x  <= #1  1'b0;
else if(en && (div_cnt == (div_param - 1'b1)))
sclk2x  <= #1  1'b1;
else
sclk2x  <= #1  1'b0;
//生成序列计数器
always@(posedge clk or negedge rst_n)
if(!rst_n)
sclk_gen_cnt  <= #1  9'd0;
else if(sclk2x && en)
begin
if(sclk_gen_cnt == 9'd271)
sclk_gen_cnt  <= #1  9'd271;
else
sclk_gen_cnt  <= #1  sclk_gen_cnt + 1'b1;
end
else
sclk_gen_cnt  <= #1  sclk_gen_cnt;
   /*
 *******************依次将数据移出到芯片********************
*/
 always@(posedge clk or negedge rst_n)
 if(!rst_n)
  begin
   din  <=#0  1'b1;
   sclk  <=#1  1'b1;
   fsy <=1'b1;
   cishu<=4'd0;
  end  
  else if((!trans_done)&&sclk2x)
  begin
   case(sclk_gen_cnt)
/******************************************************/  
                     /*传输 dac_data0*/
  /******************************************************/ 
0:
begin
din  <= #1 dac_data0[15];
fsy<=1'b0;
sclk  <= #5  1'b0;
end 
1,3,5,7,9,11,13,15,17,19,21,23,25,27,29:
begin
  sclk  <= #1  1'b1;
end
31:
begin
  sclk  <= #1  1'b1;
   fsy<= 1'b1;
end
2:  begin din  <= #1 dac_data0[14]; sclk  <= #1 1'b0; end
4:  begin din  <= #1 dac_data0[13]; sclk  <= #1 1'b0; end
6:  begin din  <= #1 dac_data0[12]; sclk  <= #1 1'b0; end
8:  begin din  <= #1 dac_data0[11]; sclk  <= #1 1'b0; end
10: begin din  <= #1 dac_data0[10]; sclk  <= #1 1'b0; end
12: begin din  <= #1 dac_data0[9];  sclk  <= #1 1'b0; end
    14: begin din  <= #1 dac_data0[8];  sclk  <= #1 1'b0; end
16: begin din  <= #1 dac_data0[7];  sclk  <= #1 1'b0; end
18: begin din  <= #1 dac_data0[6];  sclk  <= #1 1'b0; end
20: begin din  <= #1 dac_data0[5];  sclk  <= #1 1'b0; end
22: begin din  <= #1 dac_data0[4];  sclk  <= #1 1'b0; end
24: begin din  <= #1 dac_data0[3];  sclk  <= #1 1'b0; end
26: begin din  <= #1 dac_data0[2];  sclk  <= #1 1'b0; end
28: begin din  <= #1 dac_data0[1];  sclk  <= #1 1'b0; end
30: begin din  <= #1 dac_data0[0];  sclk  <= #1 1'b0; end
    32: 
begin 
sclk  <= #1 1'b0; 
end 
    33: 
  begin
  sclk<=1'b1; 
  cishu<=4'd1;
  end   
/********************************************************/  
                     /*传输 dac_data1*/
  /********************************************************/ 
34:
begin
  din  <= #1 dac_data1[15];
  fsy<=1'b0;
  sclk  <= #5  1'b0;
end
   35,37,39,41,43,45,47,49,51,53,55,57,59,61,63:
  begin
sclk  <= #1  1'b1;
end
65:
begin
sclk  <= #1  1'b1;
fsy<=#1 1'b1;
end
   36: begin din  <= #1 dac_data1[14]; sclk  <= #1 1'b0; end
38: begin din  <= #1 dac_data1[13]; sclk  <= #1 1'b0; end
40: begin din  <= #1 dac_data1[12]; sclk  <= #1 1'b0; end
42: begin din  <= #1 dac_data1[11]; sclk  <= #1 1'b0; end
44: begin din  <= #1 dac_data1[10]; sclk  <= #1 1'b0; end
46: begin din  <= #1 dac_data1[9];  sclk  <= #1 1'b0; end
48: begin din  <= #1 dac_data1[8];  sclk  <= #1 1'b0; end
50: begin din  <= #1 dac_data1[7];  sclk  <= #1 1'b0; end
52: begin din  <= #1 dac_data1[6];  sclk  <= #1 1'b0; end
54: begin din  <= #1 dac_data1[5];  sclk  <= #1 1'b0; end
56: begin din  <= #1 dac_data1[4];  sclk  <= #1 1'b0; end
58: begin din  <= #1 dac_data1[3];  sclk  <= #1 1'b0; end
60: begin din  <= #1 dac_data1[2];  sclk  <= #1 1'b0; end
62: begin din  <= #1 dac_data1[1];  sclk  <= #1 1'b0; end
64: begin din  <= #1 dac_data1[0];  sclk  <= #1 1'b0; end
66:
   begin 
   sclk  <= #1 1'b0; 
   //   fsy<=#1 1'b1;
   end
67: 
begin
    sclk<=1'b1;
cishu<=4'd2;
   end 
/***********************************************************/  
                     /*传输 dac_data2*/
  /*******************************************************/ 
  68:
  begin
din  <= #1 dac_data2[15];
fsy<=1'b0;
sclk  <= #5  1'b0;
end
69,71,73,75,77,79,81,83,85,87,89,91,93,95,97:
begin
sclk  <= #1  1'b1;
end
99:
begin
sclk  <= #1  1'b1;
fsy<=#1 1'b1;
end
   70: begin din  <= #1 dac_data2[14]; sclk  <= #1 1'b0; end
72: begin din  <= #1 dac_data2[13]; sclk  <= #1 1'b0; end
74: begin din  <= #1 dac_data2[12]; sclk  <= #1 1'b0; end
76: begin din  <= #1 dac_data2[11]; sclk  <= #1 1'b0; end
78: begin din  <= #1 dac_data2[10]; sclk  <= #1 1'b0; end
80: begin din  <= #1 dac_data2[9];  sclk  <= #1 1'b0; end
82: begin din  <= #1 dac_data2[8];  sclk  <= #1 1'b0; end
84: begin din  <= #1 dac_data2[7];  sclk  <= #1 1'b0; end
86: begin din  <= #1 dac_data2[6];  sclk  <= #1 1'b0; end
88: begin din  <= #1 dac_data2[5];  sclk  <= #1 1'b0; end
90: begin din  <= #1 dac_data2[4];  sclk  <= #1 1'b0; end
92: begin din  <= #1 dac_data2[3];  sclk  <= #1 1'b0; end
94: begin din  <= #1 dac_data2[2];  sclk  <= #1 1'b0; end
96: begin din  <= #1 dac_data2[1];  sclk  <= #1 1'b0; end
98: begin din  <= #1 dac_data2[0];  sclk  <= #1 1'b0; end
100: 
begin 
    sclk  <= #1 1'b0; 
    //   fsy<=#1 1'b1;
   end 
101: 
   begin
    sclk<=1'b1; 
   // fsy<=#2 1'b1;
    cishu<=4'd3;
   end
/************************************************************************/  
                     /*传输 dac_data3 */
  /************************************************************************/ 
  102:
    begin
din  <= #1 dac_data3[15];
fsy<=1'b0;
sclk  <= #5  1'b0;
end
 103,105,107,109,111,113,115,117,119,121,123,125,127,129,131:
   begin
sclk  <= #1  1'b1;
end
 133:
begin
sclk  <= #1  1'b1;
   fsy<=#1 1'b1;
end
   104: begin din  <= #1 dac_data3[14]; sclk  <= #1 1'b0; end
106: begin din  <= #1 dac_data3[13]; sclk  <= #1 1'b0; end
108: begin din  <= #1 dac_data3[12]; sclk  <= #1 1'b0; end
110: begin din  <= #1 dac_data3[11]; sclk  <= #1 1'b0; end
112: begin din  <= #1 dac_data3[10]; sclk  <= #1 1'b0; end
114: begin din  <= #1 dac_data3[9];  sclk  <= #1 1'b0; end
116: begin din  <= #1 dac_data3[8];  sclk  <= #1 1'b0; end
118: begin din  <= #1 dac_data3[7];  sclk  <= #1 1'b0; end
120: begin din  <= #1 dac_data3[6];  sclk  <= #1 1'b0; end
122: begin din  <= #1 dac_data3[5];  sclk  <= #1 1'b0; end
124: begin din  <= #1 dac_data3[4];  sclk  <= #1 1'b0; end
126: begin din  <= #1 dac_data3[3];  sclk  <= #1 1'b0; end
128: begin din  <= #1 dac_data3[2];  sclk  <= #1 1'b0; end
130: begin din  <= #1 dac_data3[1];  sclk  <= #1 1'b0; end
132: begin din  <= #1 dac_data3[0];  sclk  <= #1 1'b0; end
134:
begin 
sclk  <= #1 1'b0; 
   // fsy<=#1 1'b1;
end 
135: 
begin
  sclk<=1'b1; 
  cishu<=4'd4;
    end
/************************************************************************/  
                     /*传输 dac_data4*/
 /************************************************************************/ 
  136:
  begin
din  <= #1 dac_data4[15];
fsy<=1'b0;
sclk  <= #5  1'b0;
end
137,139,141,143,145,147,149,151,153,155,157,159,161,163,165:
  begin
sclk  <= #1  1'b1;
end
167:
begin
sclk  <= #1  1'b1;
   fsy<=#1 1'b1;
end
   138: begin din  <= #1 dac_data4[14]; sclk  <= #1 1'b0; end
140: begin din  <= #1 dac_data4[13]; sclk  <= #1 1'b0; end
142: begin din  <= #1 dac_data4[12]; sclk  <= #1 1'b0; end
144: begin din  <= #1 dac_data4[11]; sclk  <= #1 1'b0; end
146: begin din  <= #1 dac_data4[10]; sclk  <= #1 1'b0; end
148: begin din  <= #1 dac_data4[9];  sclk  <= #1 1'b0; end
150: begin din  <= #1 dac_data4[8];  sclk  <= #1 1'b0; end
152: begin din  <= #1 dac_data4[7];  sclk  <= #1 1'b0; end
154: begin din  <= #1 dac_data4[6];  sclk  <= #1 1'b0; end
156: begin din  <= #1 dac_data4[5];  sclk  <= #1 1'b0; end
158: begin din  <= #1 dac_data4[4];  sclk  <= #1 1'b0; end
160: begin din  <= #1 dac_data4[3];  sclk  <= #1 1'b0; end
162: begin din  <= #1 dac_data4[2];  sclk  <= #1 1'b0; end
164: begin din  <= #1 dac_data4[1];  sclk  <= #1 1'b0; end
166: begin din  <= #1 dac_data4[0];  sclk  <= #1 1'b0; end
168: 
begin 
sclk  <= #1 1'b0;
end 
169:
begin
  sclk<=1'b1; 
// fsy<=#2 1'b1;
  cishu<=4'd5;
    end
/************************************************************************/  
                     /*传输 dac_data5*/
 /************************************************************************/ 
  170:
  begin
din  <= #1 dac_data5[15];
fsy<=1'b0;
sclk  <= #5  1'b0;
end
171,173,175,177,179,181,183,185,187,189,191,193,195,197,199:
begin
sclk  <= #1  1'b1;
end
201:
begin
sclk  <= #1  1'b1;
   fsy<=#1 1'b1;
end
   172: begin din  <= #1 dac_data5[14]; sclk  <= #1 1'b0; end
174: begin din  <= #1 dac_data5[13]; sclk  <= #1 1'b0; end
176: begin din  <= #1 dac_data5[12]; sclk  <= #1 1'b0; end
178: begin din  <= #1 dac_data5[11]; sclk  <= #1 1'b0; end
180: begin din  <= #1 dac_data5[10]; sclk  <= #1 1'b0; end
182: begin din  <= #1 dac_data5[9];  sclk  <= #1 1'b0; end
184: begin din  <= #1 dac_data5[8];  sclk  <= #1 1'b0; end
186: begin din  <= #1 dac_data5[7];  sclk  <= #1 1'b0; end
188: begin din  <= #1 dac_data5[6];  sclk  <= #1 1'b0; end
190: begin din  <= #1 dac_data5[5];  sclk  <= #1 1'b0; end
192: begin din  <= #1 dac_data5[4];  sclk  <= #1 1'b0; end
194: begin din  <= #1 dac_data5[3];  sclk  <= #1 1'b0; end
196: begin din  <= #1 dac_data5[2];  sclk  <= #1 1'b0; end
198: begin din  <= #1 dac_data5[1];  sclk  <= #1 1'b0; end
200: begin din  <= #1 dac_data5[0];  sclk  <= #1 1'b0; end
202: 
begin 
sclk  <= #1 1'b0;
end 
203: 
begin
  sclk<=1'b1; 
// fsy<=#2 1'b1;
  cishu<=4'd6;
    end
/************************************************************************/  
                     /*传输 dac_data6*/
  /************************************************************************/ 
  204:
  begin
din  <= #1 dac_data6[15];
fsy<=1'b0;
sclk  <= #5 1'b0;
end
205,207,209,211,213,215,217,219,221,223,225,227,229,231,233:
begin
sclk  <= #1  1'b1;
end
235:
begin
sclk  <= #1  1'b1;
fsy<=#1 1'b1;
end
   206: begin din  <= #1 dac_data6[14]; sclk  <= #1 1'b0; end
208: begin din  <= #1 dac_data6[13]; sclk  <= #1 1'b0; end
210: begin din  <= #1 dac_data6[12]; sclk  <= #1 1'b0; end
212: begin din  <= #1 dac_data6[11]; sclk  <= #1 1'b0; end
214: begin din  <= #1 dac_data6[10]; sclk  <= #1 1'b0; end
216: begin din  <= #1 dac_data6[9];  sclk  <= #1 1'b0; end
218: begin din  <= #1 dac_data6[8];  sclk  <= #1 1'b0; end
220: begin din  <= #1 dac_data6[7];  sclk  <= #1 1'b0; end
222: begin din  <= #1 dac_data6[6];  sclk  <= #1 1'b0; end
224: begin din  <= #1 dac_data6[5];  sclk  <= #1 1'b0; end
226: begin din  <= #1 dac_data6[4];  sclk  <= #1 1'b0; end
228: begin din  <= #1 dac_data6[3];  sclk  <= #1 1'b0; end
230: begin din  <= #1 dac_data6[2];  sclk  <= #1 1'b0; end
232: begin din  <= #1 dac_data6[1];  sclk  <= #1 1'b0; end
234: begin din  <= #1 dac_data6[0];  sclk  <= #1 1'b0; end
236: 
begin 
   sclk  <= #1 1'b0; 
   //  fsy<=#1 1'b1;
   end 
237: 
begin
   sclk<=1'b1; 
   cishu<=4'd7;
      end
/************************************************************************/  
                     /*传输 dac_data7*/
  /************************************************************************/ 
  238:
  begin
din  <= #1 dac_data7[15];
sclk  <= #5  1'b0;
fsy<=1'b0;
end
239,241,243,245,247,249,251,253,255,257,259,261,263,265,267:
begin
sclk  <= #1  1'b1;
end
269:
begin
sclk  <= #1  1'b1;
fsy<=#1 1'b1;
end
   240: begin din  <= #1 dac_data7[14]; sclk  <= #1 1'b0; end
242: begin din  <= #1 dac_data7[13]; sclk  <= #1 1'b0; end
244: begin din  <= #1 dac_data7[12]; sclk  <= #1 1'b0; end
246: begin din  <= #1 dac_data7[11]; sclk  <= #1 1'b0; end
248: begin din  <= #1 dac_data7[10]; sclk  <= #1 1'b0; end
250: begin din  <= #1 dac_data7[9];  sclk  <= #1 1'b0; end
252: begin din  <= #1 dac_data7[8];  sclk  <= #1 1'b0; end
254: begin din  <= #1 dac_data7[7];  sclk  <= #1 1'b0; end
256: begin din  <= #1 dac_data7[6];  sclk  <= #1 1'b0; end
258: begin din  <= #1 dac_data7[5];  sclk  <= #1 1'b0; end
260: begin din  <= #1 dac_data7[4];  sclk  <= #1 1'b0; end
262: begin din  <= #1 dac_data7[3];  sclk  <= #1 1'b0; end
264: begin din  <= #1 dac_data7[2];  sclk  <= #1 1'b0; end
266: begin din  <= #1 dac_data7[1];  sclk  <= #1 1'b0; end
268: begin din  <= #1 dac_data7[0];  sclk  <= #1 1'b0; end
270: 
   begin 
   sclk  <= #1 1'b0; 
     // fsy<=#1 1'b1;
   end
271:
   begin
   sclk<=1'b1; 
   cishu<=4'd8;
      end 
default:;
endcase 
 end 
endmodule 
testbench仿真输出设计:
示波器验证:

智能电网的未来发展趋势
无方向盘和刹车的真正无人车 GM计划明年推出
语音芯片怎么实现功能?是如何控制语音地址播放的?WT588F
个人最青睐的十款轻薄笔记本盘点 一定有你喜欢的款
智能制造发展的同时要警惕什么风险
FPGA设计与应用之基于AD9833芯片的信号发生器设计
柳传志将卸任联想控股董事长 预计12月18日宣布
小米与蔚来汽车达成合作,在小米手表上掌控汽车新方式
Molex 收购ProTek Medical Ltd
零序电流保护在运行中需注意哪些问题?
工程师必知产品可靠性曲线
魅族Pro7什么时候上市?魅族Pro7最新消息:魅族Pro7联发科X30+6GB+双面屏,即将开启双面屏先河?
三相三线制有源电力滤波器LCL参数研究
新手必备:十大常见照明电路设计齐分享
iPhone12mini:全行业最轻薄的5G手机
卫星集群的反光将影响地面望远镜的天文观测
一款基于Http.sys的利用工具
河南省智能传感器创新联盟成立,为郑州建设提供技术和动力支撑
压力试验机的精度受哪些因素影响?深圳磐石测控
单片机C语言程序设计:TIMER0与TIMER1控制条形LED