总结
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快很多。
实例
用个简单实例来看看代码到综合网表再到底层基本元件映射关系:
代码中data_buf[0]会被映射为触发器,data_buf[1]会被映射为锁存器。综合后网表见下图
由原理图可见触发器CE端跟锁存器G端是等效的。触发器比锁存器多了时钟同步。
值得注意的是锁存器的G端口映射为底层元件存储器的clk端口。见红色高亮的net。锁存器的GE端口映射为存储器的CE端口。
触发器和锁存器place整体图
触发器和锁存器映射再同一个SLICEL里面,并不是相邻两个寄存器,一个是place在AFF2,一个place在EFF2,由此可见在ultrascale系列中, 8个存储单元为一组控制集。
不同模型代码
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:异步清零锁存器
目录
LDPE:异步置位锁存器
always @(*)
begin
if(i_rst)
data<=1'b1
else if(enable)
data<=di;
end
参考文档:
,1,大家一致避免使用的锁存器为什么依然存在于FPGA中?我们对锁存器有什么误解? | 电子创新网赛灵思社区
2,从底层结构开始学习FPGA(3)----存储单元之触发器、寄存器与锁存器_孤独的单刀的博客-CSDN博客_fpga寄存器是什么