【FPGA学习】根据datasheet编写Verilog驱动(DAC8552)


这篇博客其实是我一直很想去总结的东西,做电子设计同学肯定有用STM32等MCU根据datasheet写芯片驱动的经验,大部分都可以用IO口的控制和延时函数或者MCU自带的硬件外设解决,但是一但要求使用FPGA就不免有点懵,因此如何使用HDL来对整体的驱动流程进行描述是这篇博客的重点,在后面的另一篇博客还会通过一个实际的例子对这篇博客进行练习,本篇博客基于b站上的一个视频,UP主讲的非常好,这位UP主的讲解给了我很多灵感,大家可以去那里学习
根据数据手册编写Verilog驱动

DAC8552的数据手册:
DAC8552

把握基本信息

在编写芯片的驱动代码之前那,首先就要对芯片的基本信息有一个整体的把握,可以阅读芯片厂商提供的datasheet以及模块卖家提供的模块使用手册,在这里就用datasheet为例:
从datasheet的DESCRIPTION中可以获得芯片的基本功能:

可见DAC8552是一个16位,双通道输出的DAC,而且是通过3线串行接口来与外部通信

然后就是ELECTRICAL CHARACTERISTICS部分,这一部分可以看到芯片的具体参数:





可以从中看到,芯片的供电电压是多少,DAC输出的电压范围,输出电压的建立时间等,把握这些有利于我们进行设计,而且也可以通过这些对商家设计的模块进行研究,可以有一些收获,但是要注意,我仅仅只是从一个编写驱动代码的角度出发来阅读这些参数,如果你是要做硬件,比如要进行系统的选型工作,这些参数大概是不够的,还需要进一步进行考量,当然我本身硬件不是很强,所以在这里不做赘述

接着是PIN CONFIGURATION部分,这一部分描述了芯片的引脚功能:

对于这一部分主要是看他的一些使能,通信等引脚,因为这些引脚跟我们编写驱动息息相关,当然,这一部分我建议可以跟商家提供的模块说明书或者原理图一起阅读,这样子能更好的理清如何对模块进行操作
可以看到,芯片有A和B两个端口的输出,同时还有参考电压的输入以及三根通信线:

  • SCLK:串行时钟
  • DIN:串行数据
  • SYNC:帧同步信号

最后是THEORY OF OPERATION部分(在datasheet中,前面还有SERIAL WRITE OPERATION部分,这部分是要重点分析的,所以放在后面),这部分是对于芯片功能与功能实现的详细描述,是之前各个部分的扩展,在把握基本信息部分,只需要看一下datasheet中所提到的Architecture部分:

这一部分可以帮助掌握芯片内部的基本结构,尤其是功能比较复杂的芯片,这个会很有帮助

编写驱动代码

了解了基本信息后,就可以来编写驱动代码了,在编写时需要把握住两点,一个是如何通过接口通信,另一个则是如何通过通信实现功能,这两点主要就在上面所提到的SERIAL WRITE OPERATION部分和THEORY OF OPERATION部分

如果通过通信实现功能

在datasheet中,有一个公式:

这说明了我们输入数据与输出之间的关系,我们正是通过输入的16位二进制数(十进制范围是0-65535)来控制DAC的输出电压,同时还需要确定参考电压的大小
那么自然而然就会有疑问,16位数据肯定是通过之前的所说的3线接口写入的,但是格式是怎么样的呢?
datasheet的对此有所描述:

可见DAC8552内部有24位移位寄存器,8位MSB是控制位,而16位LSB则是之前提到的控制输出的输入数据,接下来就要搞清楚8位控制位的具体含义:



根据datasheet中的描述,可以总结如下:

  • DB22和DB23是保留位且必须为0
  • DB20和DB21控制模拟输出的更新或掉电命令
  • DB19是don't care bit,0和1都可以
  • DB18控制数据或掉电命令是作用于DAC A还是DAC B
  • DB16和DB17选择掉电的模式
    对于各个控制位的组合有怎么样的功能,可以参考一下Control Matrix部分,对各种组合的说明都比较详细
    这样子我们就了解了DAC8552的功能如何实现,接下来就需要了解如何进行通信,如果还有什么不了解的,datasheet在后面有OPERATION EXAMPLES和APPLICATION INFORMATION,这些是根据上述的功能描述来进行实际应用的例子,可以对描述不清晰的地方进行验证

如何通过接口通信

datasheet给出了SERIAL WRITE OPERATION:

这里描述了通信的时序图,以及在时序中的建立时间和保持时间等概念,这些就是实现通信的关键,也是我们编写驱动代码主要要参考的东西,之前提高功能实现则是在这个的框架之上进行个性化设计的过程