Verilog基础之十五、锁存器实现

目录

一、前言

二、工程设计

2.1 工程代码

2.2 综合结果

2.3 Latch实现


一、前言

    在之前的文章中介绍过寄存器,本节介绍一个类似的逻辑单元:锁存器。在大部分的资料和文章介绍中,都是告诉读者设计中应尽量避免出现锁存器,这主要是由锁存器的特点决定的。

    锁存器和普通触发器最大的区别就是锁存器为电平触发,如高电平或低电平,而触发器为边沿触发,这一特性使得锁存器不如触发器稳定,电平触发容易受干扰信号的影响而导致状态变化,也即产生毛刺。另一方面,因为可不受时钟控制,不利于时序分析,时序分析更加复杂。

二、工程设计

    以器件xc7k480tffv1156-1为例,在器件的原语列表中,有两种类型的锁存器:LDCE(异步清零/复位),LDPE(异步置位)

可以直接例化生成锁存器,此种方式将不介绍,主要介绍RTL代码生成锁存器。

2.1 工程代码

设计中包含正常综合LDPE,LDCE的场景以及设计不完整意外导致锁存器的场景

module Latch(clk,d,rst,ce,sel,o_ify,o_ifn,o_casey,o_casen,o_LDCE,o_LDPE);
input clk,d,rst,ce;
input [1:0] sel;
output reg o_ify,o_ifn;
output reg o_casey,o_casen,o_LDCE,o_LDPE;
//if语句完整,不会综合出latch
always@(*)
begin
if(!ce)
o_ify=0;
else
o_ify=d;
end
//场景一:if语句不完整,缺少else语句
always@(*)
begin
if(ce)
o_ifn=d;
end
//case语句完整
always@(*)
begin
case(sel)
    2'b00:o_casey=d;
    2'b00:o_casey=rst;
    default: o_casey=0;
endcase
end

//场景二:case语句不完整,无default语句
always@(*)
begin
case(sel)
    2'b00:o_casen=d;
    2'b00:o_casen=rst;
 endcase
end

//场景三:latch实现代码,实现两种latch,LDCE,LDPE
always@(*)
begin
if(ce)
begin
o_LDCE=0;
o_LDPE=1;
end
else 
if(clk)
begin
o_LDCE=d;
o_LDPE=d;
end
end
endmodule

2.2 综合结果

通过红框1和2中LDCE和LDPE的实现代码区别为清零与置位。o_casey与o_ify可知完整的if-else逻辑以及case语句逻辑是通过LUT来实现,栏框5中o_ff用FDRE实现,即使if语句不完整也不会综合出锁存器。

2.3 Latch实现

在device图中,每一个slice中有一个cell可放置锁存器。

同理,触发器o_ff也是放置于slice的AFF中,类型Type为Flop&Latch说明即可为触发器也可以为存储器

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值