ad9248的最高時鐘頻率65mhz,采用cmos3.3v電壓的并行io接口,做成電子模塊后一般為雙通道adc,有兩個對外輸出時鐘cha_clk與chb_clk,一個并行輸入端口,14分辨率的ddr_data,其模塊邏輯如下,首先向adc發送一對差分時鐘作為cha_clk和chb_clk,然后adc返回給fpga一個雙沿數據ddr_data,通過iddr原語進行數據解析并將解析后的數據作為cha_data和chb_data輸出,同時處理解析后數據的時鐘為user_clk,而差分時鐘由ad_clk產生。cha_over和chb_over表示接收到的外部電壓是否超過量程+-5v。同時參數代表單極性輸出還是雙極性輸出。
MMCM IP配置如下,需要注意user_clk與ad_clk相位差90
module ad9248_driver#(parameter UNIPOLAR = 1
)(input i_ad_clk50m ,input i_user_clk50m ,input [13:0] i_ddr_data ,input i_cha_over ,input i_chb_over ,output o_cha_clk ,output o_chb_clk ,output reg [13:0] o_cha_data ,output reg [13:0] o_chb_data );assign o_cha_clk = i_ad_clk50m ;assign o_chb_clk = !i_ad_clk50m;wire [13:0] w_cha_data ;wire [13:0] w_chb_data ;//超量程則將前一刻輸出作為有效值 always@(posedge i_user_clk50m) begino_cha_data <= w_cha_data;o_chb_data <= w_chb_data;endgenvar i;generatefor(i = 0; i < 14; i = i + 1) beginIDDR #(.DDR_CLK_EDGE ("SAME_EDGE_PIPELINED" ), .INIT_Q1 (1'b0 ), .INIT_Q2 (1'b0 ), .SRTYPE ("SYNC" ) ) IDDR_inst (.Q1 (w_cha_data[i] ), // 上升沿數據.Q2 (w_chb_data[i] ), // 下降沿數據.C (i_ad_clk50m ), // 時鐘輸入.CE (1'b1 ), // 時鐘使能.D (i_ddr_data[i] ), // 輸入數據.R (1'b0 ), // 復位(可選).S (1'b0 ) // 置位(可選));endendgenerate reg [15:0] r_cnt ;always@(posedge i_user_clk50m) beginif(r_cnt < 1)r_cnt <= r_cnt + 1;elser_cnt <= 0;endreg r_vld ;always@(posedge i_user_clk50m) beginif(r_cnt == 1)r_vld <= 1;elser_vld <= 0;endila_0 your_instance_name (.clk(i_user_clk50m), // input wire clk.probe0(i_cha_over), // input wire [0:0] probe0 .probe1(i_chb_over), // input wire [0:0] probe1 .probe2(o_cha_data), // input wire [13:0] probe2 .probe3(o_chb_data), // input wire [13:0] probe3.probe4(r_vld ) // input wire [0:0] probe4
);endmodule
測試用的頂層文件
module ad_sample(input i_clk50m ,input i_rst_n ,input [13:0] i_ddr_data ,input i_cha_over ,input i_chb_over ,output o_cha_clk ,output o_chb_clk );wire w_ad_clk ;wire w_usr_clk ;clk_wiz_0
mmcm(.clk_out1 (w_ad_clk ), .clk_out2 (w_usr_clk ), .resetn (i_rst_n ), // input resetn.locked (), // output locked.clk_in1 (i_clk50m )
); wire [13:0] w_cha_data ;wire [13:0] w_chb_data ;ad9248_driver
ad9248_driver_u(.i_ad_clk50m (w_ad_clk ),.i_user_clk50m (w_usr_clk ),.i_ddr_data (i_ddr_data ),.i_cha_over (i_cha_over ),.i_chb_over (i_chb_over ),.o_cha_clk (o_cha_clk ),.o_chb_clk (o_chb_clk ),.o_cha_data (w_cha_data ),.o_chb_data (w_chb_data )
);endmodule