关于频率与时间的关系:
一个 100 MHz 的时钟信号,其周期T = 1 / (100 × 10⁶) = 10 × 10⁻⁹ 秒 = 10 ns。
一个 1 GHz(1000 MHz)的时钟信号,其周期T = 1 / (1 × 10⁹) = 1 ns。
频率 (MHz) 和 周期时间 (ns) 在数值上大致互为“倒数”。
快速换算公式:
周期 (ns) ≈ 1000 / 频率 (MHz)
例如:100 MHz -> 周期 ≈ 1000 / 100 = 10 ns。
例如:250 MHz -> 周期 ≈ 1000 / 250 = 4 ns。
例如:2 GHz (2000 MHz) -> 周期 ≈ 1000 / 2000 = 0.5 ns。
DAC芯片型号为AD5324;属于慢速DAC 转换芯片,其转换速率 < 1Mhz;
DAC的作用是将输入的二进制数字信号转换成模拟信号,以电压或电流的形式输出。
AD5324可以将输入的二进制数字信号转换成对应的电压值,并将电压输入到其中一个寄存器中,一共有4个寄存器;
FPGA与AD5324芯片通信接口:DIN、SCLK、SYNC;
DIN:输入数据,目的将16位二进制数字组成的数字串输入到DAC 的移位寄存器;
SCLK:同步时钟信号,数据在SCLK 的下降沿时锁存到DAC 的移位寄存器;
SYNC:同步信号,低有效;
接口时序:
规定SCLK 周期最小为 40ns,把SCLK的周期设置为140ns,上电时,保持SYNC为高电平,需要传输数据时,把SCLK拉高,先保持SYNC高电平时间至少80ns,设置保持一个SCLK周期的时间为高电平后,再把SYNC信号拉低,同时SCLK开始震荡计数,然后在16个SCLK的下降沿对应DIN上每个16位数据的中心位置,16个SCLK周期过后,SYNC和SCLK同时拉高并保持。
寄存器的位宽为16位(4个控制位和12位数据位),在时钟SCLK控制下,数据以16位字的形式输入到设备,最高位优先;
由最高两位(A1、A0)决定存入哪个寄存器(A\B\C\D 四个寄存器),
寄存器(A\B\C\D)各自对应二进制为00、01、10、11;
另外,PD位决定部件处于正常或下电模式,0为下电模式,1为正常模式。LDAC位控制何时更新DAC寄存器和输出,0表示更新所有寄存器的数据,1表示只更新寻址寄存器的数据,DAC寄存器的内容没有变化。
由PD 和 LDAC共同决定DAC 的工作模式;
其中,sync_cnt计数是为了SYNC高电平时间至少满足80ns;之后控制sclk开始震荡计数;
在16个sclk周期后,SYNC和SCLK同时拉高保持;
由串口助手下发三个字节的指令,控制DAC 产生对应数值的电压;
第一字节为AA,帧头,使得DAC进入准备状态,防止串口产生的意外数据进行干扰;
第二字节为选择寄存器指令,A1和A0;PD和LDAC固定为1和0,以及DAC值的高4bit;
第二字节的低4bit和第三字节的全部位组成12位的DAC 数据位;
UART帧协议规范:
帧字节编号 | ||
0 | 帧头 0xAA | |
1 | {A1,A0,PD,LDAC,DAC[11:8]} | A1A0:通道选择 第7:6两位; PD:断电设置 第5位 LDAC:更新DAC值 第4位 DAC[11:8] DAC数据 第3:0位 |
2 | DAC[7:0] |
输出的电压VOUT与输入的12位数据位的数据D公式:
VOUT = VREF * D / 2^N
VREF:参考电压;2.5v;
N:DAC分辨率,AD5324的分辨率为12位;
因为由 A1和A0两位可以分别选择四个通道的其中一个;
假如:在A 通道产生一个1.6V的电压,那么A1和A0 设置为00;PD和LDAC固定为1,0;
12位的数据位根据公式:1.6 = 2.5 * D /2^12; 计算可得 D = 2621.44 ≈2621;
转换为二进制1010_0011_1101;
那么,串口发送第一个字节为AA指令;
第二个字节高4位为0010;对应A1,A0,PD,LDAC;
第二个字节低4位为1010;对应数据位的最高4位;
第三字节为0011_1101;
将3个字节转换为十六进制:AA,2A,3D;
工程实现架构:
整个实现先接收串口下发的单比特数据,转换为8比特并行数据,同时根据UART协议找到帧头0xAA,对齐帧头后,将控制比特和数据比特进行拼接为16位数据,再根据SPI 接口的时序,将16位数据转换为单比特数据输出给ADC芯片;
串口顺序下发指令,每接收到一个串口数据有效标志就按照功能描述把串口输出的有效数据拼接到一个16位的移位寄存器中,当三个字节指令帧发送完成后,产生一个结束标志。之后把这个16位的寄存器值赋值给 Chn_data,同步产生Chn_valid标志,给到 Dac_ctrl;
设计串口接收模块:
根据串口协议:
空闲位(1到0跳变)+ 8位数据位 + 停止位
串口接收模块:
对接收到的串口数据进行打拍,消除亚稳态;
并通过找寻下降沿,找到串口传输的起始位;
该 rx_flga标志了串口的8位数据位的有效标志;
在串口数据有效阶段,循环计数cnt_baud,并在计数值的中间进行比特累加,
同时进行接收数据的移位操作;
通过串口,每输入8位,进行拼接, 拼接成 8 比特的并行数据进行一次输出;
每移位8次,输出一个完整的8比特数据;
串口命令解析模块:
假如:在A 通道产生一个1.6V的电压,那么A1和A0 设置为00;PD和LDAC固定为1,0;
12位的数据位根据公式:1.6 = 2.5 * D /2^12; 计算可得 D = 2621.44 ≈2621;
转换为二进制1010_0011_1101;
那么,串口发送第一个字节为AA指令;
第二个字节高4位为0010;对应A1,A0,PD,LDAC;
第二个字节低4位为1010;对应数据位的最高4位;
第三字节为0011_1101;
将3个字节转换为十六进制:AA,2A,3D;
根据以上,一共发送3个字节,第一字节为AA,通过cnt 计数,0~2,对应帧字节编号;
根据串口的帧协议:
帧字节编号 | ||
0 | 帧头 0xAA | |
1 | {A1,A0,PD,LDAC,DAC[11:8]} | A1A0:通道选择 第7:6两位; PD:断电设置 第5位 LDAC:更新DAC值 第4位 DAC[11:8] DAC数据 第3:0位 |
2 | DAC[7:0] |
将控制数据和有效数据进行拼接:
同时产生结束标志:
DAC控制模块:
由串口接收数据,最终通过spi 接口发送给AD5324,控制该ADC芯片将数据转换为模拟信号输出;
设计状态机,IDLE为初始态、SYNC为等待SYNC信号拉高一定周期后再拉低;
SYNC_SHIFT:移位寄存器输出,并行转串行输出;
计满一个 SCK 时钟周期,之后跳转下一状态:
后续根据 div_cnt 和 sync_shift_cnt 产生 SPI接口的控制时序;
产生SPI接口的SCK时钟信号:
产生SPI接口的片选信号,低有效:
产生SPI 接口的sdi 单比特数据输出:
仿真激励:
给rx赋值,查看SPI接口的控制信号;