DAC AD7303 Pmod控制器(VHDL实现)

逻辑主页

代码下载

DAC AD7303 Pmod控制器(顶层文件):
pmod_dac_ad7303.vhd (8.5 KB)

双MOSI接口的SPI主控制器(必须包含在项目中):
spi_master_dual_mosi.vhd (9.7 KB)

特性

  • 用于Digilent Pmod DA1模块(搭载ADI AD7303数模转换器)的精简接口VHDL源代码
  • 通过简单并行接口同步控制Pmod模块上的双通道8位DAC
  • 处理与DAC Pmod的所有串行通信
  • 可配置系统时钟频率

简介

本文详述了与Digilent Pmod DA1模块(采用AD7303芯片)对接的VHDL组件,如图1所示。图2展示了该DAC AD7303 Pmod控制器在系统中的典型应用实例。如图所示,DAC Pmod控制器连接Pmod端口并执行指令来设置DAC输出。数据通过简单并行接口锁存,可连接至用户逻辑或FPGA的输入端口。

1. 适配AD7303的Digilent Pmod DA1模块

2. 示例实现

背景

Pmod DA1模块配备两片ADI AD7303双电压输出8位数模转换器,共提供4个DAC输出通道。转换器配置为使用DAC内部电压基准,并利用片内放大器实现轨到轨输出摆幅。通过最高30MHz的串行接口进行控制。Pmod DA1的电路设计支持同时写入两个DAC。

控制位

AD7303的两个通道通过发送控制字节和数据字节进行控制。由于Pmod DA1始终使用内部电压基准,此处仅展示控制字节的低6位。表1列出了控制位及其功能。表2展示了加载功能的真值表。表3说明了如何实现掉电功能。

1. 控制位

2. 加载功能真值表

3 掉电真值表

操作原理

DAC Pmod控制器采用简易状态机,并基于eewiki提供的SPI主控组件修改版本来控制DAC Pmod。

状态机

该设计采用图3所示的状态机实现其操作。组件启动后立即进入开始( start 状态。在此状态保持100微秒,确保Pmod有充足的上电时间。随后进入暂停( pause 状态。此处确保与DAC的两次操作间隔至少33纳秒。此时撤销 (busy) 信号,表明DAC Pmod控制器已准备好与DAC Pmod进行新操作,并进入就绪 (ready) 状态。在就绪 (ready) 状态等待,直到dac_tx_ena 使能信号激活,随即锁存新操作的控制位和双DAC数据,进入 发送 数据 (send_data) 状态。在此状态下执行与Pmod的操作,同时与两个DAC通信,完成后返回暂停 (pause )状态。虽未图示,但任何时候重置组件都会使其返回开始( start 状态。

3. 状态图

SPI 主控

send_data 状态期间,状态机控制一个SPI主设备组件与Pmod上的DAC进行通信。本设计中使用的SPI主设备是经过修改的流行SPI主设备版本,其文档和资源可在此处获取。此修改版本复制了原始版本中的MOSI逻辑,以提供两个独立的MOSI输出(mosi_0mosi_1 )。输出的MOSI数据分别取自两个并行输入tx_data_0tx_data_1 。通过这种方式,SPI主设备可以使用单个SPI总线同时与两个独立的从设备进行独立数据通信。

SPI主设备配置为CPOL = 0和CPHA = 0,以满足AD7303转换器的要求。

时钟配置

通过为ENTITY中定义的GENERIC参数clk_freqspi_clk_div 赋值,配置该DAC Pmod控制器的时钟。clk_freq 参数必须设置为clk 输入端口提供的系统时钟频率(单位MHz)。公式1定义了spi_clk_div 值的计算方法。

07_00

其中fclk 表示所提供系统时钟的频率,单位为MHz。

例如,代码中指定的默认值为spi_clk_div = 1。这是因为该组件是在使用50 MHz系统时钟的情况下开发和测试的。50/60 = 0.83,向上取整为1。任何clk_freq ≤ 60 MHz都会导致默认的spi_clk_div = 1。

公式2定义了由此产生的串行时钟频率fsclk

此计算确保串行时钟低于DAC规定的最大通信频率30 MHz。当输入时钟频率(以MHz为单位)为60的整数倍时,通信速度最快。

事务

DAC Pmod控制器通过其busy 口输出指示其可用性。当busy 信号为’0’时,控制器准备接受发送到DAC Pmod的事务。置位dac_tx_ena 输入会锁存dac_1_ctrl、dac_1_datadac_2_ctrldac_2_data 上的当前值。一旦锁存,控制器会置位busy信号,表示正在进行事务,当前不可用。当事务完成时,控制器再次取消busy 信号的置位,表示已准备好接受下一个请求。

事务示例

图4展示了一个事务示例。busy 信号为’0’。用户逻辑随后呈现控制位“100000”和数据“10011001”以写入DAC 1。同时呈现控制位“100000”和数据“10110011”以写入DAC 2。控制器置位busy 信号,表示请求已锁存,此时用户逻辑可以取消dac_tx_ena 信号的置位。控制器向DAC Pmod发送串行通信,完成后取消busy 信号的置位。随后,用户逻辑发起新事务,将控制位“100100”和数据“10010001”写入DAC 1,并将控制位“100100”和数据“00111110”写入DAC 2。

dac_tx_ena 信号未取消断言,新事务请求将在控制器就绪33纳秒后被锁存并开始。

4 事务处理示例

端口描述

表4描述了DAC Pmod控制器的端口。

4 端口描述

连接方式

该Pmod配备一个6针连接器J1。表5提供了该连接器的引脚定义。需将DAC Pmod控制器的端口分配至FPGA引脚,这些引脚已按所列方式路由至连接器。

5 DAC Pmod引脚定义及与DAC Pmod控制器的连接

复位

reset_n 输入端口必须保持逻辑高电平,DAC Pmod控制器组件才能运行。该端口低电平时将异步复位组件。复位期间,组件会中止与DAC Pmod的当前事务,并将busy 输出置高表示不可用。复位释放后,DAC Pmod控制器将重新开始运行。

结论

该DAC Pmod控制器是可编程逻辑组件,用于连接Digilent的Pmod DA1至AD7303转换器。它通过简单的并行接口接收用户输入,同步控制Pmod上的两个转换器。

相关主题

SPI主控制器(VHDL)