ZYNQ-FPGA-AD\DA(高速)

一、简介

        ADC是analog to digital converter也就是代表模拟转数字

        DAC是digital to analog converter是数字转模拟

性能指标:

        通常我们关注转换速率以及分辨率两个指标

        转换速率:每秒可以采集多少个点

        分辨率:分辨率是由数据位宽决定,位宽越大越精准(例如0.21比0.2更精准)

其中本次ad da实验采用串并比较型是较快的速度

        DA 芯片(AD9708/3PD9708,两款芯片兼容)输出的是一对差分电流信号,通过高性能和高带宽的运放电路,实现差分变单端以及幅度调节等功能,使整个电路性能得到了最大限度的提升,最终输出的模拟电压范围是-5V~+5V。
        AD 芯片(AD9280/3PA9280,两款芯片兼容)的输入模拟电压转换范围是0V~2V,所以电压输入端需要先经过电压衰减电路,使输入的-5V~+5V 之间的电压衰减到0V~2V 之间,然后经过AD 芯片将模拟电压信号转换成数字信号。

        CLOCK 的时钟频率越快,AD9708 的数模转换速度越快,AD9708 的时钟频率最快为
125Mhz。当输入数据为0时候 ad9708输出5V 输入数据为255时,ad9708输出电压为-5v(因为其外部有一个反相放大电路)(da)

        AD9280 芯片的最大转换速度是32MSPS,即输入的时钟最大频率为32MHz。(ad)

        AD9280 支持输入的模拟电压范围是0V 至2V,0V 对应输出的数字信号为0,2V 对应输出的数字信号为255。

        在当前采样周期后三个周期才可以得到ad输出的data如下图

        

二、实验内容

2.1实验任务

        用软件产生一个正弦波,将该正弦波存储在rom中(数字信号),使用da模块先将数字信号转化为模拟信号,再采用ad模块将其输出的模拟信号转化为数字信号,再用ila抓取输出的数字信号检测波形是否正确。

