FPGA的设计艺术(28)FPGA中的RTL原理图触发器类型探究

李锐博恩 2021-05-23 01:13:25 11546

前言

我曾经有一个疑问,就是为什么我明明使用了同步复位的设计,而Vivado给我生成的RTL原理图看似异步的?
例如:

module syn_rst(
    input rst,
    input clk,
    input data_in,
    output out
    );

    reg out;
    always@(posedge clk) begin
        if(rst)
            out <= 1'b0;
        else
            out <= data_in;
    end
endmodule

ISE生成的RTL原理图:
同步复位

这看上去就是一个触发器,RST是触发器的复位引脚?
可是我的逻辑设计的是一个同步复位的逻辑,为什么会这样呢?
你是否也有同样的疑问?
我原本期待的RTL原理图类似于:

altera的RTL

通过一个多路选择器,rst生效也需要在时钟的上升沿进行。

为此,我还在CSDN的论坛上问道过这个问题:用Verilog 设计的同步复位,综合出来的结果却是异步复位的?

当然,论坛还是不靠谱的,xia ji儿回答的居多。
不过,有一个回答是正确的,看了这篇文章,你一定知道哪一个回答是正确的了。

Vivado中的触发器

给一个提示,就是这个原理图:

同步复位
为什么会认为是它的RST复位端口,是异步复位呢?

这就是问题所在!

看这个寄存器的名字:RTL_REG_SYNC,SYNC是什么?是同步的含义,所以,我们有必要探究一下,Xilinx 的FPGA中的触发器?

根据Xilinx的手册WP275:
可以得知,Xilinx的触发器有支持异步复位和置位控制的,也有支持同步复位与置位控制的。
上述的例子就是具有同步复位端的触发器,它的特点是复位端口名称为:RST,置位端口名称为:SET,如下图:

同步复位,同步置位
显著的特征为触发器的名称为RTL_REG_SYNC。

而异步复位端口名称为:CLR,置位端口名称为:PRE。

异步复位,异步置位

且显著的特征为触发器的名称为:RTL_REG_ASYNC。

我们可以穷尽一个触发器的资源利用,例如可以同时使用同步复位,同步置位操作,也可以同时使用异步复位以及异步置位操作,但是不存在一个触发器有同步以及异步两种混合功能的情况,这是资源的特征决定的。

为了验证上述情况,我们假设一个例子,以2分频的分频器为例,讨论4种组合的情况,来看资源是如何使用的:

同步复位,同步置位

RTL描述:

    always@(posedge clk) begin
        if(rst) begin
            div_clk     <=  1'b0;
        end
        else if(set) begin
            div_clk     <=  1'b1;
        end
        else begin
            div_clk     <= ~div_clk;
        end
    end

RTL原理图:

同步复位,同步置位

可见,一个同步触发器搞定。

异步复位,异步置位

RTL描述:

    always@(posedge clk or posedge rst or posedge set) begin
        if(rst) begin
            div_clk     <=  1'b0;
        end
        else if(set) begin
            div_clk     <=  1'b1;
        end
        else begin
            div_clk     <=  ~div_clk;
        end
    end

RTL原理图:
异步复位,异步置位

可见,一个异步触发器搞定!

异步复位,同步置位

RTL描述:

    always@(posedge clk or posedge rst) begin
        if(rst) begin
            div_clk     <=  1'b0;
        end
        else if(set) begin
            div_clk     <=  1'b1;
        end
        else begin
            div_clk     <=  ~div_clk;
        end
    end

可见,异步复位,同步置位操作,使用了一个异步触发器,但是置位并没有使用异步置位端,而是通过选择器间接实现了一个同步置位的选择。符合我们的预期。

异步复位,同步置位

同步复位,异步置位

RTL描述:

    always@(posedge clk or posedge set) begin
        if(rst) begin
            div_clk     <=  1'b0;
        end
        else if(set) begin
            div_clk     <=  1'b1;
        end
        else begin
            div_clk     <=  ~div_clk;
        end
    end

RTL原理图:
同步复位,异步置位

可见,使用了一个同步复位的触发器,且同步置位端也没有使用,而是通过一个选择器来实现,但是这种实现的方式,貌似也没有实现异步置位的操作!

我们可以通过仿真来看验证下,我们的设计是上升沿作为时钟的有效沿,仿真的时候我们在时钟的下降沿给一个置位信号,观察是否立即置位了?
如果立即置位了,则表明符合预期,否则不符合我们的设计:
异步置位仿真
可见,也实现了异步置位的行为。

可见,这个RTL原理图生成的并不完美,且让人疑惑,或者什么原因,谁来解释一下也行,欢迎!

这篇文章到此也算告一段落,我们也留有些许遗憾,但没关系,总会解决的。

我们也为下一篇博文做一下考虑,就是上述讨论都只是针对RTL层面,可知对于FPGA的开发,FPGA内部实际的资源和RTL原理图中的资源并不一样,例子RTL原理图中可以使用MUX,但是FPGA内部是用LUT代替MUX的,因此,对于综合这一步的逻辑行为是什么样子的呢?
针对最后一种情况,我们可以提前给出综合后的原理图:

综合后的原理图
可见,对于MUX以及反向器的替代,使用了一个3输入的LUT。内部的触发器也没有了同步复位端,rst以及set都作为了LUT输入的一部分。

LUT是FPGA的一大特色,可以看做存储3输入的所有组合,因此和一个ROM很类似,配合触发器,就可以很强大,更多内容我们下一篇再见。

最后强调一句,这些东西在Xilinx家的数据手册上都有,例如RTL原理图中可以使用的所有器件,都在数据手册中,其实就是一个库,实现一个电路,要从库中挑选器件实现它。

可参考:

https://www.xilinx.com/support/documentation/sw_manuals/xilinx14_2/7series_hdl.pdf

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 95 7 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
李锐博恩
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区