/**********************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范围±5V input I_ad_out_a, //串行A组通道采集输入,V1,V2,V3,V4 input I_ad_out_b, //串行B组通道采集输入, V5,V6,V7,V8 output O_card_power_en, //子卡电源使能
output HDMI_CLK_P, //HDMI时钟输出 P端 output HDMI_CLK_N, //HDMI时钟输出 N端 output [2:0] HDMI_TX_P, //HDMI数据输出 P端 output [2:0] HDMI_TX_N //HDMI数据输出 N端 );
assign O_card_power_en = 1'b1; //子卡上电
wire pclkx1,pclkx5,clk100M,locked; //MMCM/PLL时钟信号
//例化MMCM/PLL IP clk_wiz_1 clk_hdmi_pll_inst ( .clk_in1(I_sysclk_p), .reset(!rst_cnt[7]), .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 [23:0] rgb; //RGB颜色寄存器 assign vtc_clk = pclkx1;//像素时钟 assign vtc_rstn = locked;//VTC复位信号
//ad7606 ip相关信号 wire I_ad_clk,I_ad_rst,ad_cap_en; wire [63:0] 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 [15:0] ad_ch1 = ad_out_a[63:48];//ADC 通道1 wire [15:0] ad_ch2 = ad_out_a[47:32];//ADC 通道2 wire [15:0] ad_ch3 = ad_out_a[31:16];//ADC 通道3 wire [15:0] ad_ch4 = ad_out_a[15: 0];//ADC 通道4 wire [15:0] ad_ch5 = ad_out_b[63:48];//ADC 通道5 wire [15:0] ad_ch6 = ad_out_b[47:32];//ADC 通道6 wire [15:0] ad_ch7 = ad_out_b[31:16];//ADC 通道7 wire [15:0] ad_ch8 = ad_out_b[15: 0];//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 [7:0] rst_cnt=0; //复位计数器 wire rstn = rst_cnt[7];//用高位复位
always @(posedge I_sysclk_p)begin if (rst_cnt[7]) rst_cnt <= rst_cnt; else rst_cnt <= rst_cnt+1'b1; end
//例化HDMI 输出IP uihdmitx # ( .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*600 uivtc# ( .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 [7:0]test_data =0; //always @(posedge vtc_clk) // if(O_vtc2_de) // test_data[7:0] = test_data + 1'b1;
//例化波形显示器 IP,默认支持2个通道数据,可以扩展支持更多通道 uiwave uiwave_inst ( //波形1 .I_wave1_clk(I_ad_clk),//系统时钟输入 .I_wave1_data(ad_ch1[15:8]+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[15:8]+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 |