您的位置:首页 > 其它

每天进步一点点------基础实验_07_锁存器 :锁存器器及透明锁存器各一

2013-08-08 18:39 260 查看
1. latch是电平触发,无法实现同步操作,与我们正常的时序逻辑电路设计思路不符。
2. latch会对输入电平敏感,受布线延迟影响较大,比较容易导致输出有毛刺产生。
3. latch会导致静态时序分析和DFT会很复杂。
4. 在ASIC中使用latch的集成度比DFF高,但在FPGA中正好相反,因为FPGA中没有标准的latch单元,但有DFF单元,一个LATCH需要多个LE才能实现。
latch的好处:
因为使用latch可以timing borrow,在高速电路设计中(timing会很紧),有时候就需要用latch。

这次讲一下latch。

latch的危害已经说过了,这里不再多说,关键讲一下如何避免。

1)在组合逻辑进程中,if语句一定要有else!并且所有的信号都要在if的所有分支中被赋值。

always  @( * )    begin

if ( sig_a == 1'b1 )    sig_b = sig_c;

end


这个是绝对会产生latch的。

正确的应该是

always  @( * )  begin

if ( sig_a == 1'b1 )  sig_b = sig_c;

else  sig_b = sig_d;

end


另外需要注意,下面也会产生latch。也就是说在组合逻辑进程中不能出现自己赋值给自己或者间接出现自己赋值给自己的情况。

always  @( * )  begin

if ( rst == 1'b1 )      counter =  32'h00000000;

else  counter = counter + 1;

end


但如果是时序逻辑进程,则不存在该问题。

2)case语句的default一定不能少!

原因和if语句相同,这里不再多说了。

需要提醒的是,在时序逻辑进程中,default语句也一定要加上,这是一个很好的习惯。

3)组合逻辑进程敏感变量不能少也不能多

这个问题倒不是太大,verilog2001语法中可以直接用 * 搞定了。

顺便提一句,latch有弊就一定有利。在FPGA的LE中,总存在一个latch和一个D触发器,在支持DDR的IOE(IOB)中也存在着一个latch来实现DDIO。不过在我们平时的设计中,对latch还是要尽可能的敬而远之。

/*********************************************************************************
* Company                    :
* Engineer                    : 空气微凉
*
* Create Date                : 00:00:00 22/03/2013
* Design Name                :
* Module Name                :
* Project Name                :
* Target Devices            :
* Tool versions            :
* Description                :
*                       http://www.cnblogs.com/kongqiweiliang/ * Dependencies                :
*
* Revision                    :
* Revision                    : 0.01 - File Created
* Additional Comments    :
********************************************************************************/
`timescale 1ns/1ps
`define    UD  #1
/*******************************************************************************/
module LATCH_N
(
//Interface package
input                                iDAT            ,//
input                                iDAT_EN        ,//
output  reg                        oDAT            //
);
//-------------------------------------------------------------------------------
always@(*)begin
if(iDAT_EN == 1'h1)
oDAT = iDAT;
else
oDAT = iDAT;
end
//-------------------------------------------------------------------------------
endmodule


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