|
本帖最后由 BOB_Sun 于 2015-8-4 10:29 编辑
[系统相关] 【Altera soc 体验之旅】+延时链测试以及亚稳态分析1
本文转自:http://bbs.eeworld.com.cn/thread-459454-1-1.html
延时链测试以及亚稳态分析
1.前言
图 1 静态时序分析的超前进位延时链信息
在上一篇(基于超前进位延时链的时间数字转换器)中,使用TimeQuest分析了延时链的cin到cout的延时为每两个延时单元延时45ps左右(图 1)。但是,对于一个测试的设计,还是要采取一些方法来测试实际的延时单元延时。此文借助SignalTap II工具来实现测试。具体思路是,输入信号的延时间隔除以延时链中边沿移动的延时单元个数求得每个延时单元的延时平均值。
2 延时链延时测试
图 2 长度为200的延时链测试原理图
2.1 时钟sysclk
图 3 时钟PLL配置
时钟sysclk的PLL的Verilog源程序如下:
`timescale 1ns/10ps
module sysclk_0002(
// interface 'refclk'
input wire refclk,
// interface 'reset'
input wire rst,
// interface 'outclk0'
output wire outclk_0,
// interface 'outclk1'
output wire outclk_1,
// interface 'locked'
output wire locked
);
altera_pll #(
.fractional_vco_multiplier("false"),
.reference_clock_frequency("50.0 MHz"),
.operation_mode("direct"),
.number_of_clocks(2),
.output_clock_frequency0("250.000000 MHz"),
.phase_shift0("0 ps"),
.duty_cycle0(50),
.output_clock_frequency1("250.000000 MHz"),
.phase_shift1("-2000 ps"),
.duty_cycle1(50),
.output_clock_frequency2("0 MHz"),
.phase_shift2("0 ps"),
.duty_cycle2(50),
.output_clock_frequency3("0 MHz"),
.phase_shift3("0 ps"),
.duty_cycle3(50),
.output_clock_frequency4("0 MHz"),
.phase_shift4("0 ps"),
.duty_cycle4(50),
.output_clock_frequency5("0 MHz"),
.phase_shift5("0 ps"),
.duty_cycle5(50),
.output_clock_frequency6("0 MHz"),
.phase_shift6("0 ps"),
.duty_cycle6(50),
.output_clock_frequency7("0 MHz"),
.phase_shift7("0 ps"),
.duty_cycle7(50),
.output_clock_frequency8("0 MHz"),
.phase_shift8("0 ps"),
.duty_cycle8(50),
.output_clock_frequency9("0 MHz"),
.phase_shift9("0 ps"),
.duty_cycle9(50),
.output_clock_frequency10("0 MHz"),
.phase_shift10("0 ps"),
.duty_cycle10(50),
.output_clock_frequency11("0 MHz"),
.phase_shift11("0 ps"),
.duty_cycle11(50),
.output_clock_frequency12("0 MHz"),
.phase_shift12("0 ps"),
.duty_cycle12(50),
.output_clock_frequency13("0 MHz"),
.phase_shift13("0 ps"),
.duty_cycle13(50),
.output_clock_frequency14("0 MHz"),
.phase_shift14("0 ps"),
.duty_cycle14(50),
.output_clock_frequency15("0 MHz"),
.phase_shift15("0 ps"),
.duty_cycle15(50),
.output_clock_frequency16("0 MHz"),
.phase_shift16("0 ps"),
.duty_cycle16(50),
.output_clock_frequency17("0 MHz"),
.phase_shift17("0 ps"),
.duty_cycle17(50),
.pll_type("General"),
.pll_subtype("General")
) altera_pll_i (
.rst (rst),
.outclk ({outclk_1, outclk_0}),
.locked (locked),
.fboutclk ( ),
.fbclk (1'b0),
.refclk (refclk)
);
endmodule
注意其中的红色加粗部分,参考时钟50MHz;时钟0和1均为250MHz,时钟1的相位超前时钟0 2000ps。时钟0为TDC系统的主时钟,时钟1驱动3位计数器n_counter计数。
2.2 n_counter计数器
源程序如下:
module n_counter
#(parameter WIDTH=63)
(
input clock,
input st1,
output co
);
reg [WIDTH-1:0] n;
always @(posedge clock )
begin
if(st1) n <= n + 1;
end
assign co = n[WIDTH-1];
endmodule
其中,计数器的最高位作为tdc的待测信号输入。当前系统的计数器长度设定为3。
2.3 do_in与add200
详细描述见上一篇(基于超前进位延时链的时间数字转换器)中的描述。
2.4 basic_register
源程序如下:
module basic_register
#(parameter N=100)
(
input clk,
input [N-1:0] sr_in,
output reg [N-1:0] sr_out
);
always @ (posedge clk)
begin
sr_out <= sr_in;
end
endmodule
该模块例化成一个200位的寄存器,用以保存add200的延时链输出信息。该寄存器组模块的加入,主要是为了解决,SignalTap II不能直接从add200采集数据。因为一旦直接从add200采集数据,Quartus II总是提示add200的逻辑锁定区域的大小不够。
2.5 ris_g 和encoder
详细内容见上一篇(基于超前进位延时链的时间数字转换器)中的描述。
2.6 SignalTap II测试结果
图 4 相位超前2ns的延时链输出
图 5 相位超前2.5ns的延时链输出数据
图 4图 5中的全1和全0输出对应延时链输入为0和1的情况。图 42处的F…FEC00和图 52处的F…FAC8720…040…0对应的是输入为1后,在紧邻输入上升沿后的时钟上升沿锁存延时链输出的数据。由于,两个数据分别是时钟1超前时钟0 2ns与2.5ns的情况,故两个数据中的1-0跳变处的位置之差对应的就是0.5ns延时差。
2.7 延时链的亚稳态分析
只有正确的识别延时链中的1-0边沿才能获得精确地延时链中延时单元的延时时间。理论上分析在输入的上升沿在延时链中传播后,利用寄存器锁存这一违反寄存器时序要求的传播边沿,必然会引起寄存器出现亚稳态现象。如图 42处的F…FEC00,边沿处的数据EC0对应的二进制码为111011010000。可见,原本应该是全1加全0模式的输出数据,在全1序列中出现了0,在全0序列中出现了1。
上一篇(基于超前进位延时链的时间数字转换器)中的描述边沿检测电路就是为了处理亚稳态现象,找到正确的唯一的边沿位置而提出的。利用该处理电路处理后得到的数据为0…0000000100000000,其中1为上升沿的位置。同样处理图 52处的F…FAC8720…040…0后的数据为0…010000000000000010000…0,数据表示延时链中的边沿有2处,很明显是错误的。针对于芯片的8输入LUT的结构(如 图6 所示),边沿检测电路的实现方法可重新调整为:
同理下降沿检测电路如公式所示。
图 42处的F…FEC00和图 52处的F…FAC8720…040…0经公式处理后为0…0010000000000000和0…00000010000000000000000000000…000000000000…0000。
图6 芯片的LUT的基本结构
计算,0.5ns对应的延时单元个数为90个,则可以测算出一个延时单元的延时为500/90=5.6ps。远小于静态时序分析的45ps。也就是说,250MHz的系统时钟,要求延时链的长度最小为8*90=720位,而不是现在的200位。下面的思路是去查看ChipPlanner视图中的详细走线情况,可详细的走线情况被Altera屏蔽了。期待Altera工程师给出正确的解读。
分析延时链锁存的亚稳态产生原因:
1) 在时钟条边沿锁存输入信号的跳变沿必然会违反触发器的建立与保持时间;
2) 延时链触发器组的时钟输入延时不可能做到完全一致;
3) Pll时钟的输出抖动;
4) 环境噪声;
由此,基于延时链结构的时间数字转换器的亚稳态现象是无法避免,只能通过边沿检测电路尽可能的消除。在利用公式处理的过程中,难免会出现边沿附近的误消除问题,这在一定程度上会影响最终的测量精度。为了提高测量精度,只有采用诸如平均测量等有效的测量手段和方法来提高测量精度。
3 1000位延时链的实现及测试
3.1 1000位延时链的实现
图 6 1000延时链实现的顶层原理图
(未完,跟贴中) |
|