【Xilinx Vivado时序分析/约束系列9】FPGA开发时序分析/约束-FPGA单沿数据input delay边沿对齐,不同时序模型实操练习

11 篇文章 103 订阅

目录

边缘对齐采样

时序图

更改PLL参数

综合布线

report timing

路径分析

两种约束模型

第一种模型

实际操作

添加约束

路径分析

第二种模型

顶层代码

添加时钟约束

解决办法

input delay约束

综合布线

结果

总结

往期系列博客


 

边缘对齐采样

边缘对齐采样的方式进行input delay约束,在系列第八讲中介绍过,在边缘对齐采样的情况下,容易出现保持时间余量不足的情况,这是由于在发射时钟的下一个时钟作为采样时钟去采数据时,由于间隔了一个时钟周期,容易导致采样时钟的时间相对于数据结束的时间更靠后,导致采样时钟无法对数据进行采样,可以采用PLL对齐进行时序约束,利用PLL对时钟进行左移,可以使时钟提前,进而可以增加保持时间余量。

时序图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

如果利用PLL将时间向右移,会出现什么结果呢?以具体实验验证一下。

更改PLL参数

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

还是之前的实验工程,只需要将PLL IP核更改一下参数即可。

将相位偏移更改为60,其余参数不变。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

综合布线

综合布线完成后打开布线设计

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_15,color_FFFFFF,t_70,g_se,x_16

report timing

如下图设置

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

这时候可以看到建立时间出现了违例

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

路径分析

点击其中一条路径进行分析

从这条路径的时序报告可以看到requirement这一栏中,表示的含义是:发送时钟再ons时刻,而采样时钟再3.086ns时刻,这明显是个错误的分析啊!一个时钟周期是18ns左右,享有偏移了一部分,采样时钟应该在20ns左右才对,这里应该是时序分析工具误以为采样时钟是刚刚偏移后的发送时钟,这应该怎么处理呢?

两种约束模型

第一种模型

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

这种时序模型可以用到input带有PLL的情况核不带有PLL的情况,带有PLL情况下采样时钟相移为正时需要进行“multicycle约束“,否则分析报告不正确。也就是说,在将时钟向右相移时,我们需要告诉时序分析工具我们所希望的采样时钟是哪个。

实际操作

点击编辑时序约束

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_10,color_FFFFFF,t_70,g_se,x_16

点击设置multicycle path

添加约束

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

将specify path multiplier设置为2,2表示我们需要将第二个上升沿作为采样时钟。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

路径分析

点击ok并reload,即可看到新的时序报告,可以看到这时候建立时间恢复了正常,但是保持时间出现了违例,可以点开其中一条路径进行分析。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

依然看requirement这一栏的数据,表示采样时钟原来是18.518ns,现在变成了21.604ns,这与我们对时钟向右相移的操作得到的结果一致。虽然保持时间出现了违例,但是得到了正确的时序报告。因此在采样时钟相移为正的时候需要进行multicycle约束。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

第二种模型

此类模型是上一个时钟作为发送时钟,下一个时钟作为采样时钟,相对于之前的模型来讲,相当于时钟提前了近一个时钟,这种时序模型可以用到input不带有PLL的情况,促使布线工具尽量增加时钟布线延迟使得建立时间满足要求,而上一个模型是为了让时钟布线更短一些。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

以实际工程对两种模型进行仿真(不带PLL)

实验工程还是根据上一个进行更改,只需要在顶层中对PLL的例化代码进行注释即可。

顶层代码

module top_ioddr(
input wire        rx_clk,
    input wire        rx_ctrl,
    input wire    [3:0] rx_dat,
  //tx
    output  wire    tx_clk,
    output  wire [3:0]  tx_d,
    output  wire    tx_dv,
    input	wire 	sdrclk,
    input	wire 	[3:0]	sdrdata,
    input	wire 	sdrden,
    output	reg 	tout 	
	);

wire rst;
wire rx_clk_90;
wire rx_en;
wire [7:0] rx_data;

reg tx_en1,tx_en2;
reg [7:0] tx_data1,tx_data2;

assign rst =0;
assign rx_clk_90 = rx_clk;

