DIP封装:
内部结构:
引脚描述:
Vout1,Vout2:数模转换输出管脚,固定的电压输出范围是0V~4.095V,1mV/LSB.
AGND:模拟地
DGND:数字地
LDA:DAC A寄存器装载选通端,把输入寄存器中的数据转移到DAC 寄存器中,输入低电平有效,电平敏感锁存。
LDB:DAC 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
VREF:2.5V的参考电压输出,
特点:
1、输出建立时间为16us;
2、单电源,5V电源供电;
3、低功耗,5mW.
4、双12位数模转换器,内设运放,无需外扩;
5、1mV/Bit,满刻度为4.095V;
控制逻辑真值表
(表示上升沿触发)
芯片调试心得:LDA和LDB在拉低一段时间后,必须再拉高,锁存一下;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