作业04——并行ADC、DAC
作者:互联网
???????????• 掌握并行DAC、ADC的接口时序
背景知识
时钟方案
• 使用FPGA片内的锁相环
– 由50MHz晶振的时钟信号
– 倍频得到80MHz的DAC时钟
– 分频得到20MHz的ADC时钟
锁相环
生成此电路中pll的详细过程:(2条消息) DDS与并行ADC、DAC_EyreG97的博客-CSDN博客
锁相环路是一种反馈控制电路,简称锁相环(PLL,Phase-Locked Loop)。锁相环的特点是:利用外部输入的参考信号控制环路内部振荡信号的频率和相位。因锁相环可以实现输出信号频率对输入信号频率的自动跟踪,所以锁相环通常用于闭环跟踪电路。锁相环在工作的过程中,当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,这就是锁相环名称的由来。
锁相环通常由鉴相器(PD,Phase Detector)、环路滤波器(LF,Loop Filter)和压控振荡器(VCO,Voltage Controlled Oscillator)三部分组成,
• 用FPGA的逻辑对内部的80MHz时钟反相作为DAC 芯片时钟,用于满足DAC数据的建立-保持时序
• ADC时钟同样进行反相,作为ADC接口逻辑的驱动时钟
• ADC芯片在时钟的上跳锁存数据
• 注意:这种用FPGA的内部逻辑电路进行ADC、 DAC的时钟相位调整的方法,其时钟的抖动和相位 噪声不好。高质量设计中,通常用专门的时钟管理 芯片完成时钟的相位调节
转换器的垂直域(电压、数值)问题
- AD9762是无符号的DAC器件
有符号补码需要先把高位取反再送给DAC
原十进制 | 原码 | 有符号补码 | 高位取反 | 取反后十进制数 |
-7 | 1111 | 1001 | 0001 | 1 |
-6 | 1110 | 1010 | 0010 | 2 |
-5 | 1101 | 1011 | 0011 | 3 |
-4 | 1100 | 1100 | 0100 | 4 |
-3 | 1011 | 1101 | 0101 | 5 |
-2 | 1010 | 1110 | 0110 | 6 |
-1 | 1001 | 1111 | 0111 | 7 |
0 | 0000 | 0000 | 1000 | 8 |
1 | 0001 | 0001 | 1001 | 9 |
2 | 0010 | 0010 | 1010 | 10 |
3 | 0011 | 0011 | 1011 | 11 |
4 | 0100 | 0100 | 1100 | 12 |
5 | 0101 | 0101 | 1101 | 13 |
6 | 0110 | 0110 | 1110 | 14 |
7 | 0111 | 0111 | 1111 | 15 |
• AD9200是无符号的ADC
– 最大电压对应MAX值 ;0电压对应0值
• 注意ADC芯片还有一个溢出 out of range 信号
• ADC输入的电压如果超限,则溢出信号置位1
• 数据溢出对于ADC的采样结果是灾难性的
• 尤其是对于频域处理算法
• 一旦检测到ADC溢出,必须先调整其不溢出之后, 再进行其他处理动作。
上机操作
代码
锁相环在quartus中有给出,只需要进行设定参数即可使用
ADC和DAC模块由子卡完成,程序只是规定了连接的接口。
DAC的输入是10位,电路输入是DDS生成的8位正弦波,需要把最高位取反,把低位补零。两个button来控制波形的电压值,通过SCALE参数对幅值移位,使幅值变小。
module DAC_interface(
CLKIN , // input clk
DATIN , // input data
SCALE , // scale factor, right shift the data
DAT2DAC ); // data to dac
input CLKIN;
input [8-1:0] DATIN ;
input [2-1:0] SCALE ;
output [12-1:0] DAT2DAC ;
reg [12-1:0] DAT2DAC ;
reg [12-1:0] datin_R1;
always @ (posedge CLKIN) begin
datin_R1 [11] <= ~ DATIN[7]; // inverse the msb to unsigned
datin_R1 [10: 4] <= DATIN[6:0];
datin_R1 [3 : 0] <= 0;
DAT2DAC <= (datin_R1 >> SCALE);
end
endmodule
ADC的输入是来自DAC,直接连接使用即可,把ADC的溢出位输出,STBY_ADC置零,保持工作
module ADC_interface(
CLK_ADC , // adc clk
DAT_ADC , // input data, from adc
OTR_ADC , // from adc , signal out of range flag
OTR_OUT , // output otr flag
STBY_ADC , // adc stand by, set 0 make adc running
DOUT ); // data out
input CLK_ADC ;
input [9:0] DAT_ADC ;
input OTR_ADC ;
output OTR_OUT ;
output STBY_ADC ;
output [9:0] DOUT ;
reg [9:0] DOUT ;
reg OTR_OUT;
always @ (posedge CLK_ADC) begin
DOUT <= DAT_ADC ;
OTR_OUT <= OTR_ADC;
end
assign STBY_ADC = 1'b0;
endmodule
分配引脚
这里是我不理解的地方
按照教程说的,DAC连接到ADC,但分配的引脚是DAC的输出和ADC的输入对应于GPIO1的不同引脚,那么分配引脚的作用在哪里?并不是实际的连接方式?
RTL视图
50MHz时钟输入锁相环产生ADC和DAC需要的20MHz时钟和80MHz时钟。时钟要从FPGA送到子卡,子卡没有时钟管理芯片,因此使用锁相环用于保证时钟的质量;
DDS电路做数字频率合成,生成数字的正弦波形,用开关控制频率大小,输出数字正弦波形,输入DAC产生模拟波形,输出后通过ADC生成数字波形
使用SignalTap在时域观察信号
输入幅度过大时,ADC会产生溢出信号OTR_OUT为高电平,ADC输出波形产生切割失真。
将SQ8,SW9闭合,波形的幅值变小,ADC输出波形不失真
使用matlab在频谱观察信号
从频谱可以看出,ADC要多出一些杂波,是因为DAC和ADC直接连在一起不满足奈奎斯特准则,但都出现在高频,且幅度不高,因此可以忽略。而且我们需要考虑的是10MHz内的频谱,采样频率是大于等于最高频率的,可以看作满足奈奎斯特准则。
观察DAC的频谱,噪音的包络类似一个个小的包连成。这是因为数字信号是间断的,相当于时域为正弦包络的一串冲激卷积门函数,频域即为乘上Sa函数。
学生实验
思考题
标签:04,DAC,ADC,input,锁相环,输入,时钟 来源: https://blog.csdn.net/weixin_49480182/article/details/118946658