有了上两篇博文的铺垫,双通道模式以及四通道模式,单通道模式也就很容易理解了,并且我已经想好了下一篇博文要写什么了。
直接看框架图吧:
直接说重点,任意一个输入端口输入的模拟信号同时进入ADC芯片的四个核(也可以理解为4个通道),这四个核的时钟输入是由内部时钟电路(Clock Circuit)产生的,这四个时钟之间是什么关系呢?
首先这四个时钟频率一致,都是1.25GHz。
其次,假设以ADC A这个核的时钟为坐标系(称之为标准时钟),那么由上图易知,ADC B的时钟输入为偏移了180°的时钟,同理,ADC C的输入时钟偏移了90°,ADC D的输入时钟偏移了270°。
其时序图如下:
我们分解开来看:
模拟输入XAI:
基准时钟CLK:
将上面的基准时钟2分频,然后各种相位偏移得到如下内部采样时钟:
可以将上面的内部时钟由上到下编号为clk_a、clk_c、clk_b、clk_d,每个时钟的上升沿到达时,都会对输入模拟数据进行一次采样,这样就相当于采样时钟的最高频率为5GHz,多么充分地应用了4个核的优势呀!
由完整的时序图还可以看出clk_a的第一个时钟上升沿到达时,核A(ADC A)采样的数据为N,clk_c的第一个时钟上升沿到达时,采样的数据为N+1,adc_b的第一个时钟上升沿到达时,采样的数据为N+2,adc_d的第一个时钟上升沿到达时,采样的数据为N+3,后面依次循环。
从下面这张图上也能看出上面的采样数据关系:
A0...A9就是ADC A采样得到的数据;(N)
B0...B9就是ADC B采样得到的数据;(N+2)
C0...C9就是ADC C采样得到的数据;(N+1)
D0...D9就是ADC D采样得到的数据;(N+3)
恰好第一个时钟时钟上升沿到达时,4个核采样四个数据。
同样,下面就进入了数据同步环节:
同步时钟仍然是基准时钟的4分频,也就是说同步时钟的频率是基准时钟CLK的1/4。
ADR的第一个时钟上升沿到达时,同步数据N,之后是同步数据N+1,再之后同步数据N+2,然后是N+3,ADR、BDR、CDR、以及DDR四个同步时钟理论上是一致的,时钟上升沿以及下降沿同时有效。
程序的部分思路如下:
module adc(...); //由于这是一个不完整的程序,所以省略了输入输出;
wire syn_clk; //数据同步时钟,这个时钟一般是由fpga中的IP核产生
wire [9:0] ad_data_a,ad_data_b,ad_data_c,ad_data_d; //adc采样得到的数据,对于四通道模式而言,此为A端口输入模拟信号,采样得到的数据
reg [9:0] ad_data1,ad_data2,ad_data3,ad_data4,ad_data5,ad_data6,ad_data7,ad_data8; //假设该寄存器变量用于存放adc采样得到的数据
//数据同步
//同步时钟上升沿
always@(posedge syn_clk) //同步时钟上升沿到来时,同步一个数据
begin
ad_data1 <= ad_data_a; //核A采样得到的数据
end
always@(posedge syn_clk) //同步第二个数据
begin
ad_data3 <= ad_data_b; //核B采样得到的数据
end
always@(posedge syn_clk) //同步第三个数据
begin
ad_data2 <= ad_data_c; //核C采样得到的数据
end
always@(posedge syn_clk) //同步第四个数据
begin
ad_data4 <= ad_data_d; //核D采样得到的数据
end
//同步时钟下降沿
always@(negedge syn_clk) //同步时钟下降沿沿到来时,同步第五个数据
begin
ad_data5 <= ad_data_a; //核A采样得到的数据
end
always@(negedge syn_clk) //同步第七个数据
begin
ad_data7 <= ad_data_b; //核B采样得到的数据
end
always@(negedge syn_clk) //同步第六个数据
begin
ad_data6 <= ad_data_c; //核C采样得到的数据
end
always@(negedge syn_clk) //同步第八个数据
begin
ad_data8 <= ad_data_d; //核D采样得到的数据
end
endmodule
本文同步分享在 博客“李锐博恩”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。