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

7 篇文章 0 订阅
4 篇文章 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错误,如下:

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

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

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

3.  修改时钟约束

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

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

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

5. 涉及概念的理解 

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

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

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值