ad8582

DIP封装:

 

内部结构:

 

引脚描述:

Vout1,Vout2:数模转换输出管脚,固定的电压输出范围是0V~4.095V1mV/LSB.

AGND:模拟地

DGND:数字地

LDADAC A寄存器装载选通端,把输入寄存器中的数据转移到DAC 寄存器中,输入低电平有效,电平敏感锁存。

LDBDAC B 寄存器装载选通端,把输入寄存器中的数据转移到DAC 寄存器中,输入低电平有效,电平敏感锁存。脉冲宽度为30ns.

MSB:数字电平输入,为1时把DAC寄存器预设为1/2满刻度(800H),为0时把DAC寄存器清零。依赖RST断言。

RST:复位端,低电平有效,复位脉冲宽度为30ns

DB0~DB11:二进制数据输入端。

CS:片选端,低电平有效,片选脉冲宽度为30ns

A/B:选择DAC A=0,选择DAC B=1

VDD:电源,5V

VREF2.5V的参考电压输出,

特点:

1、输出建立时间为16us

2、单电源,5V电源供电;

3、低功耗,5mW.

4、双12位数模转换器,内设运放,无需外扩;

51mV/Bit,满刻度为4.095V

 
   

控制逻辑真值表

 

 
   

(表示上升沿触发)

 

 

芯片调试心得:LDALDB在拉低一段时间后,必须再拉高,锁存一下;AD8582的速率不是很高,所以速率过快的话正弦波就会变成三角波;在一开始的时候我一直明白为什么我把芯片手册看的很清楚了就是输出的波形有问题,如下图,直到我找够了杜邦线,把该连接的管脚全连接上以后才出现很稳定的波形,其实我早有体会的,再这里再写一次算做为对自己的提醒,一定要把芯片手册看懂,英文的也要一个单词一个单词的去阅读,搞清楚了再搭硬件电路,既然要搭电路就要把电路搭好,不然心里没有底,也出不来想要的结果,很会浪费很多的时间;

 

相差可调的信号发生器

本程序用来产生一个频率可调,相位可调的正弦信号,通过两个按键来控制

分频模块

module fenpin(clock,key2,rst,r_clk);

input clock;

input rst;

output r_clk;

input key2;

reg clk_r;

reg key2_r1,key2_r2;

always@(posedge clock or negedge rst)

begin

if(!rst)

begin

key2_r1<=1'b1;

key2_r2<=1'b1;

end

else

begin

key2_r2<=key2_r1;

key2_r1<=key2;

end

end

wire neg_key2=(~key2_r1)&(key2_r2);/*检测下降沿*/

/*产生不tong频率的时钟*/

reg[3:0] i;

reg[7:0] cnt;

always@(posedge clock or negedge rst)

begin

if(!rst)

begin

i<=4;

end

else if(neg_key2)

i<=i+1'b1;

end

always@(posedge clock or negedge rst)

begin

if(!rst)

begin

clk_r <=1'b0;

cnt <= 8'd0;

end

else

begin

cnt<=cnt+1'b1;

if(cnt[i])

clk_r<=1'b1;

else

clk_r<=1'b0;

end

end

assign r_clk=clk_r;/*产生了可变是时钟*/

endmodule

核心模块

`define   phase   8'd15 /*pi/8*/

module siganl_test(rst,address,clk,addr_select,key1,key3,);

input key1;/*用来调节相位*/

input key3;/*相位改变的确定键*/

input clk;

input rst;

output addr_select;/*地址选择,标志要输入正常波,还是调频波*/

reg    addr_select;

output[7:0] address;

reg[7:0]  address_r;

/*检测两个按键的下降沿*/

reg[7:0] phase_cnt;/*用来调制相差,记录初相*/

reg[7:0] address_r1;/*用来存储正常的地址*/

reg[7:0] address_r2;/*用来存储可变相的地址*/

reg key1_r1,key1_r2;/**/

reg key3_r1,key3_r2;

/*key1,key2只所以要分开写,是因为两者用到了不同的时钟,不能写到一块去*/

always@(posedge clk or negedge rst)

begin

if(!rst)

begin

key1_r1<=1;

key1_r2<=1;

key3_r1<=1;

key3_r2<=1;

end

else

begin

key1_r2<=key1_r1;

key1_r1<=key1;

key3_r2<=key3_r1;

key3_r1<=key3;

end

end

 wire neg_key1=key1_r2&(~key1_r1);/*检测下降沿*/

 wire neg_key3=key3_r2&(~key3_r1);

always@(posedge clk or negedge rst)

begin

if(!rst)

begin

phase_cnt<=8'd0;

address_r1<=0;

address_r2<=0;

end

else 

begin

addr_select<=addr_select+1'b1;

/*在按下确定键时,同时对一两个地址复位*/

if(neg_key3)

begin/*这里是在原来的基础上改变相位*/

address_r1<=address_r1+phase_cnt;

phase_cnt<=0;

end

else if(neg_key1)

begin

if(phase_cnt>8'd127)

begin

phase_cnt<=0;

end

else

begin

phase_cnt<=phase_cnt+`phase;

end

end

else

begin

 

if(addr_select)

begin

address_r2=address_r2+1'b1;

address_r<=address_r2;

end

else

begin

address_r1=address_r1+1'b1;

address_r<=address_r1;

end

end

end

end

assign address=address_r;

endmodule

AD8582的控制模块

module AD8582_control(clk,rst,cs,a_r_b,lda_r,ldb_r);

input clk;

input rst;

output cs,a_r_b,lda_r,ldb_r;

reg cs,a_r_b,lda_r,ldb_r;

reg cnt;

always@(posedge clk or negedge rst)

begin

if(!rst)

begin

cnt<=1'b0;

cs<=1'b1;

a_r_b<=1'bz;

lda_r<=1'bz;

ldb_r<=1'bz;

end

else

begin

cs<=1'b0;

cnt<=cnt+1'b1;

 

if(cnt==1'b1)

begin

a_r_b<=1'b1;

lda_r<=1'b1;

ldb_r<=1'b0;

end

else

begin

a_r_b<=1'b0;

lda_r<=1'b0;

ldb_r<=1'b1;

end

end

end

endmodule

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/zhongguo135/p/2752434.html