示波器测量FPGA对AD5664的通信信号,附Verilog代码

该文章已生成可运行项目,

写在前面:如有错误,感谢指正,各位大佬轻点喷

设备:

        安捷伦示波器,型号: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

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值