在基于FPGA的TDC中,使用抽头延迟线(TDL)构成进位链,使用CLB中的carry4作为进位单元
TDL代码:
verilog
(* keep_hierarchy = "TRUE" *)
module TDL
#(
parameter NUM_STAGES = 264
)(
//Inputs
iRST,
iHIT,
iSTORE_STOP,
//Outputs
oTHERMOMETER_VALUE,
oFED
);
//Singal type definition
//Inputs
input iRST;
input iHIT;
input iSTORE_STOP;
//Outputs
output [NUM_STAGES - 1 : 0] oTHERMOMETER_VALUE;
output oFED;
// Define interenal signals
(* dont_touch = "TRUE" *) wire [NUM_STAGES - 1 : 0] wFIS_VALUE;
(* dont_touch = "TRUE" *) wire STORE_STOP_BUFG;
/*(* dont_touch = "TRUE" *)*/ wire wFED;
wire [NUM_STAGES - 1 : 0] rVALUE;
BUFG bufg_inst (
.I(iSTORE_STOP), // 输入时钟信号
.O(STORE_STOP_BUFG) // 输出缓冲后的时钟信号
);
//FINE TDC DELAY CHAIN
genvar i;
generate
for(i = 0 ; i <= (NUM_STAGES / 4) - 1; i = i + 1)
begin : generate_block
if(i == 0)begin : CARRY4_first
(* dont_touch = "TRUE" *)
CARRY4 CARRY4_first_inst(
.CO (wFIS_VALUE[3 : 0]), // 4-bit carry out
.O (),
.CI (1'b0), // 1-bit carry cascade input
.CYINIT (iHIT), // 1-bit carry initialization
.DI (4'b0000), // 4-bit carry-MUX data in
.S (4'b1111) // 4-bit carry-MUX select input
);
end
else
begin : CARRY4_others
(* dont_touch = "TRUE" *)
CARRY4 CARRY4_others_inst(
.CO (wFIS_VALUE[4 * (i + 1) - 1 : 4 * i]),
.O (),
.CI (wFIS_VALUE[4 * i - 1]),
.CYINIT (1'b0), //0表示加法,1表示减法
.DI (4'b0000),
.S (4'b1111)
);
end
end
endgenerate
//FIRST STAGE D FLIP FLOPS TO SAMPLE DELAY CHAIN
genvar j;
generate
for(j = 0 ; j <= NUM_STAGES - 1 ; j = j + 1)
begin
(* dont_touch = "TRUE" *)
FDCE #(
.INIT(1'b0)
) rTDC_VALUE(
.Q (rVALUE[j]),
.C (STORE_STOP_BUFG),
.CE (1'b1),
.CLR (iRST),
.D (wFIS_VALUE[j])
);
end
endgenerate
assign wFED = wFIS_VALUE[0];
assign oFED = wFED;
assign oTHERMOMETER_VALUE = rVALUE;
endmodule
run post-Implementation Timing Simulation后carry4进位链的输出波形如下图
由触发器读出的数据如下
可以看出每个carry4单元前三个抽头没有延时,仅在第四个抽头以及传输到下一级carry4时波形才会发生变化。理论上是每一个抽头上波形都会往后延迟一定的时间。
检查时钟传输时间,如下图
时钟到达carry4的四个输出时间相同
各位友友这是哪里出现了问题啊,应该怎么解决呢,感谢