完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
之前看到有人在网上提问ADC,DAC怎么控制啊,感觉就是照着手册上时序的样子把对应的控制线拉高拉低就可以了,可能从完全不懂开始刚上手做这些东西,有时候会遇到一些小障碍,这里以AD5686芯片的驱动为例,详细叙述实现过程以及涉及到的FPGA逻辑电路设计的相关问题。 AD5686是一款4通道16为精度的AD转换器,通过SPI接口进行配置,实现将数字信号转换为模拟信号的功能。SPI接口协议通常有四根数据线,CS,SCLK,SDIN,SDO。CS为片选信号线,当CS为低电平时SPI接口才处于工作状态;SCLK为串行时钟,用来同步数据传输;SDIN为器件的输入信号线,SDO为器件的输出信号线。SPI协议通常采用上升沿发送,下降沿接收,高位先发送的方式。对于数模转换器来说,SDIN输入的信号在SCLK的下降沿进行采集,打入DAC芯片的寄存器,在SCLK的上升沿,SDO输出信号发生变化。 图1 上图是AD5686数据手册上配置接口的时序要求,SCLK为SPI接口的串行时钟信号,SYNC相当于CS,为片选信号,当SYNC拉低时SPI接口开始工作,具体拉低多少时间,拉低不同的时间对应什么结果,手册里会有详细的介绍。这里只是照着这个时序图去写FPGA的逻辑代码,就能保证AD5686正常工作。SDIN为输入数据,即需要转换为模拟信号的数字信号。为什么是从DB23开始呢,因为包含四位控制字和四位地址位,如下图,具体见手册。 图2 SDO为AD5686的输出信号,用于菊花链或者反馈,这里只用单个AD5686做数模转换的话可以不用,上边的时序图里也没给出这根信号线。LDAC控制数模转换器的模拟输出信号同步更新还是异步更新,本次实例将LDAC一直拉低。RESET为高时芯片输出才能正常工作,需要输出模拟信号时RESET控制线一定要注意将其拉高。另外就是图一中列出时间要求,注意那个时间表里的时间只是一个范围要求,满足那个范围就可以,不是严格控制的,上次看到有人在网上问。说清楚了这些,现在就来通过ISE创建一个AD5686驱动程序。Verilog代码如下: module DAC(CLK,RESET,SCLK,SYNC,SDIN,LDAC,RSTDAC); input CLK; inputRESET; outputSCLK; output regSYNC; output regSDIN; output regLDAC; output regRSTDAC; reg[4:0]n; wire[23:0]data; assigndata={4'b0001,4'b0001,16'b0101_0101_0101_0101};//控制字位4'b0001;地址位4'b0001,表示由A口输出模拟信号 always@(posedge CLK_50M or negedge RESET) begin if(!RESET) begin SYNC<=0; SDIN<=0; LDAC<=0; RSTDAC<=1; n<=5'd24; end else begin if(n==5'd24) begin SYNC<=1; n<=n-5'd1; end elseif(n==5'd23) begin SDIN<=data[n]; SYNC<=0; n<=n-5'd1; end elseif(n<5'd23&&n>0) begin SDIN<=data[n]; SYNC<=0; n<=n-5'd1; end elseif(n==0) begin SDIN<=data[0]; n<=5'd24; end end end DCM instance_name (// Clock inports .CLK_IN1(CLK), // IN // Clock outports .CLK_OUT1(CLK_50M) // OUT ); //OUT ODDR2 #( //The following parameters specify the behavior //of the component. .DDR_ALIGNMENT("NONE"),// Sets output alignment // to "NONE", "C0" or"C1" .INIT(1'b0), // Sets initial state of the Q // output to 1'b0 or 1'b1 .SRTYPE("SYNC")// Specifies "SYNC" or "ASYNC" // set/reset ) ODDR2_sclk( .Q(SCLK), // 1-bit DDR output data .C0(CLK_50M),// 1-bit clock input .C1(~CLK_50M),// 1-bit clock input .CE(1'b1),// 1-bit clock enable input .D0(1'b1),// 1-bit data input (associated with C0) .D1(1'b0),// 1-bit data input (associated with C1) .R(1'b0), // 1-bit reset input .S(1'b0) // 1-bit set input ); endmodule 例程中SDIN输入的数据为16'b0101_0101_0101_0101,对应的十进制数是21845,而AD5686为16位精度,参考电压为2.5V,2.5*21845/65536约等于0.83V,也就是说上边代码对应的电路去驱动AD5686,其模拟信号输出端A口输出约为0.83V的直流电压。对上述代码进行仿真,仿真结果如图3所示。
|
|
相关推荐
|
|
1421 浏览 1 评论
1215 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
1426 浏览 0 评论
913 浏览 0 评论
2229 浏览 0 评论
1426 浏览 34 评论
5612 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 08:36 , Processed in 0.609481 second(s), Total 71, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号