写在前面:如有错误,感谢指正,各位大佬轻点喷
设备:
安捷伦示波器,型号:MSO-X2024A(现在应该叫是德);正点原子新起点开发板;DAC芯片AD5664,型号:AD5664RBRMZ-5REEL7。
测量前工作:
用单片机或FPGA做主控来通信也有那么多次,但从来没有实际测量过时域上的通信信号波形,之前要么是仿真波形或者直接通过结果来看实现与否。测量通信波形可以间接的验证代码的正确性,辅助结果实现。
直接开始看手册吧AD5624R/AD5644R/AD5664R (Rev. D),AD5664-5是四通道DAC,具有内部2V5的基准源,功能框图如下,除了供电,ABCD通道,和基准源输出或输入外就是三根通信线。为了节省空间和成本,使用的内部基准源,本文测量的就是使能内部基准源的通信信号。

在手册23页INTERNAL REFERENCE SETUP小节,说明了内部基准源默认是关闭的,若需使用需先使能,使能后VREFOUT引脚会输出以2V5的电压。同页的表17给出了使能基准源要填入的寄存器数据,这里我把Don't care都设为0,方便后续测量观察。数据从DB23-DB0,共24位,根据此表,得到{2'b00,3'b111,3'b000,16'b0000_0000_0000_0001}。

后面就很简单了,找到芯片通信时序图来给芯片数据即可,注意时间上需遵循7页表5的TIMING。
根据21页末的时序图,如下所示。直接看右半部分valid,
1.在给24位数据之前一个时钟,拉高SYNC#,相对于给芯片说我要给你数据了,请你准备好
2.拉低SYNC#,并从高到低依次输入数据
3.拉高SYNC#,直到下一次输入数据

开始测量:
根据手册编写好verilog代码(附在最后)后,用两个探头分别打在SCLK(黄色)和DIN(绿色)端观察波形,实际测量如下,看着有些奇怪,不知道是不是因为时钟给的50MHz导致测量有点失真了。不过从数据上来分析是符合代码功能的,图上是{2'b00,3'b111,3'b000,16'b0000_0000_0000_1111},把最后四位都设为1,因为我发现一个高电平观察没这个直观。

观察上图,第一组3'b111的波形在左边部分,在三个时钟周期,DIN端为高电平;过十五个时钟的DIN低电平后;第二组6'b0000_0000_0000_1111的波形在右边部分,在四个时钟,DIN为高电平。综上,实现了对AD5664的通信,及其波形的测量。
测量分析:
本次测量到的波形,和我在其他博客上,如下所示20us的周期,看得到出入还是挺大,首先是时钟信号测到的是一个类似于三角波的样子,并且带有一定的偏置;然后数据线的波形也同样较为抽象。分析可能是由于50M的时钟测量失真导致的,后面尝试降低时钟频率测量。之后再对AD5664芯片功能实现的测试。

转载:用示波器对单片机I2C时序进行图形波形分析的试验小结 - FusionHEX_M - 博客园
降低时钟频率到500kHz后,测量结果如下所示,波形正常了与之前预想的原因吻合。

附测试代码:
这里要感谢一下另一个组的师兄,我FPGA看过许多他的工程,从中学习到很多。
module water_detect(
input sys_50MHz,
input sys_rst,
output sdram_clk,
//DAC AD5664
output reg sample_clk,
output add5664_sdi,
output add5664_clk,
output add5664_syn
);
wire nios_clk;
wire sys_clk;
reg [11:0]cnt;
//模拟sample_clk
always @(posedge sys_clk or negedge sys_rst)begin
if(!sys_rst)begin
sample_clk <= 'd0;
cnt <= 'd0;
end
else begin
if (cnt == 'd1000)begin
sample_clk <= 'd1;
cnt <= 'd0;
end
else begin
cnt <= cnt + 1'b1;
sample_clk <= 'd0;
end
end
end
ad5664 u_ad5664(
.sys_clk (sys_clk) ,
.sys_rst (sys_rst) ,
//.signal () ,
.sample_clk (sample_clk) ,
.add5664_sdi (add5664_sdi) ,
.add5664_clk (add5664_clk) ,
.add5664_syn (add5664_syn)
);
pll_1 u_pll_1 (
.inclk0 ( sys_50MHz ),
.c0 ( nios_clk ),
.c1 ( sdram_clk ),
.c2 ( sys_clk )
);
endmodule
module ad5664(
input sys_clk,
input sys_rst,
input [15:0] signal,
input sample_clk,
output add5664_sdi,
output add5664_clk,
output reg add5664_syn
);
assign add5664_clk = sys_clk; //DAC时钟50MHz
reg sample_clk_last;
reg [23:0]outdata_buff;
reg RS;//syn后一个时钟的延时
reg [4:0] i;//24位计数
always @(*) begin
outdata_buff <= {2'b00,3'b111,3'b000,16'b0000_0000_0000_1111};//使能内部参考源
end
//sample_clk采样时钟上升沿产生syn信号开始
always @(posedge sys_clk or negedge sys_rst)begin
if(!sys_rst)begin
sample_clk_last <= 'd0;
add5664_syn <= 'd0;
end
else begin
sample_clk_last <= sample_clk;
add5664_syn <= (~sample_clk_last)&sample_clk;
end
end
always @(posedge sys_clk or negedge sys_rst )begin
if (!sys_rst)begin
RS <= 1'b0;
i <=6'h18;
end
else begin
case(RS)
0:begin
if(add5664_syn)begin
RS<=1'b1;
end
end
1:begin
if(i==0)begin
i <= 6'h18;
RS <= 1'b0;
end
else begin
i <= i-1'b1;
end
end
endcase
end
end
assign add5664_sdi = outdata_buff[i] ; //发送数据
endmodule
568

被折叠的 条评论
为什么被折叠?



