首页专栏详情
打赏
FPGA的设计艺术(28)FPGA中的RTL原理图触发器类型探究
易百纳技术社区 李锐博恩 2021-05-23 01:13:25

前言

我曾经有一个疑问,就是为什么我明明使用了同步复位的设计,而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

打赏
共1人已赏
一个努力写作的FPGA爱好者、从业者,CSDN博客专家,CSDN上万关注量,百万
评论
0个
内容存在敏感词
相关专栏
打赏作者
易百纳技术社区
李锐博恩
您的支持将鼓励我继续创作!
打赏金额:
¥1 易百纳技术社区
¥5 易百纳技术社区
¥10 易百纳技术社区
¥50 易百纳技术社区
¥100 易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区 微信支付
易百纳技术社区
打赏成功!

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

审核成功

发布时间设置
发布时间:

审核失败

失败原因
备注
Loading...
易百纳技术社区
确定要删除此文章、专栏、评论吗?
确定
取消
易百纳技术社区
易百纳技术社区
在专栏模块发布专栏,可获得其他E友的打赏
易百纳技术社区
回答悬赏问答,被题主采纳后即可获得悬赏金
易百纳技术社区
在上传资料时,有价值的资料可设置为付费资源
易百纳技术社区
达到一定金额,收益即可提现~
收益也可用来充值ebc,下载资料、兑换礼品更容易
易百纳技术社区
活动规则
  • 1.周任务为周期性任务,每周周一00:00刷新,上周完成的任务不会累计到本周,本周需要从头开始任务,当前任务完成后才可以完成下一个任务
  • 2.发布的专栏与资料需要与平台的板块有相关性,禁止注水,专栏/资料任务以审核通过的篇数为准
  • 3.任务完成后,现金奖励直接打款到微信账户;EBC/收益将自动发放到个人账户,可前往“我的钱包”查看;其他奖励请联系客服兑换
  • 4.每周最后三个任务将会有以下奖品掉落:社区热卖开发板、小米音响、视频年度会员、京东卡、华为手机等等
易百纳技术社区
升级提醒
易百纳技术社区

恭喜您由入门

社区送出礼品一份

请填写您的收件地址,礼品将在3个工作日寄出

易百纳技术社区