always @(posedge rx_clk_90 or posedge rst) begin
	if (rst == 1'b1) begin
		tx_data1 <= 'd0;
	end
	else if (rx_en == 1'b1) begin
		tx_data1 <= rx_data+ rx_data -1;
	end
end

always @(posedge rx_clk_90 or posedge rst) begin
	if (rst == 1'b1) begin
		tx_data2 <= 'd0;
	end
	else if (tx_en1 == 1'b1) begin
		tx_data2 <= tx_data1+ tx_data1 -5;
	end
end

always @(posedge rx_clk_90 ) begin
	tx_en1 <= rx_en;
end

always @(posedge rx_clk_90 ) begin
	tx_en2 <= tx_en1;
end

	iddr_ctrl inst_iddr_ctrl
		(
			.rx_clk_90 (rx_clk_90),
			.rst       (rst),
			.rx_dat    (rx_dat),
			.rx_ctrl   (rx_ctrl),
			.rx_en     (rx_en),
			.rx_data   (rx_data)
		);

	oddr_ctrl inst_oddr_ctrl
		(
			.sclk    (rx_clk_90),
			.tx_dat  (tx_data2),
			.tx_en   (tx_en2),
			.tx_c    (rx_clk_90),
			.tx_data (tx_d),
			.tx_dv   (tx_dv),
			.tx_clk  (tx_clk)
		);

reg [3:0] sdrdata_r1,sdrdata_r2;
reg 	sdrden_r1,sdrden_r2;

always @(posedge sdrclk) begin
	{sdrdata_r2,sdrdata_r1} <= {sdrdata_r1,sdrdata};
end

always @(posedge sdrclk) begin
	{sdrden_r2,sdrden_r1} <= {sdrden_r1,sdrden};
end

always @(posedge sdrclk) begin
	if(sdrden_r2 == 1'b1) begin
		tout <= (&sdrdata_r1)|(&sdrdata_r2);
	end
	else begin
		tout <= (^sdrdata_r2);
	end
end

endmodule

重新对工程进行综合布线

打开布线设置

添加时钟约束

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

设置input delay

分别为最大20.518ns,最小16.518ns,设置方法和之前的教程基本一致。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

此时时序出现违例

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

建立时间出现违例,说明在下一个时钟相对于数据开始的时间太靠前,导致建立时间出现违例,在这种模型下,本希望时序约束工具能够将时钟布线更长一些,就可以使建立时间余量更大一些,但是做不到,因此可以添加另一种约束条件,让时序恢复正常。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

解决办法

将时序约束成下图的模型

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

input delay约束

最大为2ns,最小为-2ns,就相当于以当前的时钟作为发射时钟,下一个时钟作为采样时钟。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

综合布线

结果

并report timing,就可以发现时序已经恢复了正常

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

总结

在有PLL进行约束的时候,两种模型都可以使用,但是要注意,在进行时钟右移的情况,需要额外添加一个”multicycle“的约束,为了省掉这部分的操作,一般是采用左移时钟的约束方法。

在没有PLL进行约束的情况下,就需要考虑,如果我们需要让数据路径布线更长一些(或者说是让时钟路径布线更短一些),就可以使用第一种模型进行约束;如果我们需要让时钟路径布线更长一些(或者说是让数据路径布线更短一些),就可以使用第二种模型进行约束。

往期系列博客

 【Xilinx Vivado时序分析/约束系列1】FPGA开发时序分析/约束-寄存器间时序分析

 【Xilinx Vivado时序分析/约束系列2】FPGA开发时序分析/约束-建立时间

​​​​​​ 【Xilinx Vivado时序分析/约束系列3】FPGA开发时序分析/约束-保持时间

 【Xilinx Vivado时序分析/约束系列4】FPGA开发时序分析/约束-实验工程上手实操

 【Xilinx Vivado时序分析/约束系列5】FPGA开发时序分析/约束-IO时序分析

 【Xilinx Vivado时序分析/约束系列6】FPGA开发时序分析/约束-IO时序输入延时

 【Xilinx Vivado时序分析/约束系列7】FPGA开发时序分析/约束-FPGA单沿采样数据input delay时序约束实操

 【Xilinx Vivado时序分析/约束系列8】FPGA开发时序分析/约束-FPGA数据中间采样、边缘采样PLL时序优化实操

 

 

  • 5
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
手把手课堂: Xilinx FPGA设计时序约束指南 Xilinx FPGA设计时序约束指南是一份详细的技术指南,旨在帮助设计人员在Xilinx FPGA的设计过程中正确地应用时序约束。该指南提供了关于时序约束的基础知识和最佳实践,并详细介绍了如何使用Xilinx工具来设置和验证时序约束。 在设计FPGA时,时序约束对于确保电路操作的正确性和可靠性至关重要。时序约束指定了电路中不同信号之间的时序关系,例如时钟和数据信号之间的关系。通过正确地设置时序约束,可以确保电路在特定的时钟频率下工作正常,并且可以防止出现时序冲突和故障。 Xilinx FPGA设计时序约束指南首先介绍了时序约束的基本概念,包括时钟信号和数据路径的相关术语和特性。然后,指南详细解释了如何使用Xilinx工具(如Vivado)来设置时序约束,包括使用基于约束文件的约束方法和使用基于时序推导的约束方法。通过这些方法,设计人员可以根据设计需求和时序规范准确地定义时序约束。 此外,该指南还介绍了如何验证时序约束的正确性。通过使用Xilinx工具提供的时序分析功能,设计人员可以分析和优化电路的时序性能,确保设计满足指定的时序要求。指南还提供了一系列实际的案例研究和常见问题解答,帮助设计人员更好地理解和应用时序约束。 综上所述,Xilinx FPGA设计时序约束指南是设计人员在进行FPGA设计时的重要参考资料。通过使用该指南提供的指导和实践经验,设计人员可以更好地应用时序约束,确保电路的时序性能和可靠性,提高FPGA设计的成功率和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linest-5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值