FPGA|quartus 时序约束分析1----乘法器

本次分析实现乘法器的时序约束
1. 代码

always@(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin dout <= 0; end else begin dout <= a_ff0 * b_ff0 * c_ff0 * d_ff0; end end

2. 添加时序约束
添加系统时钟,100M,然后运行
【FPGA|quartus 时序约束分析1----乘法器】create_clock -name {clk} -period 10.000 -waveform { 0.000 5.000 } [get_ports {*clk}]
3. 时序分析
1)看report,发现setup错误,如下:
FPGA|quartus 时序约束分析1----乘法器
文章图片

2) 双击report top failing paths,如下:
FPGA|quartus 时序约束分析1----乘法器
文章图片

这里slack指从数据左边寄存器输出到右边寄存器的输入,建立时间不满足,即数据在第二个寄存器的触发时间后到来,不满足时序约束,分析原因可能是中间的组合逻辑占用时间过长。
FPGA|quartus 时序约束分析1----乘法器
文章图片

针对以上分析,如果将时钟变成50M是否会满足时序要求?或者修改乘法器结构呢?
3.修改时钟约束
将时钟变为50M,即20ns后, report如下:并没有错误
FPGA|quartus 时序约束分析1----乘法器
文章图片

4. 改变乘法器结构
代码如下,将原来的4位直接相乘,改为两两乘再乘,相当于中间加入了一级寄存器。
always@(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin dout1 <= 0; end else begin dout1 <= a_ff0 * b_ff0; end endalways@(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin dout2 <= 0; end else begin dout2 <= c_ff0 * d_ff0; end endalways@(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin dout <= 0; end else begin dout <= dout1 * dout2; end end

FPGA|quartus 时序约束分析1----乘法器
文章图片

由上图可以看出,总的延时将变长,未改进之前左右寄存器之间只有数据传输时间,而现在增加了中间的寄存器延时。以100M的时钟约束进行分析,分析报告没有时序错误。将时钟变成250M,报告如下,可以看出同样不满足时序约束。说明250M的时钟太大了。若想满足时钟约束,只能继续修改代码,将组合逻辑的延时降低,因为寄存器等同步单元的延时主要时由器件本身的工艺决定。无法通过软件或者代码修改。
FPGA|quartus 时序约束分析1----乘法器
文章图片

FPGA|quartus 时序约束分析1----乘法器
文章图片

5. 涉及概念的理解
关于SLACK理解,参考fpga时序分析和slack(SOC) (Quartus II)_gtkknd的专栏-CSDN博客;
FPGA|quartus 时序约束分析1----乘法器
文章图片

Launch Edge:产生data的reg 1所使用的clock rising edge。
Latch Edge:接收data的reg 2所使用的clock rising edge,会delay Lauch Edge 1个clk,这也是周期约束里面用到的路径延迟时间,一般同一时钟触发的话,延迟需要与一个时钟,且满足建保时间。


    推荐阅读