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,然后运行

create_clock -name {clk} -period 10.000 -waveform { 0.000 5.000 } [get_ports {*clk}] 

3. 时序分析

1)看report,发现setup错误,如下:

quartus 时序约束分析1----乘法器_第1张图片

 2) 双击report top failing paths,如下:

quartus 时序约束分析1----乘法器_第2张图片

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

quartus 时序约束分析1----乘法器_第3张图片

针对以上分析,如果将时钟变成50M是否会满足时序要求?或者修改乘法器结构呢?

3.  修改时钟约束

将时钟变为50M,即20ns后, report如下:并没有错误

quartus 时序约束分析1----乘法器_第4张图片

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
   end

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

   always  @(posedge clk or negedge rst_n)begin
       if(rst_n==1'b0)begin
           dout <= 0;
       end
       else begin
           dout <= dout1 * dout2;
       end
   end

quartus 时序约束分析1----乘法器_第5张图片

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

quartus 时序约束分析1----乘法器_第6张图片

quartus 时序约束分析1----乘法器_第7张图片

5. 涉及概念的理解 

关于SLACK理解,参考fpga时序分析和slack(SOC) (Quartus II)_gtkknd的专栏-CSDN博客;

quartus 时序约束分析1----乘法器_第8张图片

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

你可能感兴趣的:(FPGA,quartus,时序约束,fpga)