1. 普通逻辑的复位
对于xilinx 7系列的fpga而言,flip-flop支持高有效的异步复/置位和同步复位/置位。对普通逻辑设计,同步复位和异步复位没有区别,当然由于器件内部信号均为高有效,因此推荐使用高有效的控制信号,最好使用高有效的同步复位。输入复位信号的低有效在顶层放置反相器可以被吸收到iob中。
下面细说原因
先比较一下同步复位和异步复位的区别:
首先是同步复位,同步的控制信号包括同步置位/复位和使能,可以被吸收到lut中,目的是为了防止控制集不同的lut不能被综合到同一个slice中,这样虽然提高了了lut的使用率,却降低了slice的使用率,得不偿失。
控制信号扇出不大于16的情况都可以尽可能的被吸收到同一个slice的lut中去,在vivado中可以使用control_set_opt_threshold进行设置。
同步复位
always @(posedge i_sys_clk)
begin
if(i_rst)
begin
out1 《= 0;
end
else
begin
out1 《= &{a1,a2,a3,a4,a5,a6};
end
end
控制集优化为2时,可以看出复位信号中插入了lut,但是由于在同一个slice中,使用造成的延时并不显著。注意对于扇出大的信号比如全局复位来说,这种控制集优化是不起作用的。
控制集合优化为0时,可以看出不会使用多于的lut逻辑。
异步复位
always @(posedge i_sys_clk or posedge i_rst)
begin
if(i_rst)
begin
out1 《= 0;
end
else
begin
out1 《= &{a1,a2,a3,a4,a5,a6};
end
end
异步复位跟没有使用控制集综合出的结果相同,可以看出不会使用额外的lut逻辑。
分析recovery/removal
异步复位有recover time 和remove time 的风险,也就是说recovery time和removal time都是检查异步信号(reset或preset或set)的释放沿,释放沿必须在时钟沿前面提前recovery time释放,或者在时钟沿后removal time之后释放。
顺便简单分析一下setup/hold,对于同一个时钟,肯定满足data_path》clk_path,而hold的要求很小,所以肯定满足。当data_path过长时,setup可能不满足。
假如不作同步的复位信号,那么recovery/removal都有可能不满足。
再考虑被本地时钟同步后的recovery/removal,同理复位信号对removal的时间要求很小,同步后的复位信号的延迟就能满足removal。由于设计中的全局复位信号一般有很大的扇出,布线的延时会很严重,因此recovery的要求变得严格。最好采用全局布线资源如bufg,尽量用局部复位或者避免使用复位。
因此不管是同步复位还是异步复位,都要使用同步后的复位信号。复位信号进来后先用本地时钟打两拍。在多个时钟域的时候注意是本地时钟,不是全局时钟。并在rtl中注明是异步寄存器,使得综合工具把简单同步器综合在同一个slice中以减少延时,提高mtbf。
(* async_reg = “true” *) (* keep = “true” *)reg system_reset_r;
(* async_reg = “true” *) (* keep = “true” *)reg system_reset_r2;
综合的结果如图,同步化的异步复位。
2. 特殊资源的复位
使用xilinx 原语srl16、srl32、lutram
由于是利用lut完成的上述功能,没有复位接口。只能依靠 gsr方法来完成,不能使用复位。因此,在为以上这些资源编写代码时,应注意避免在编码中使用复位,以此来保证综合工具综合出相应的电路。
使用复位信号
没有使用复位信号,可以看出综合工具自动把输入和输出寄存化,以满足更好的时序。
使用dsp48e1或bram
使用同步复位可以允许综合工具使用 dsp48e1或bram等专用资源内部的寄存器。这样能够改善设计中相应部分的器件总体使用率和性能,同时降低总体功耗。
下面以18x18的乘法器为例
同步复位
module multi_18x18(
input i_rst ,
input i_sys_clk ,
input [17:0]i_data1 ,
input [17:0]i_data2 ,
output reg [35:0] o_data
);
reg[17:0]r_data1,r_data2;
always @(posedge i_sys_clk)
begin
if(i_rst)
begin
r_data1 《= 18‘d0;
end
else
begin
r_data1 《= i_data1;
end
end
always @(posedge i_sys_clk)
begin
if(i_rst)
begin
r_data2 《= 18’d0;
end
else
begin
r_data2 《= i_data2;
end
end
always @(posedge i_sys_clk)
begin
if(i_rst)
begin
o_data 《= 36‘d0;
end
else
begin
o_data 《= r_data1*r_data2;
end
end
endmodule
异步复位,可以看出多使用了35个ff和18个lut
汽车制动器的分类与特点
英特尔与腾讯优图加速布局 AI时代云与边缘需要协同发展
人脸识别技术在智慧城市应用中的现状、优势、案例及发展前景
全球AI领域人才约30万,而市场需求在百万量级,人工智能资源到底有多稀缺?
小米如何破局互联网业务?
Xilinx FPGA的同步复位和异步复位
城域网的实际应用
半导体巨头瑞萨火灾初步调查结果出炉 欧菲光回应被苹果剔除出供应链
新加坡研究人员开发出了一种仿人手臂的消毒机器人
Redmi Note 9 Pro系列性能参数介绍
电气配电箱的设计和走线要求及原则
湖北移动的温控系统将可以满足未来5G基站节能减排的需求
基于高性能DSP处理器TMS320F2812实现看门狗电路的设计
VL716USB 3.1至SATA III 桥接控制实例
人工智能能提高对新一轮变革中的行业趋势的观察能力
苹果即将发布几款能够再一次改变世界的新产品
PCB对医疗设备可追溯性要求的意义
涡街、靶式、质量流量计的区别
在未来哪些信息技术岗位更吃香呢?
激光雷达引领AGV机器人,助力工业自动化