uisrc 发表于 2023-9-10 18:37:49

米联客FEP-DAQ001-16-200K-8 AD模块硬件使用手册

1 产品概述FEP-DAQ001-16-200K-8集成了一颗AD7606-8 高精度ADC芯片,AD760-8 是16 位8 通道同步采样模数数据采集系统(DAS)。AD7606 内置模拟输入箝位保护、二阶抗混叠滤波器、跟踪保持放大器、16 位电荷再分配逐次逼近型ADC、灵活的数字滤波器、2.5V 基准电压源、基准电压缓冲以及高速串行和并行接口。AD7606 采用5V单电源供电,可以处理±10V 和±5V 真双极性输入信号,同时所有通道均能以高达200 kSPS 的吞吐速率采样。输入箝位保护电路可以耐受最高达±16.5V 的电压。无论以何种采样频率工作,AD7606 的模拟输入阻抗均为1 MΩ。它采用单电源工作方式,具有片内滤波和高输入阻抗,因此无需驱动运算放大器和外部双极性电源。AD7606 抗混叠滤波器的3 dB 截止频率为22 kHz;当采样速率为200 ksps 时,它具有40 dB 抗混叠抑制特性。灵活的数字滤波器采用引脚驱动,可以改善信噪比(SNR),并降低3 dB 带宽。FEP-DAQ001-16-200K-8采用SPI通信,实现了同时8通道ADC同时采集。信号通过SMA接口引出,默认焊接4路SMA接口。2硬件参数概述
FEP-DAQ001-16-200K-8
ADC芯片AD7606
采样精度16bit
-3db带宽-5V~+5V 15KHZ -10V~+10V 23KHZ
IO电平1.8V或者3.3V可选(ad7606只支持3.3V通过电平芯片转换)
采样频率200KSPS
模拟通道8个
触发IO0个
输入电平-5V~+5V 或-10V~+10V
数据格式二进制补码(~32768 ~ +32767)
信噪比1KHZ(SNR)-5V~+5V 89db -10V~+10V 90db
无杂散动态范围170M(SFDR)-108db
功耗165MAd7606 100mW
占用IO数量10个GPIO





3功能概述
3.1 ADC功能框图AD7606芯片的关键结构图:1)、8路16bit ADC实际通过多路复用的方式实现的,内部真正只有1个16bitADC2)、支持并口传输和SPI串行传输3)、具有内部的2.5V基准,通常采用内部电压基准,可以省去一个外部基准。4)、还有一些比如BUSY、FRSTDATA、信号需要下面继续根据datasheet了解。3.2 ADC转换控制时序CONVST时序-转换之后读取CONVST时序-转换过程种读取
AD7606支持2种时序转换,由于我们采用的时串行SPI模式,本身SPI读取数据就会耽误很多时间,所以必须采用第二种工作时序,才能确保200Kbps的采样率。通过这个转换时序,我们需要把上图的时序种的所有信号作用搞清楚。1、RESET信号用于对AD7606芯片的复位,复位的高电平时间参数tRESET=50ns,复位和转换信号CONVSTA/ONVSTB的上升沿时间参数t7=25ns2、CONVSTA/ CONVSTB的低电平时间参数t2=40ns3、CONVSTA/ CONVSTB如果不是同步,那么他们之间的时间差不能超过t5=0.5ms,我们这里时同时的4、转换周期tCYCLE=5us5、BUSY信号为高电平代表数据正在转换,转换时间参数tCONV为最大4.15us6、CS信号和BUSY信号有一个时间参数t6不能大于25ns由于设计FPGA接口芯片程序,都是和时序相关联的,所以了解了以上时序参数后,我们FPGA代码设计就要能够满足这些参数指标。3.3 ADC SPI时序当数据完成转换后,CS为电平期间,每个时钟的上升沿完成数据的采样,这里有一个FRSTDATA的表中,代表每次转换的第一个数据,这里实际可以不用这个信号,因为每次CS之后的第一个上升沿时钟我们就是开始采样数据,没16次完成一路ADC的采集。对于AD7606具有8路ADC,DOUTA对于1~4路ADC通道,DOUTB对应5~8路ADC通道。而且ADC的2组4个通道可以一次性完成采集,也就是说16X4共计64个时钟上升沿完成4路ADC采集,DOUTA和DOUTB各4路。3.4 芯片接口定义4 数据模式设置4数据模式设置设置SEN 脚的工作电平,来设置ADS4225/ADS4229的工作模式
PAR/SER 脚电平模式RANG输入范围
0并口0-5V~+5V
1SPI串行1-10V~+10V



5 原理图5.1 3.3V版本支持IO电压使能上电,对电路进行保护FEP扩展接口定义5.1 1.8V版本具有上电使能功能,对硬件保护电平转换芯片完成3.3V到1.8V IO电平转换
6系统框图本方案种,把前面测试程序中的数据改为从ADC采集的数据7 波形绘制关于HDMI输出IP的部分这里不再介绍,VTC时序设计部分这里也不详细介绍。如果读者这些基础知识不清楚的,可以参考米联客入门级教学课程的教学资料。7.1 AD7606采集驱动AD7606支持并行采集和串行采集两种方式,我们这里使用串行模式,相比并行模式具有省IO的优势。


