实际工程中,我们使用的复位信号可能是一个全局复位信号,来自于FPGA外部芯片,也可能是一个局部复位信号,由FPGA内部逻辑生成。可能是硬复位,比如板子上的按键开关,也可能是软复位,比如CPU提供的复位信号。这就可能出现不同复位信号组合生成系统复位信号。以如下代码为例:代码第4行为全局复位信号,代码第11行为内部信号生成的复位信号,从代码第15行可以看到,这两个信号具有同样的优先级,共同作用于信号dout,只要其中之一为高电平即可对dout进行复位。上述代码综合后的电路如下图所示,可以看到global_rst和conf_reg都进入到LUT3,而LUT3的输出连接到触发器dout_reg的复位端口R上。
如果我们期望global_rst直接连接到dout_reg的复位端口上该如何操作呢?此时要用到综合属性DIRECT_RESET。如下图所示代码片段。代码第4行将DIRECT_RESET的值设置为true。通过该属性,就可得到如下图所示的电路。此时,global_rst直接连接到触发器dout_reg的R端口上,而内部逻辑产生的复位信号int_rst则被搬移到数据路径上了。那么,这种电路是否改变了原始的逻辑功能?我们只要观察一下上图所示电路中LUT3的真值表,如下图所示。LUT3的I0端口与din相连,I1端口与conf_reg[1]相连,I2端口与conf_reg[2]相连,从其中的布尔表达式可以看到,只要I1或I2有一个为低电平,LUT3就输出0,这就是int_rst起到的作用。同时,global_rst直接与dout_reg的R端口相连,同样可以复位,所以功能并未发生改变。由此可见,综合属性DIRECT_RESET用于多个复位信号组合共同构成新的复位信号时,指定哪个复位可以连接的触发器的专用复位端口R上。这样的好处是降低了以复位端口为终点的时序路径的逻辑级数,这可从上述两个电路的对比结果中发现。需要注意的是这里的复位必须是同步复位,异步复位是不支持这么操作的。
发表评论: