其他分享
首页 > 其他分享> > 作业04——并行ADC、DAC

作业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的时钟相位调整的方法,其时钟的抖动和相位 噪声不好。高质量设计中,通常用专门的时钟管理 芯片完成时钟的相位调节

转换器的垂直域(电压、数值)问题

原十进制原码有符号补码高位取反取反后十进制数
-71111100100011

-6

1110101000102
-51101101100113
-41100110001004
-31011110101015
-21010111001106
-11001111101117
00000000010008
10001000110019
200100010101010
300110011101111
401000100110012
501010101110113
601100110111014
701110111111115

 • 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