FPGA基础之锁存器与触发器的设计

一、锁存器

首先设计锁存器的时候应该清楚什么是锁存器,锁存器其实是对电平信号敏感的,一定信号是电平敏感的,和时钟边沿clk无关。

所以用verilog描述的时候,应该是:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. always @(a,b,e)  
  2. begin  
  3.     if(e)  
  4.        dout<=a;  
  5. end  
产生锁存器的原因是因为各条件分支对dout的赋值不全,在else分支内没有对dout操作,这样就会造成锁存器。

实际综合后的RTL视图,可以看到综合后出现了锁存器latch


而从Technology Map View可以看出该锁存器的结构:


实际从FPGA逻辑资源实现上采用了逻辑门实现的,可见FPGA内部一般是没有锁存器这样的单元的。


二、触发器

首先明白触发器敏感信号时时钟边沿, 在Verilog中表述是这样的

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. always@(posedge clk or negedge rst_n)  
  2. begin  
  3.     if(~rst_n)  
  4.         dout1<=1'b0;  
  5.     else if(e)  
  6.         dout1<=a;  
  7.     else   
  8.         dout1<=b;  
  9. end   
其RTL视图为一个触发器:

而从Technology Map View可以看出FPGA内部实际是有触发器资源的。





三、避免锁存器

在(一)中可以看到对于dout分支不全造成了锁存器。下面再分析一例程序

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. reg  dout,dout1,dout2 ;       
  2. always@(posedge clk or negedge rst_n)    
  3. begin    
  4.     if(~rst_n)    
  5.         dout1<=1'b0;    
  6.     else if(e)    
  7.         dout1<=a;    
  8.     else     
  9.         dout1<=b;    
  10. end     
  11. always@(a,b,e)     
  12. begin    
  13.     if(e)    
  14.     begin    
  15.         dout2<=a;    
  16.   
  17.     end    
  18.     else    
  19.     begin    
  20.         dout<=b;    
  21.   
  22.     end    
  23. end   

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. </pre><pre>  

RTL视图为:包含两个锁存器和一个触发器。

分析:虽然下面的alway里分支都有(if else都有)但是每个分支只对其中一个寄存器赋值,再另一分支中没有再对相应寄存器赋值。

所以对于dout2和dout都形成了锁存器。


再看Technology Map View视图:

分析:图中下面两个位锁存器的结构,可以看出,锁存器是有反馈回路的逻辑电路,如图中标红的线为反馈信号。



为了尽量避免锁存器,改为触发器,修改语句:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. always@(posedge clk or negedge rst_n)    
  2. begin    
  3.     if(~rst_n)    
  4.         dout1<=1'b0;    
  5.     else if(e)    
  6.         dout1<=a;    
  7.     else     
  8.         dout1<=b;    
  9. end     
  10. always@(posedge clk )     
  11. begin    
  12.     if(e)    
  13.     begin    
  14.         dout2<=a;    
  15.     end    
  16.     else    
  17.     begin    
  18.         dout<=b;    
  19.   
  20.     end    
  21. end   


图示为修改后的RTL视图,把分支赋值全了,可以看到锁存器没有了,变成了触发器


再看Technology Map View视图:

分析:锁存器消失


缺点:时序分析较困难。

 

不要锁存器的原因有二:

1、锁存器容易产生毛刺,

2、锁存器在ASIC(专用集成电路)设计中应该说比ff(触发器)要简单,但是在FPGA的资源中,大部分器件没有锁存器这个东西,所以需要用一个逻辑门和ff

来组成锁存器,这样就浪费了资源。(用CPLD(复杂可编程逻辑器件)和FPGA(现场可编程逻辑阵列)来进行ASIC设计是最为流行的方式之一)

 优点:面积小。锁存器比FF快,所以用在地址锁存是很合适的,不过一定要保证所有的latch信号源的质量,锁存器在CPU设计中很常见,正是由于它的应用使得

CPU的速度比外部IO部件逻辑快许多。latch完成同一个功能所需要的门较触发器要少,所以在asic中用的较多。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值