fpga设计中dac7512控制的verilog实现

上传人:小** 文档编号:94146016 上传时间:2019-08-02 格式:DOC 页数:7 大小:184KB
返回 下载 相关 举报
fpga设计中dac7512控制的verilog实现_第1页
第1页 / 共7页
fpga设计中dac7512控制的verilog实现_第2页
第2页 / 共7页
fpga设计中dac7512控制的verilog实现_第3页
第3页 / 共7页
fpga设计中dac7512控制的verilog实现_第4页
第4页 / 共7页
fpga设计中dac7512控制的verilog实现_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《fpga设计中dac7512控制的verilog实现》由会员分享,可在线阅读,更多相关《fpga设计中dac7512控制的verilog实现(7页珍藏版)》请在金锄头文库上搜索。

1、FPGA设计中DAC7512控制的Verilog实现一,概述DAC7512是一个12-BIT,串行接口的DAC。低功耗,RAIL-TO-RAIL输出,SOT23-6封装。3线串行端口最高工作频率可以达到30MHZ,并兼容SPI,QSPI,MICROWIRE等总线。DAC7512没有专用的基准电压输入,直接把VDD和GND作为基准电压,12BIT的分辨率,其输出电压为VOUT = VDD * D/4096。 其中D是12BIT电压数值。SOT23-6封装的DAC7512的引脚图如下。DAC7512具有3线串行端口,其信号定义如下所示: 对DAC7512来讲,在总线上只会接收控制器发出的16BIT