2.2实验框图

  

        其中da和ad的时钟频率不超过其传输的最大速度即可(ad32MHz)(da125Mhz

        为什么要采用25mhz deg120的信号?

        由此图可得,ad的数据采样信号的时钟并不在输出数据的正中间,因此可能会出现采样的亚稳态,为调整ila采样时候的稳定,因此我们需要120°相位。

        为什么da模块需要180°时钟相位?

        若使用无相位的是时钟(即数据发送时钟),则其上升沿采样时恰巧是数据改变的时候,会出现亚稳态,若选择加入半个相位,会使得采样时钟再数据中心点。

2.3软件生成正弦波

        采用正点原子开发的软件可以生成正弦波数据,并可以选择位宽、深度、倍频。

        这里位宽是选择和芯片一样的位宽即可,adda芯片位宽为8;深度表示一个周期用多少个点来表示这个正弦波,点数越大正弦波越精确(类似于二分法)(注意rom的位宽深度应该与上位机一致);倍频,即可以提升正弦波频率(频率高容易失真)

        最后将生产的coe文件载入rom中就行。

三、代码实现

        3.1IP核配置

        本次实验需要配置锁相环(PLL)进行分频以及ROM模块提前载入正弦波的数据

        3.2数据发送模块        

        该模块需要读取rom中的数据(需要发送地址给rom),并发送给后面的da模块,顺带输出180°相位的驱动时钟(对原时钟取反即可)。

module       send_data(
    input                   clk     ,
    input                   rst     ,
    
    //rom
    output      reg [7:0]   rd_addr ,
    input           [7:0]   rd_data ,
    output                  rom_en ,
    
    //da
    
    output                  da_clk  ,
    output          [7:0]   da_data 
    
    
);
reg                 [2:0]  freq_cnt ; //降低波形频率计数器
parameter              FREQ    =   5;

assign         da_clk  =   ~clk     ;
assign         da_data =  rd_data   ;
assign         rom_en = 1'b1;

always @(posedge clk or negedge rst ) begin 
    if (!rst ) 
        freq_cnt <= 3'b0 ;
    else if (freq_cnt < FREQ )
        freq_cnt <= freq_cnt + 3'b1 ;
    else 
        freq_cnt <= 3'b0 ;
end
        


always @(posedge clk or negedge rst ) begin 
    if (!rst )  
        rd_addr <= 8'b0 ;
    else if ((freq_cnt == FREQ) &&(rd_addr < 8'd255 ))  
        rd_addr  <= rd_addr + 8'b1 ;    
    else if ((freq_cnt == FREQ) &&(rd_addr == 8'd255 ))  
        rd_addr <= 8'b0 ;
    else 
        rd_addr  <= rd_addr;
end        
        
        







endmodule

        在这个模块定义了一个计数器使得每计数6个才改变一次rom地址读取,说明我们降低原始正弦波频率到了六分之一。

        3.3顶层模块

        由于ad和da是模块并只需要输入数据即可进行工作,因此不需要对这两个模块进行驱动,只需要插好线即可。

module    ad_da_top(
    input                   sys_clk   ,
    input                   sys_rst   ,
//da
    output                  da_clk    ,
    output         [7:0] da_data   ,
//ad             
    input          [7:0]    ad_data   ,
    input                      ad_otr    ,
    output                   ad_clk   
);
wire           clk_50m;
wire           clk_25m;
wire           clk_25m_120deg;
wire           rom_en ;
wire           locked ;
wire  [7:0]    rd_addr;
wire  [7:0]    rd_data;
clk_wiz_0 u_clk_wiz_0
   (
    // Clock out ports
    .clk_out1(clk_50m),     // output clk_out1
    .clk_out2(ad_clk),     // output clk_out2 25m
    .clk_out3(clk_25m_120deg),     // output clk_out3
    // Status and control signals
    .locked(locked),       // output locked
   // Clock in ports
    .clk_in1(sys_clk)
    );    

blk_mem_gen_0  u_blk_mem_gen_0 (
  .clka(clk_50m),    // input wire clka
  .ena(rom_en),      // input wire ena
  .addra(rd_addr),  // input wire [7 : 0] addra
  .douta(rd_data)  // output wire [7 : 0] douta
);

send_data u_send_data(
        .clk      (  clk_50m          ),
        .rst      (  sys_rst          ), 
        .rd_addr  (  rd_addr          ),
        .rd_data  (  rd_data          ),
        .rom_en   (  rom_en          ), 
        .da_clk   (  da_clk          ),
        .da_data  (  da_data          )
);



ila_0 u_ila_0 (
	.clk(clk_25m_120deg), // input wire clk


	.probe0(ad_otr), // input wire [0:0]  probe0  
	.probe1(ad_data), // input wire [7:0]  probe1 
	.probe2(da_data), // input wire [7:0]  probe2 
	.probe3(rd_data) // input wire [7:0]  probe3
);





endmodule 

四、下载验证

        下载验证时候是没有任何数据的,因为ila调试频率应至少大于JATG下载频率的2.5倍,否则ila无法得到调试信息。设置方法如下:

        在下载后选择Xilinx tcf,在点击下方的properties可以看到PARAM选项,展开来可以看见可以设置频率,将其频率调整到满足2.5倍小于ila采样频率即可

项目背景1.1 AD转换 AD转换就是模数转换。顾名思义,就是把模拟信号转换成数字信号。主要包括积分型、逐次逼近型、并行比较型/串并行型、Σ-Δ调制型、电容阵列逐次比较型及压频变换型。 A/D转换器是用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号,也可以是压力、温度、湿度、位移、声音等非电信号。但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。 AD转换的技术指标,一般有如下几个: 1. 分辨率(Resolution) 指数字量变化一个最小量时模拟信号的变化量,定义为满刻度与2^n的比值。分辨率又称精度,通常以数字信号的位数来表示。 2. 转换速率(Conversion Rate)是指完成一次从模拟转换到数字的AD转换所需的时间的倒数。积分型AD的转换时间是毫秒级属低速AD,逐次比较型AD是微秒级属中速AD,全并行/串并行型AD可达到纳秒级。采样时间则是另外一个概念,是指两次转换的间隔。为了保证转换的正确完成,采样速率 (Sample Rate)必须小于或等于转换速率。因此有人习惯上将转换速率在数值上等同于采样速率也是可以接受的。常用单位是ksps和Msps,表 示每秒采样千/百万次(kilo / Million Samples per Second)。 3. 量化误差 (Quantizing Error) 由于AD的有限分辨率而引起的误差,即有限分辨率AD的阶梯状转移特性曲线与无限分辨率AD(理想AD)的转移特 性曲线(直线)之间的最大偏差。通常是1个或半个最小数字量的模拟变化量,表示为1LSB、1/2LSB。 4. 偏移误差(Offset Error) 输入信号为零时输出信号不为零的值,可外接电位器调至最小。 5. 满刻度误差(Full Scale Error) 满度输出时对应的输入信号与理想输入信号值之差。 6. 线性度(Linearity) 实际转换器的转移函数与理想直线的最大偏移,不包括以上三种误差。 其他指标还有:绝对精度(Absolute Accuracy) ,相对精度(Relative Accuracy),微分非线性,单调性和无错码,总谐波失真(Total Harmonic Distotortion缩写THD)和积分非线性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值