例程代码:这是一个计数器,为了很好的演示时序约束,使用PLL IP核创建了一个时钟
第一个文件,也是顶层文件,count.v
module counter(Clk,rst_n,pio);
input Clk; //系统时钟,50M
input rst_n; //全局复位,低电平复位
output pio; //led输出
wire clk9M;
ip_pll pll_9m(
.inclk0(Clk),
.c0(clk9M)
);
counter_test asda
(
.Clk50M(clk9M),
.Rst_n(rst_n),
.led(pio)
);
endmodule
第二个文件代码,counter_test.v
module counter_test(Clk50M,Rst_n,led);
input Clk50M; //系统时钟,50M
input Rst_n; //全局复位,低电平复位
output reg led; //led输出
reg [24:0]cnt; //定义计数器寄存器
//计数器计数进程
always@(posedge Clk50M or negedge Rst_n)
if(Rst_n == 1'b0)
cnt <= 25'd0;
//else if(cnt == 25'd24_999_999)
else if(cnt == 25'd24_999)
cnt <= 25'd0;
else
cnt <= cnt + 1'b1;
//led输出控制进程
always@(posedge Clk50M or negedge Rst_n)
if(Rst_n == 1'b0)
led <= 1'b1;
//else if(cnt == 25'd24_999_999)
else if(cnt == 25'd24_999)
led <= ~led;
else
led <= led;
endmodule
编译后,在报告中可以看到有两个时钟
接下来,进行约束
首先打开TimeQuest软件
可以看到,目前还没有任何I/O的约束
开始进行约束
1,首先,创建生成时钟
2,约束I/O
由于我们这个代码的要约束的引脚是输出型,所以约束output delay
先约束最大输出延迟,所以现在Maximum
源同步模型中
建立时间中,最大输出延迟output delay max = Tdata(pcb) -Tclk2(ext) + Tsu
保持时间中,最小输出延迟output delay min = Tdata(pcb) - Tclk2(ext) - Th
当数据线的长度与时钟线的长度相等时,即Tdata(pcb) == Tclk2(ext)
最大输出延迟output delay max = Tdata(pcb) -Tclk2(ext) + Tsu,即output delay max = Tsu
最小输出延迟output delay min = Tdata(pcb) - Tclk2(ext) - Th,即output delay min = -Th
这里假设数据线的长度与时钟线的长度相等,另外从数据手册中看到Tsu=0.2ns,Th=1.5ns
所以
目标端口选择想要约束的端口,这里选择pio
接着约束最小输出延迟
约束完,我们查看下报告,有建立时间和保持时间的,可以看到Slack没有变红色,而且余量值还挺大,说明没问题
如果存在问题,我们会看下Timing report
约束完后,生成SDC文件,然后在Quartus需要设置下
再打开TimeQuest软件查看Report All I/O Timings