2、的数字信号(2BIT无效数据,2bit控制数据和12bit(信号幅值数据)。所以对于控制器来讲,在总线操作上,只需要串行写这一种操作。 总线串行写操作在SYNC的下降沿开始。16 bit的数据在SCLK的下降沿被依次送入到DAC7512内部的移位寄存器中。从功耗的角度上讲,如果SYNC在空闲状态保持低电平,则有利于功耗的降低,但从总线操作的角度上讲,需要SYNC的下降沿来启动一次传输。 下面的图和表是总线操作的时序要求:二,总线控制器的设计 根据总线控制器的特性,采用状态机来实现总线控制器的设计。从上面DAC7512的操作时序上来看,用一个三状态的状态机实现总线控制器是比较好的选择。在系统初始

3、化或者没有数据传输时,系统处于空闲状态(DAC_IDLE),为了降低功耗,在这个状态下,SYNC信号为低电平;当有数据需要传输时,先进入DAC_PRE状态,在这个状态下,使SYNC信号为高电平,DAC_PRE状态保持的时间最短为SYNC需要保持为高电平的时间,即上图的T8,在VDD为3.6V5.5V的时候,为33ns;当DAC_PRE状态结束时,进入DAC_DATA状态,在这个状态下,依次把16bit数据送到总线上去。 下图是状态机状态转换图。系统初始化或者数据传输结束时,进入DAC_IDLE状态。当有数据需要传输时,进入DAC_PRE状态。在DAC_PRE状态保持的时间,根据SYNC保持高电

4、平的时间来决定,采用一个计数器来实现保持时间。系统进入DAC_DATA时,开始传输数据,当16bit数据全部传输完毕后,系统回归到IDLE状态。 DAC_DATA状态下,送往总线的数据由计数器来控制,DAC_DATA状态保持的时间也由计数器控制。由于总线上,数据在SCLK的下降沿被DAC7512锁存,所以控制器需要在SCLK的下降沿之前把数据送到总线上,并且要保证数据SETUP TIME的要求。为了便于控制,我们采用一个比SCLK的频率高一倍,且相位相同的时钟(CLK_IN)来控制总线上数据的转换。DAC_DATA状态计数器也工作在这个时钟频率下。 下面是状态机部分的verilog实现:reg

5、 DA_SCLK;/串口时钟,由CLK_IN二分频得到,本例中CLK_IN为50MHz时钟,DA_SCLK为25MHzalways (posedge CLK_IN or negedge RESET)beginif(RESET)DA_SCLK = 1b0;elseDA_SCLK = DA_SCLK;endparameter DAC_IDLE = 3b001,/系统空闲DAC_PRE = 3b010,/系统数据预传输状态DAC_DATA = 3b100;/系统数据传输状态reg 2:0 DACSM, DACSMNXT;wire PHASE_DAC_IDLE = DACSM0;wire PHASE_

6、DAC_PRE = DACSM1;wire PHASE_DAC_DATA = DACSM2;wire PHASENXT_DAC_IDLE = DACSMNXT0;wire PHASENXT_DAC_PRE = DACSMNXT1;wire PHASENXT_DAC_DATA = DACSMNXT2;reg 2:0 DAC_PRE_CNT;/系统预传输保持时间计数器,工作在CLK_IN时钟频率下,生成的DAC_PRE_END信号作为状态机跳转信号。always (posedge CLK_IN or negedge RESET)beginif(RESET)DAC_PRE_CNT = 3b0;els

7、e if(PHASE_DAC_PRE)DAC_PRE_CNT = DAC_PRE_CNT + 3b1;elseDAC_PRE_CNT = 3b110);reg 7:0 DAC_DATA_CNT; /DAC_DATA状态计数器,工作在CLK_IN时钟频率下,是总线上数据传输频率的两倍,所以在需要传输16bit数据的时候,该时钟需要计数到32。always (posedge CLK_IN or negedge RESET)beginif(RESET)DAC_DATA_CNT = 8b0;else if(DAC_DATA_CNT = 8d32)DAC_DATA_CNT = 8d0;else if(P

8、HASENXT_DAC_DATA | PHASE_DAC_DATA)DAC_DATA_CNT = DAC_DATA_CNT + 8b1;elseDAC_DATA_CNT = 8d31);always (posedge DA_SCLK or negedge RESET)beginif(RESET)DACSM = DAC_IDLE;elseDACSM = DACSMNXT;endalways (DACSM or DA_DATA_EN or DAC_PRE_END or DAC_DATA_END)beginDACSMNXT = DACSM;case(DACSM)DAC_IDLE:if(DA_DATA

9、_EN)DACSMNXT = DAC_PRE;elseDACSMNXT = DAC_IDLE;DAC_PRE:if(DAC_PRE_END)DACSMNXT = DAC_DATA;elseDACSMNXT = DAC_PRE;DAC_DATA:if(DAC_DATA_END)DACSMNXT = DAC_IDLE;elseDACSMNXT = DAC_DATA;default:DACSMNXT = DAC_IDLE;endcaseend 按之前的讨论,SYNC信号在DAC_IDLE和DAC_DATA状态下,都为低电平,在DAC_PRE状态下,为高电平。所以,用下面的逻辑生成SYNC信号。ass

10、ign DA_SYNC = PHASE_DAC_IDLE ? 1b0: ( PHASE_DAC_PRE ? 1b1 : (PHASE_DAC_DATA ? 1b0 : 1b1) ); 通过一个12bit的端口向控制器写入需要送到DAC7312的数据(DA_DATA),用一个使能信号(DA_DATA_EN)表示DA_DATA是否有效。同时DA_DATA_EN也作为系统有数据传输的开始信号。当DA_DATA_EN有效时,我们将DA_DATA上的数据所存到寄存器中,然后在DAC_DATA的状态下,依次将16bit数据送到总线上,verilog的逻辑实现如下所示。wire DA_DIN;reg 15:

11、0 DA_DATA_CP;always (posedge CLK_IN or negedge RESET)beginif(RESET)DA_DATA_CP = 16b0;else if(DA_DATA_EN)DA_DATA_CP = 4b0, DA_DATA;else if(PHASENXT_DAC_DATA & PHASE_DAC_DATA) | ( PHASE_DAC_DATA & DAC_DATA_CNT0 = 1b1)DA_DATA_CP = DA_DATA_CP14:0, DA_DATA_CP15 ;elseDA_DATA_CP = DA_DATA_CP;endassign DA_DIN = DA_DATA_CP15 & PHASE_DAC_DATA;采用CLK_IN来控制数据的输出,便于做STA的分析,也更容易满足系统的时序要求。至于时序约束方面的内容,会在后面的文章中给出。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号