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

目录

一、前言

二、工程设计

2.1 工程代码

2.2 综合结果

2.3 Latch实现


一、前言

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

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

二、工程设计

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

Verilog基础之十五、锁存器实现_第1张图片

可以直接例化生成锁存器,此种方式将不介绍,主要介绍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语句不完整也不会综合出锁存器。

Verilog基础之十五、锁存器实现_第2张图片

2.3 Latch实现

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

Verilog基础之十五、锁存器实现_第3张图片

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

Verilog基础之十五、锁存器实现_第4张图片

你可能感兴趣的:(Vivado,Verilog学习笔记,FPGA所知所见所解,fpga开发,存储器,触发器)