/*******************************AD7606 SPI串行采样*********************--以下是米联客设计的AD7606 SPI串行采样驱动程序--1.代码简洁,占用极少逻辑资源,代码结构清晰,逻辑设计严谨--2.AD7606可以工作于并行模式,和串行模式,串行模式可以使用更少的IO--3.AD7606最高可以工作于200K 8通道同时采样,默认就是工作于200K 采样,SPI_DIV 和T5US_DIV根据不同的系统时钟需要正确设置*********************************************************************/
`timescale 1ns / 1ns//仿真时间刻度/精度
module uispi7606#(parameter SPI_DIV   = 10'd5,//SPI时钟分频参数,需要产生20MHZ时钟parameter T5US_DIV= 10'd499 //AD7606采样周期设置,5us分频参数)(input         I_ad_clk,         //系统时钟输入input         I_ad_rst,         //系统复位输入input         I_ad_busy,      //ad7606 忙标志位output     O_ad_os,          //ad7606 过采样倍率选择,本驱动不使用output          O_ad_cs,          //ad7606 CS信号输出,低电平SPI数据线输出AD7606寄存器数据output reg      O_ad_sclk,      //ad7606 SCLK时钟输出output          O_ad_rst,         //ad7606 复位输出output          O_ad_convsta,   //ad7606 A组通道转换output          O_ad_convstb,   //ad7606 B组通道转换output          O_ad_range,       //ad7606 模拟输入范围,设置1范围:±10V,设置0范围±5Vinput         I_ad_out_a,       //串行A组通道采集输入,V1,V2,V3,V4input         I_ad_out_b,       //串行B组通道采集输入, V5,V6,V7,V8output reg ad_out_a,       //A组通道采集有效数据输出output reg ad_out_b,       //B组通道采集有效数据输出output ad_cap_en                  //采集完成使能);
assign O_ad_range = 1'b1;    //±10V真直流输入范围assign O_ad_os    = 3'b000;//无过采样
//ad复位时间高电平,复位时间最少50nsreg rst_cnt;assign O_ad_rst   = !rst_cnt;always@(posedge I_ad_clk)begin          if(I_ad_rst)      rst_cnt<= 24'd0;    else if(!rst_cnt)      rst_cnt<= rst_cnt + 1'b1;end      
//设置采样频率,AD7606为8通道可以工作于200Kbps采样率,因此采样周期为5usreg tcnt5us;wire cycle_end = (tcnt5us == T5US_DIV);always@ (posedge I_ad_clk)begin   if(O_ad_rst)         tcnt5us <= 10'd0;   else if(tcnt5us < T5US_DIV)         tcnt5us <= tcnt5us + 1'b1;   else         tcnt5us <= 10'd0;end
parameter SPI_DIV1    = SPI_DIV/2; //半周期分频reg clk_div = 10'd0;//分频计数器
//SPI 时钟分频,对于200K采样,设置20M时钟always@(posedge I_ad_clk)begin    if(clk_div < SPI_DIV)      clk_div <= clk_div + 1'b1;    else      clk_div <= 10'd0;end
//产生SPI时钟wire clk_en1 = (clk_div == SPI_DIV1);// 半周期使能,控制输出0wire clk_en2 = (clk_div == SPI_DIV);//半周期使能,控制输出1
always@(posedge I_ad_clk)begin   if(clk_en2) O_ad_sclk <= 1'b1; //输出高电平    else if(clk_en1) O_ad_sclk <= 1'b0; //输出高低平end
//AD转换状态机reg AD_S;reg ad_convst; //ADC转换控制信号,A组通道和B组通道采用同一通道//ADC工作于SPI模式,以及边读边转换模式,本次数据转换的同时,可以读出前一次转换的结果assign O_ad_cs = ~((AD_S == 2'd3)&&I_ad_busy);//当AD7606工作在串行模式,cs=0代表输出通过SPI数据总线,输出之前的采样数据assign O_ad_convsta = ad_convst; //ADC转换控制信号,A组通道和B组通道采用同一通道assign O_ad_convstb = ad_convst; //ADC转换控制信号,A组通道和B组通道采用同一通道
always @(posedge I_ad_clk)begin    if(O_ad_rst||I_ad_rst)begin      ad_convst <= 1'b1;          AD_S <= 2'd0;    end    else begin      case(AD_S)      2'd0:if(clk_en2)begin    //clk_en2,控制SCLK输出1,因此这里相当于SCLK上升沿             ad_convst <= 1'b0;//设置ad_convst=0             AD_S <= 2'd1;//下一状态      end                2'd1:if(clk_en2)begin //延迟50ns,ad_convst低电平至少25ns,对于SCLK时钟是20MHZ,所以这里ad_convst低电平是50ns             ad_convst <= 1'b1;//ad_convst 低电平50ns后拉高为高电平             AD_S <= 2'd2;//下一状态      end      2'd2:if(clk_en2&&I_ad_busy)//延迟50ns,并且等待busy高,只要ADC正常工作,busy必然为高,说明ADC处于采样转换下             AD_S <= 2'd3;                  2'd3:if(cycle_end)//ADC转换时间最大4.2us,5us周期结束,代表本次8通道完全采集结束             AD_S <= 2'd0; //回到初始状态,进行下一次采样      endcase       end            end
//SPI采样reg nbits; // bits计数器,用于计数完成了从AD7606 SPI总线读出的bits数wire ad_cap_en_r1 = (nbits==8'd64); //数据同步输出使能regad_cap_en_r2 = 1'b0; //数据同步输出使能寄存一次assign ad_cap_en = ({ad_cap_en_r1,ad_cap_en_r2}==2'b10);//高电平输出系统时钟的一个周期
always@(posedge I_ad_clk) begin //寄存一次ad_cap_en_r1    ad_cap_en_r2 <= ad_cap_en_r1;end
//当CS信号为低电平,每个SCL的下降沿输出采样数据,每组通道采样64bitswire cap_en= (!O_ad_cs)&&clk_en1&&(nbits<8'd64);
//ADC 串并转换模块always@(posedge I_ad_clk) begin    if(O_ad_rst) begin //ADC复位期间重置相关寄存器      ad_out_a <= 64'd0;      ad_out_b <= 64'd0;      nbits    <= 8'd0;    end    else if(O_ad_cs)begin //高电平,重置nbits      nbits   <= 8'd0;                          end    else if(cap_en)begin//当CS信号为低电平,每个SCL的下降沿采样数据,每组通道采样64bits      nbits    <= nbits + 1'b1; //      ad_out_a <= {ad_out_a,I_ad_out_a};//保存A组通道数据,V1~V4,每个通道16bits      ad_out_b <= {ad_out_b,I_ad_out_b};//保存B组通道数据,V5~V8,每个通道16bits    end                                                                                                                                    end
endmodule



7.2 顶层模块调用程序
/**********************AD7606 ADC采集波形显示**********************************************************************************************/
`timescale 1ns / 1ns//仿真时间刻度/精度
module ad7606_top(input         I_sysclk_p,         //系统时钟输入input         I_ad_busy,      //ad7606 忙标志位output          O_ad_cs,          //ad7606 CS信号输出,低电平SPI数据线输出AD7606寄存器数据output          O_ad_sclk,      //ad7606 SCLK时钟输出output          O_ad_rst,         //ad7606 复位输出output          O_ad_convsta,   //ad7606 A组通道转换output          O_ad_convstb,   //ad7606 B组通道转换output          O_ad_range,       //ad7606 模拟输入范围,设置1范围:±10V,设置0范围±5Vinput         I_ad_out_a,       //串行A组通道采集输入,V1,V2,V3,V4input         I_ad_out_b,       //串行B组通道采集输入, V5,V6,V7,V8output          O_card_power_en,    //子卡电源使能
output          HDMI_CLK_P,       //HDMI时钟输出 P端output          HDMI_CLK_N,       //HDMI时钟输出 N端output     HDMI_TX_P,      //HDMI数据输出 P端output     HDMI_TX_N         //HDMI数据输出 N端);
assign O_card_power_en = 1'b1; //子卡上电
wire pclkx1,pclkx5,clk100M,locked; //MMCM/PLL时钟信号
//例化MMCM/PLL IPclk_wiz_1 clk_hdmi_pll_inst(.clk_in1(I_sysclk_p),.reset(!rst_cnt),.locked(locked),.clk_out1(pclkx1),//像素时钟.clk_out2(pclkx5),//HDMI输出5倍像素时钟.clk_out3(clk100M)//100M时钟,给ADC采集用);
wire vtc_rstn,vtc_clk,vtc_vs,vtc_hs,vtc_de,vtc2_de;wire rgb; //RGB颜色寄存器assign vtc_clk= pclkx1;//像素时钟assign vtc_rstn = locked;//VTC复位信号
//ad7606 ip相关信号wire I_ad_clk,I_ad_rst,ad_cap_en;wire ad_out_a,ad_out_b;assign I_ad_clk      = clk100M; //ADC时钟assign I_ad_rst      = !locked; //ADC IP内部代码复位
uispi7606#(.SPI_DIV(10'd5),//SPI时钟分频参数,需要产生20MHZ时钟.T5US_DIV(10'd999)//AD7606采样周期设置,5us分频参数)uispi7606_inst(.I_ad_clk(I_ad_clk),    //系统时钟输入            .I_ad_rst(I_ad_rst),    //系统复位输入.I_ad_busy(I_ad_busy),//ad7606 忙标志位            .O_ad_cs(O_ad_cs),      //ad7606 CS信号输出,低电平SPI数据线输出AD7606寄存器数据.O_ad_sclk(O_ad_sclk),//ad7606 SCLK时钟输出    .O_ad_rst(O_ad_rst),    //ad7606 复位输出      .O_ad_convsta(O_ad_convsta), //ad7606 A组通道转换    .O_ad_convstb(O_ad_convstb), //ad7606 B组通道转换.O_ad_range(O_ad_range),   //ad7606 模拟输入范围,设置1范围:±10V,设置0范围±5V.I_ad_out_a(I_ad_out_a),   //串行A组通道采集输入,V1,V2,V3,V4.I_ad_out_b(I_ad_out_b),   //串行B组通道采集输入, V5,V6,V7,V8.ad_out_a(ad_out_a),         //A组通道采集有效数据输出.ad_out_b(ad_out_b),         //B组通道采集有效数据输出.ad_cap_en(ad_cap_en)      //采集完成使能 );
wire ad_ch1 = ad_out_a;//ADC 通道1wire ad_ch2 = ad_out_a;//ADC 通道2wire ad_ch3 = ad_out_a;//ADC 通道3wire ad_ch4 = ad_out_a;//ADC 通道4wire ad_ch5 = ad_out_b;//ADC 通道5wire ad_ch6 = ad_out_b;//ADC 通道6wire ad_ch7 = ad_out_b;//ADC 通道7wire ad_ch8 = ad_out_b;//ADC 通道8
//例化 ILA IP 用于在线逻辑分仪观察ADC采样值ila_0 ila_debug(.clk(I_ad_clk), //系统时钟.probe0(ad_cap_en), //AD采集数据使能,ILA中使用capture功能,可以观察到更多有效数据.probe1(ad_ch1),//ADC 通道1.probe2(ad_ch2),//ADC 通道2.probe3(ad_ch3),//ADC 通道3.probe4(ad_ch4),//ADC 通道4.probe5(ad_ch5),//ADC 通道5.probe6(ad_ch6),//ADC 通道6.probe7(ad_ch7),//ADC 通道7.probe8(ad_ch8) //ADC 通道8                      );
//上电延迟复位reg     rst_cnt=0; //复位计数器wirerstn = rst_cnt;//用高位复位
always @(posedge I_sysclk_p)begin    if (rst_cnt)      rst_cnt <=rst_cnt;    else      rst_cnt <= rst_cnt+1'b1;end
//例化HDMI 输出IPuihdmitx #(.FAMILY("7FAMILY")//选择芯片所支持的系列"7FAMILY" "UFAMILY"            )uihdmitx_inst(.I_RSTn(locked),//复位.I_HS(vtc_hs),//hs信号.I_VS(vtc_vs),//vs信号.I_VDE(vtc_de),//de信号.I_RGB({rgb}),//RGB数据.I_PCLKX1(pclkx1),//像素时钟.I_PCLKX2_5(1'b0),//2.5倍像素时钟,只有UFAMILY需要.I_PCLKX5(pclkx5),//5倍像素时钟.TMDS_TX_CLK_P(HDMI_CLK_P),//HDMI时钟输出P端.TMDS_TX_CLK_N(HDMI_CLK_N),//HDMI时钟输出N端.TMDS_TX_P(HDMI_TX_P),//HDMI输出数据P端.TMDS_TX_N(HDMI_TX_N)//HDMI输出数据N端);
//此VTC IP 用于产生绘制波形的有效区域,波形绘制区域大小未1024*600uivtc#(.H_ActiveSize(1280),          //视频时间参数,行视频信号,一行有效(需要显示的部分)像素所占的时钟数,一个时钟对应一个有效像素.H_FrameSize(1280+88+44+239), //视频时间参数,行视频信号,一行视频信号总计占用的时钟数.H_SyncStart(1280+88),      //视频时间参数,行同步开始,即多少时钟数后开始产生行同步信号.H_SyncEnd(1280+88+44),       //视频时间参数,行同步结束,即多少时钟数后停止产生行同步信号,之后就是行有效数据部分.V_ActiveSize(720),         //视频时间参数,场视频信号,一帧图像所占用的有效(需要显示的部分)行数量,通常说的视频分辨率即H_ActiveSize*V_ActiveSize.V_FrameSize(720+4+5+28),   //视频时间参数,场视频信号,一帧视频信号总计占用的行数量.V_SyncStart(720+4),          //视频时间参数,场同步开始,即多少行数后开始产生场同步信号.V_SyncEnd (720+4+5),         //视频时间参数,场同步结束,即多少场数后停止产生场同步信号,之后就是场有效数据部分.H2_ActiveSize(1024),         //波形绘制区域行像素大小      .V2_ActiveSize(256)         //波形绘制区域场像素大小)uivtc_inst(.I_vtc_clk(vtc_clk),         //系统时钟.I_vtc_rstn(vtc_rstn),       //系统复位.vtc2_offset_x(128),         //X坐标相对屏幕的原始坐标的偏移.vtc2_offset_y(200),         //Y坐标相对屏幕的原始坐标的偏移.O_vtc_vs(vtc_vs),//场同步输出.O_vtc_hs(vtc_hs),//行同步输出.O_vtc_de(vtc_de),//视频数据有效.O_vtc2_de(vtc2_de)//绘制波形显示区域的有效区域);
//测试数据产生,通过test_data产生测试数据,可以用于测试波形显示器的基本功能测试//reg test_data =0;//always @(posedge vtc_clk)//if(O_vtc2_de)//       test_data = test_data + 1'b1;
//例化波形显示器 IP,默认支持2个通道数据,可以扩展支持更多通道uiwave uiwave_inst(//波形1.I_wave1_clk(I_ad_clk),//系统时钟输入.I_wave1_data(ad_ch1+8'h80),//ADC只显示高8bits 数据,其中8'h80是对有符号的ADC的计算偏移,把负数坐标转为对应的整数坐标.I_wave1_data_de(ad_cap_en),//ADC数据有效信号
//波形2.I_wave2_clk(I_ad_clk),//系统时钟输入.I_wave2_data(ad_ch2+8'h80),//ADC只显示高8bits 数据,其中8'h80是对有符号的ADC的计算偏移,把负数坐标转为对应的整数坐标.I_wave2_data_de(ad_cap_en),//ADC数据有效信号
.I_vtc_rstn(vtc_rstn),//时序发生复位.I_vtc_clk (vtc_clk), //像素时钟.I_vtc_vs(vtc_vs),//场同步输出.I_vtc_de(vtc2_de),//同步,绘制波形显示区域的有效区域.O_vtc_rgb (rgb)//同步RGB数据 绘制数据输出
);
endmodule



