目录
一,实例
用个简单实例来看看代码到综合网表再到底层基本元件映射关系:
代码中data_buf[0]会被映射为触发器,data_buf[1]会被映射为锁存器。综合后网表见下图
由原理图可见触发器CE端跟锁存器G端是等效的。触发器比锁存器多了时钟同步。
打开device看元件place,发现锁存器的G端口映射为底层元件存储器的clk端口。见红色高亮的net。锁存器的GE端口映射为存储器的CE端口。
触发器和锁存器place整体图
触发器和锁存器映射再同一个SLICEL里面,并不是相邻两个寄存器,一个是place在AFF2,一个place在EFF2,由此可见在ultrascale系列中, 8个存储单元为一组控制集。
二,ultrascale系列不同存储模型RTL代码/源语
FDCE:异步复位触发器
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
data<=1'b0
else if(enable)
data<=di;
end
FDPE:异步置位触发器
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
data<=1'b1
else if(enable)
data<=di;
end
FDRE:同步复位触发器
always @(posedge i_clk)
begin
if(i_rst)
data<=1'b0
else if(enable)
data<=di;
end
FDSE:同步置位触发器
always @(posedge i_clk)
begin
if(i_rst)
data<=1'b1
else if(enable)
data<=di;
end
LDCE:异步清零锁存器
always @(*)
begin
if(i_rst)
data<=1'b0
else if(enable)
data<=di;
end
LDPE:异步置位锁存器
always @(*)
begin
if(i_rst)
data<=1'b1
else if(enable)
data<=di;
end
不同FPGA系列寄存器模型区别
如下图所示,7系列FPGA中对触发器参数定义只有INIT初始化的值。
而ultrascale系列支持 时钟取反,输入数据D取反,复位信号取反 选项。所以ultrascale系列芯片综合更加灵活,有更多优化空间。
上图7系列FPGA FDSE源语
上图ultrascale系列FPGA FDSE源语
所以对于7系列FPGA如果复位是低有效,则会复位之前增加lut取反逻辑。ultrascale系列则不需要,因为触发器可配置为低复位。
三,总结
1,FPGA中触发器和锁存器类型有6种,存储元件可转换为以下任何一种。
⊙FDCE:异步复位触发器
⊙FDPE:异步置位触发器
⊙FDRE:同步复位触发器
⊙FDSE:同步置位触发器
⊙LDCE:异步清零锁存器
⊙LDPE:异步置位锁存器
2,组合逻辑中当输出条件没完全列出,剩下没列出的条件编译器默认输出值是不变的,这种情况就会产生锁存器。时序逻辑不会产生锁存器。因为触发器CE使能端口相当于锁存器的G端口,可以使输出保持不变。
3,FPGA中使用触发器并不会比使用触发器多资源,在ultrascale系列中,一个CLB中包含16 存储单元,所有存储单元都可以配置为寄存器或锁存器。8个存储单元为一组,要么配置为锁存器要么配置为触发器。
4,不建议使用锁存器原因:锁存器对毛刺敏感,不能异步复位,因此在上电后处于不确定的状态。锁存器不利于静态时序分析。
5,FPGA保留锁存器功能并不会增加FPGA资源(寄存器和锁存器可相互转化),保留锁存器可实现FPGA灵活性,锁存器虽然在FPGA中不怎么被使用,但在CPU中却很常见,因为锁存器比Flip-Flop快很多。
参考文档:
,1,大家一致避免使用的锁存器为什么依然存在于FPGA中?我们对锁存器有什么误解? | 电子创新网赛灵思社区
2,从底层结构开始学习FPGA(3)----存储单元之触发器、寄存器与锁存器_孤独的单刀的博客-CSDN博客_fpga寄存器是什么