7.3 设置画中画区域7.3.1 显示区域时序显示器上的图像,是从液晶屏的左上角,一个像素点一个像素点绘制,当一行所有绘制完成,进行下一行的绘制。利用肉眼的视觉暂留原理,一般1秒显示25帧以上,我们就能看到视频是动态的。本方案中,我们绘制的波形曲线只需要显示波形的数据点,比如对于1920*1080的显示区域,我们只要绘制1920点波形点,即可。为了方便我们理解,我们定义HS方向是X坐标,VS方向是Y坐标。比如我们这里设计的是显示1024个波形数据点,在绘制每一行图像的时候,比对每一个数据和VS的Y坐标是否相等,如果相等就绘制这个波形点。这样我们就能完成1024个波形点在整个屏幕的显示。7.3.2 画中画的vtc视频时序模块设计我们这里显示的波形数据点是1024,高度是256,因此我们需要实现一个画中画的功能。栅格绘制,以及波形数据点会以画中画的有效区域进行显示。支持画中画的uivtc.v源码

/*************uivtc(video timing controller)视频时序控制器*************--版本号1.1--以下是米联客设计的uivtc(video timing controller)视频时序控制器--1.代码简洁,占用极少逻辑资源,代码结构清晰,逻辑设计严谨--2.使用方便,只需要输入6个参数既可以实现对不同视频分辨率时序的控制--3.该视频时序控制,一个时钟对应一个像素--4.通常我们说的像素,比如1080P代表了1920*1080是指视频的有效显示区域,实际的视频还包含不能显示的区域,比如行同步,场同步时间--5.通常我们说的行视频信号,也称之为视频的水平像素信号;场视频信号,也称之为视频的垂直像素信号;--6.针对波形绘制,增加画中画绘制区域功能*********************************************************************/
`timescale 1ns / 1ns //仿真时间刻度/精度
module uivtc#(parameter H_ActiveSize   =   1980,               //视频时间参数,行视频信号,一行有效(需要显示的部分)像素所占的时钟数,一个时钟对应一个有效像素parameter H_FrameSize    =   1920+88+44+148,   //视频时间参数,行视频信号,一行视频信号总计占用的时钟数parameter H_SyncStart    =   1920+88,            //视频时间参数,行同步开始,即多少时钟数后开始产生行同步信号parameter H_SyncEnd      =   1920+88+44,         //视频时间参数,行同步结束,即多少时钟数后停止产生行同步信号,之后就是行有效数据部分
parameter V_ActiveSize   =   1080,               //视频时间参数,场视频信号,一帧图像所占用的有效(需要显示的部分)行数量,通常说的视频分辨率即H_ActiveSize*V_ActiveSizeparameter V_FrameSize    =   1080+4+5+36,      //视频时间参数,场视频信号,一帧视频信号总计占用的行数量parameter V_SyncStart    =   1080+4,             //视频时间参数,场同步开始,即多少行数后开始产生场同步信号parameter V_SyncEnd      =   1080+4+5,         //视频时间参数,场同步结束,即多少场数后停止产生场同步信号,之后就是场有效数据部分
parameter H2_ActiveSize=   640,parameter V2_ActiveSize=   480)(input         I_vtc_rstn,//系统复位input         I_vtc_clk, //系统时钟outputreg   O_vtc_vs,//场同步输出outputreg   O_vtc_hs,//行同步输出outputreg   O_vtc_de,//视频数据有效input   I_vtc2_offset_x,//相对屏幕原点(左上角)X方向偏移input   I_vtc2_offset_y,//相对屏幕原点(左上角)Y方向偏移outputreg   O_vtc2_de       //绘制有效的显示区域);
reg hcnt = 12'd0;    //行像素计数器,寄存器reg vcnt = 12'd0;    //场像素计数器,寄存器reg rst_cnt = 3'd0;//复位计数器,寄存器wire rst_sync = rst_cnt; //同步复位
always @(posedge I_vtc_clk or negedge I_vtc_rstn)begin //通过计数器产生同步复位    if(I_vtc_rstn == 1'b0)      rst_cnt <= 3'd0;    else if(rst_cnt == 1'b0)      rst_cnt <= rst_cnt + 1'b1;end   
//行像素计数器always @(posedge I_vtc_clk)begin    if(rst_sync == 1'b0) //复位      hcnt <= 12'd0;    else if(hcnt != (H_FrameSize - 1'b1))//计数范围从0 ~ H_FrameSize-1      hcnt <= hcnt + 1'b1;    else      hcnt <= 12'd0;end      
//场计数器,用于计数已经完成的行视频信号always @(posedge I_vtc_clk)begin    if(rst_sync == 1'b0)      vcnt <= 12'd0;    else if(hcnt == (H_ActiveSize- 1'b1)) begin//是否一行像素结束         vcnt <= (vcnt == (V_FrameSize - 1'b1)) ? 12'd0 : vcnt + 1'b1;//每一行计数,场计数器加1,计数范围0~V_FrameSize - 1    endend
wire hs_valid=hcnt < H_ActiveSize; //行信号有效像素部分wire vs_valid=vcnt < V_ActiveSize; //场信号有效像素部分wire vtc_hs   =(hcnt >= H_SyncStart && hcnt < H_SyncEnd);//产生hs,行同步信号wire vtc_vs    = (vcnt > V_SyncStart && vcnt <= V_SyncEnd);//产生vs,场同步信号      wire vtc_de   =hs_valid && vs_valid;//只有当行像素有效和场像素同时有效,视频数据部分才是有效
//画中画,波形绘制区域wire hs2_valid=(hcnt>=I_vtc2_offset_x)&& (hcnt<(I_vtc2_offset_x+H2_ActiveSize)); //画中画,波形绘制区域HS有效信号wire vs2_valid=(vcnt>=I_vtc2_offset_y)&& (vcnt<(I_vtc2_offset_y+V2_ActiveSize)); //画中画,波形绘制区域VS有效信号wire vtc2_de    =hs2_valid && vs2_valid; //画中画,数据有效绘制信号
//完一次寄存打拍输出,有利于改善时序,尤其对于高分辨率,高速的信号,打拍可以改善内部时序,以运行于更高速度always @(posedge I_vtc_clk)begin    if(rst_sync == 1'b0)begin      O_vtc_vs <= 1'b0;      O_vtc_hs <= 1'b0;      O_vtc_de <= 1'b0;      O_vtc2_de <= 1'b0;    end    else begin      O_vtc_vs <= vtc_vs; //场同步信号打拍输出      O_vtc_hs <= vtc_hs; //行同步信号打拍输出      O_vtc_de <= vtc_de; //视频有效信号打拍输出      O_vtc2_de <= vtc2_de; //画中画,数据有效绘制信号    endend
endmodule


7.3.3 栅格绘制波形绘制uiwave.v
`timescale 1ns / 1nsmodule uiwave(
//波形1input         I_wave1_clk,      //波形1时钟input I_wave1_data,   //波形1数据input         I_wave1_data_de,//波形1数据有效
//波形2input         I_wave2_clk,      //波形2时钟input I_wave2_data,   //波形2数据input         I_wave2_data_de,//波形2数据有效
//VTC时序输入input         I_vtc_rstn,       //时序复位输入input         I_vtc_clk,      //时序时钟输入input         I_vtc_vs,         //VS-帧同步,信号同步输入input         I_vtc_de,         //de有效区域,信号同步输入
//同步时序输出,以及像素输出output      O_vtc_vs,         //帧同步输出output      O_vtc_de,         //de信号同步后输出output reg O_vtc_rgb   //同步输出显示颜色);
reg vtc_vs_r; //vs寄存器reg vtc_de_r; //de寄存器reg vcnt,hcnt;//vcnt计数有多少行,hcnt计数有多少列
reg    grid_de; //栅格绘制使能
assign O_vtc_vs = vtc_vs_r; //同步后输出O_vtc_vsassign O_vtc_de = vtc_de_r; //同步后输出O_vtc_de
//寄存,同步always @(posedge I_vtc_clk)begin    vtc_vs_r <= {vtc_vs_r,I_vtc_vs};    vtc_de_r <= {vtc_de_r,I_vtc_de};end
//以下hcnt用于计数列,vcnt用于计数行数
//hcnt像素计数器always @(posedge I_vtc_clk)begin    if(hcnt == 1023)      hcnt <= 12'd0;    else if(vtc_de_r && (hcnt != 1023)) //hcnt计数列,共计1024个像素      hcnt <= hcnt + 1'b1;end
//vcnt计数有多少行always @(posedge I_vtc_clk)begin    if(vtc_vs_r == 2'b01)      vcnt <= 8'd0;    else if((vtc_de_r == 2'b10) && (vcnt != 255)) //以de信号用于计数行,共计256行      vcnt <= vcnt + 1'b1;end
//栅格绘制always @(posedge I_vtc_clk)begin    if((hcnt==7&&(vcnt==63||vcnt == 0))||((hcnt==63||hcnt==0)&&vcnt==7)||(vcnt == 0 && hcnt==0))      grid_de <= O_vtc_de;    else      grid_de <= 1'b0;end
//1--绘制波形曲线1,绿色点//2--绘制波形曲线2,黄色点//3--绘制栅格虚线,白色点//4--绘制背景色,黑色always @(posedge I_vtc_clk)begin    casex({grid_de,wave2_pixel_en,wave1_pixel_en})            3'bxx1:               O_vtc_rgb <= {8'h00,8'hff,8'h00};   //wave1信号显示像素颜色            3'bx10:               O_vtc_rgb <= {8'hff,8'hff,8'h00};   //wave2信号显示像素颜色            3'b100:               O_vtc_rgb <= {8'h96,8'h96,8'h96};   //网格显示像素为白色点      default:               O_vtc_rgb <= {8'h00,8'h00,8'h00};   //黑色背景    endcaseend
//波形缓存1,以及波形绘制像素点输出使能uiwave_buf uiwave1_buf_inst(.I_wave_clk    (I_wave1_clk),   //写数据输入时钟,和ADC采集时钟同步.I_wave_data   (I_wave1_data),    //写数据.I_wave_data_de(I_wave1_data_de), //写数据有效
.I_vtc_clk      (I_vtc_clk),      //VTC时序发生器时钟输入.I_vtc_rstn   (I_vtc_rstn),   //VTC时序发生器复位.I_vtc_de_r   (vtc_de_r),    //VTC时序发生器的de有效区域输入.I_vtc_vs       (I_vtc_vs),      //VTC时序发生器的VS同步信号输入.I_vtc_vcnt   (vcnt),         //vtc的数据偏移,主要对有符号数据进行调整.O_pixel_en   (wave1_pixel_en)//输出输出使能);
//波形缓存2,以及波形绘制像素点输出使能uiwave_buf uiwave2_buf_inst(.I_wave_clk      (I_wave2_clk),   //写数据输入时钟,和ADC采集时钟同步.I_wave_data   (I_wave2_data),    //写数据.I_wave_data_de(I_wave2_data_de), //写数据有效
.I_vtc_clk       (I_vtc_clk),       //VTC时序发生器时钟输入.I_vtc_rstn      (I_vtc_rstn),      //VTC时序发生器复位.I_vtc_de_r      (vtc_de_r),   //VTC时序发生器的de有效区域输入.I_vtc_vs      (I_vtc_vs),       //VTC时序发生器的VS同步信号输入.I_vtc_vcnt      (vcnt),            //vtc的数据偏移,主要对有符号数据进行调整.O_pixel_en      (wave2_pixel_en)   //输出输出使能);
endmodule


7.3.4 波形点缓存uiwave_buf.v通过BRAM缓存ADC数据
/*************uiwave_buf简易波形绘制驱动******************************--版本号1.0--1.代码简洁,占用极少逻辑资源,代码结构清晰,逻辑设计严谨--2.使用方便,只需要输入ADC的值,就能完成波形绘制--3.占用资源少,波形输入8bits ADC值,存储到BLOCK RAM 只需要1048*8bit 大小的BRAM,即可完成1通道的波形存储--4.乒乓绘制,当绘制一个波形的时候,另外个波形存储到另外一段地址空间--5.绘制过程中,每一行数据都读出和Y坐标匹配,如果匹配成功,使能O_pixel_en绘制这个数据点*********************************************************************/
`timescale 1ns / 1ns //仿真时间刻度/精度
module uiwave_buf(input   I_wave_clk,    //写数据输入时钟,和ADC采集时钟同步input I_wave_data,   //写数据input         I_wave_data_de,//写数据有效
input         I_vtc_clk,   //VTC时序发生器时钟输入input         I_vtc_rstn,    //VTC时序发生器复位input         I_vtc_vs,      //VTC时序发生器的VS同步信号输入input         I_vtc_de_r,    //VTC时序发生器的de有效区域输入input I_vtc_vcnt,    //vtc的数据偏移,主要对有符号数据进行调整output      O_pixel_en   //输出输出使能);
//BRAM 简单双口BRAMreg addra = 0;//BRAM 通道A地址    //reg         ena   = 0;//BRAM 通道A使能reg         wea   = 0;//BRAM 通道A写使能reg addrb = 0;//BRAM 通道B地址reg         enb   = 0;//BRAM 通道B读使能reg WR_S,RD_S;//写状态机,读状态机reg         buf_flag;//buf_flag用于乒乓地址缓存切换reg         addr0_en;//用于设置写第一个数据相对地址0
wire wave_data;//写波形数据到BRAMreg async_vtc_vs =0; //同步信号
always @(posedge I_wave_clk)begin //对异步I_vtc_vs采样    async_vtc_vs <= {async_vtc_vs,I_vtc_vs};end
//绘制波形数据点使能,绘制原理://当匹配到存储的ADC数据和正在扫描的Y坐标值一致就输出,每个X坐标方向绘制1个波形点assign   O_pixel_en= I_vtc_de_r&(I_vtc_vcnt == wave_data);
//写BRAM 状态机always @(posedge I_wave_clk or negedge I_vtc_rstn)begin    if(I_vtc_rstn == 1'b0)begin //复位重置所有寄存器       addra      <= 10'd0;       addr0_en   <= 1'b1;       wea      <= 1'b0;       buf_flag   <= 1'b0;       WR_S   <= 1'd0;    end    else begin      case(WR_S) //写状态机      0:begin      if(I_wave_data_de)begin //有效波形数据点               if(addra == 1023)begin //1024个数据写完               wea      <= 1'b0; //停止写               addra    <= 0;    //相对地址设置0               addr0_en <= 1'b1;               WR_S   <= 1'd1;//进入状态机1               end               else begin //写入1024个数据               wea      <= 1'b1; //写使能               addr0_en <= 1'b0;               addra    <= (addr0_en == 1'b0) ? (addra + 1'b1) : 0;//相对地址递增               end            end            else begin            wea <= 1'b0;            end      end      1:begin //等待VTC时序同步            if(async_vtc_vs == 2'b10)begin//当数据同步后,准备下一次写               WR_S   <= 1'd0; //回到状态0               buf_flag <= ~buf_flag;//乒乓地址切换            end      end      default:WR_S   <= 2'd0;      endcase   endend
//读BRAM 状态机always @(posedge I_vtc_clk or negedge I_vtc_rstn)begin    if(I_vtc_rstn == 1'b0)begin//复位重置所有寄存器       addrb   <= 10'd0;       RD_S    <= 1'd0;    end    else begin      case(RD_S)      0:begin          if(I_vtc_de_r)begin //I_vtc_de_r代表了有效绘制区域               if(addrb == 1023)begin //1024个数据读完               addrb <= 0;    //相对地址设置0               RD_S<= 1'd1; //进入状态1               end               else //没一样都会扫描所有的ADC数据               addrb   <= addrb + 1'b1;//相对地址递增            end      end    1:begin          if(I_vtc_de_r == 0) //等待de变为0                RD_S <= 0; //回到状态0重新扫描
      end      default:RD_S   <= 1'd0;      endcase   endend
wave_ram buf_inst(.dina(I_wave_data), //写入波形数据.addra({buf_flag,addra}), //写地址,其中addra是相对地址,buf_flag是地址高位,用于读写的乒乓切换.wea(wea), //写使能.clka(I_wave_clk),//写时钟
.doutb(wave_data), //读出的波形数据.addrb({~buf_flag,addrb}), //写地址,其中addrb是相对地址,buf_flag是地址高位,用于读写的乒乓切换.clkb(I_vtc_clk)//读时钟);
endmodule



7.4 测试结果7.4.1 硬件接线以MLK-F6-7015为演示板卡,其他板卡类似设置波形发生器产生测试波形7.4.2 测试结果逻辑分析仪采集的结果

附录1:FEP卡命名规则(MLK-NV2023版本)1 FEP-DAQ模数转换类系列命名模拟数字采集,数模转换模块命名规则FEP:FEP系列DAQ:模数转换系列Num:编号Bit:采样位宽SPS:采样率Channels:支持的采样速率2 FEP-AUD音频类系列命名音频模块命名FEP:FEP系列AUD:音频系列Num:编号Bit:采样位宽SPS:采样率Channels:支持的采样速率3 FEP-COM通信类系列命名FEP:FEP系列COM:通用通信类模块或者IO模块Num:编号Class1:类型,预留Class2:类型,预留4 FEP-LAN通信类系列命名FEP:FEP系列LAN:以太网通信类Num:编号Class1:类型,预留Class2:类型,预留5 FEP-VID通信类系列命名FEP:FEP系列VID:视频类Num:编号Class1:类型,预留Class2:类型,预留6 FEP-CAM摄像头类FEP:FEP系列CAM:摄像头类Num:编号Class1:类型,预留Class2:类型,预留7 FEP-MEM存储类FEP:FEP系列MEM:存储类Num:编号Class1:类型,预留Class2:类型,预留附录2:常见问题1 联系方式技术交流群网址: https://www.uisrc.com/f-380.html查看最新可以加入的QQ群
技术微信:18951232035技术电话:18951232035
官方微信公众号(新微信公众号):2 售后1、7天无理由退货(人为原因除外)2、质保期限:本司产品自快递签收之日起,提供一年质保服务(主芯片,比如FPGA 或者CPU等除外)。3、维修换货,需提供淘宝订单编号或合同编号,联系销售/技术支持安排退回事宜。售后维修请登录工单系统:https://www.uisrc.com/plugin.php?id=x7ree_service4、以下情形不属于质保范畴。A:由于用户使用不当造成板子的损坏:比如电压过高造成的开发板短路,自行焊接造成的焊盘脱落、铜线起皮 等B:用户日常维护不当造成板子的损坏:比如放置不当导致线路板腐蚀、基板出现裂纹等5、质保范畴外(上方第4条)及质保期限以外的产品,本司提供有偿维修服务。维修仅收取器件材料成本,往返运 费全部由客户承担。6、寄回地址,登录网页获取最新的售后地址:https://www.uisrc.com/t-1982.html3 销售天猫米联客旗舰店:https://milianke.tmall.com京东米联客旗舰店:https://milianke.jd.com/FPGA|SOC生态店:https://milianke.taobao.com
销售电话:18921033576
常州溧阳总部:常州溧阳市中关村吴潭渡路雅创高科制造谷 10-1幢楼4 在线视频https://www.uisrc.com/video.html5 资源下载https://www.uisrc.com/download.html6 软件或其他下载https://www.uisrc.com/f-download.html
页: [1]
查看完整版本: 米联客FEP-DAQ001-16-200K-8 AD模块硬件使用手册