关于VerilogHDL生成的锁存器
总是会遇到有写文档中提到,不要生成锁存器。问题是
一: 什么叫锁存器
二 : 为什么不要生成锁存器
三 : 如何避免生成锁存器
好,现在就这三个问题,一一做出解答
一 什么叫锁存器
module datadistributor(datain,sel,enable,a,b,c,d);
input datain;
input[:] sel;
input enable;
output a;
output c;
output d;
output b;
reg a,b,c,d;
always @(datain or enable or sel)
begin
if(enable=='b1)
begin
case(sel)
'b00:a<=datain;
'b01:b<=datain;
'b10:c<=datain;
'b11:d<=datain;
default:a<=datain;
endcase
end
else
begin
a<='bz;
b<='bz;
c<='bz;
d<='bz;
end
end
endmodule
这个帖子的结论就是 //synthesis full_case 去除的是没有描述到的case情况所产生的锁存器。所以上述代码中产生的锁存器是无法通过这条简单的语句来消除的,好又有大神提及到
在 always 块的 if..else 语句中如果所列的条件不完整,综合时则会产生锁存器。
if(action) out1 <= 1'b1;
if(action) out1 <= 1'b1;
满满以为这个我就可以大功告成,总算知道怎么样避免产生锁存器了。于是检查了一下我的代码,发现锁存器好多啊,比如这个
//pulse_count and bit_count
reg [:] pulse_count = 'd0;
reg [:] bit_count = 'd0;
always @ (posedge i2c_clk) begin
if (curr_state == `IDLE) begin
pulse_count <= 'd0;
bit_count <= 'd0;
end else begin
if (pulse_count == 'd4) pulse_count <= 3'd0;
else if ((curr_state != `WAIT) || scl )
pulse_count <= pulse_count + 'd1;
if (((curr_state == `TX) || (curr_state == `RX)) && (pulse_count == 'd4)) begin
if (bit_count == 'd8) bit_count <= 4'd0;
else bit_count <= bit_count + 'd1;
end
end
end
第12行产生的真值表并不全面那么事产生了锁存器吗?这个是李亚民老师的代码
上面那位大神博文我只看了一半,后来才发现下面这么写:
但是,在描述时序逻辑的时候,也通常利用 if 语句的隐式条件对带时钟使能的 D 触发器建模
结论 : 组合逻辑,有无效状态就会产生锁存器
(补充:看到博文说case 有优先级,可是我记得在特权的书上以及自己做的实验上是看到if else 有优先级,case是并行处理的啊。当时我记得看的是RTL viewer,是不死后粗糙了点。是不是要去追寻到更底层去验证呢)
关于VerilogHDL生成的锁存器的更多相关文章
- FPGA代码设计规范整理
1.设计中的FIFO.状态机接口需要有异常恢复状态和状态上报机制,格雷码电路防止被综合电路优化掉. a)自行设计的格雷码FIFO(一般用于连续数据流跨时钟域)用Synplify综合时,为了防止被优化需 ...
- IC芯片設計
IC從生產目的上可以分成為通用IC(如CPU,DRAM,接口芯片等)和ASIC(ApplicationSpecificIntegreted Circuit)兩種,ASIC是因應專門用途而生產的IC. ...
- Verilog学习笔记基本语法篇(五)········ 条件语句
条件语句可以分为if_else语句和case语句两张部分. A)if_else语句 三种表达形式 1) if(表达式) 2)if(表达式) 3)if(表达 ...
- verilog 基础知识
mealy型状态机的下一状态和输出取决于当前状态和当前输入: moore型状态机的下一状态和输出取决于当前状态和当前输入,但其输出仅取决于现在的状态: 基本门原语的输出端口必须写在端口列表的前面,基本 ...
- Oracle 11g数据库详解(2)
FAILED_LOGIN_ATTEMPTS 用于指定连续登陆失败的最大次数 达到最大次数后,用户会被锁定,登陆时提示ORA-28000 UNLIMITED为不限制 精确无误差 是 实时 PASSWOR ...
- [整理]一个有关Latch(锁存器)的有趣问题
起源 今天诳论坛,突然发现了一个有关latch的问题,由于对D Flip-Flop和Latch还有些疑问,就点击了进去,一看果然有些意思,也挺有学习意义的,于是本文就诞生了.喊出口号~Just not ...
- VerilogHDL常用的仿真知识
在描述完电路之后,我们需要进行对代码进行验证,主要是进行功能验证.现在验证大多是基于UVM平台写的systemverilog,然而我并不会sv,不过我会使用verilog进行简单的验证,其实也就是所谓 ...
- VerilogHDL可综合设计的注意事项
可综合的语法已经记录得差不多了,剩下一些遗留的问题,在这里记录一下吧. 一.逻辑设计 (1)组合逻辑设计 下面是一些用Verilog进行组合逻辑设计时的一些注意事项: ①组合逻辑可以得到两种常用的RT ...
- 【转载】FPGA 中的latch 锁存器
以下这篇文章讲述了锁存器的一些概念和注意事项.原文标题及链接: FPGA 中的latch 锁存器 - 快乐至永远上的博客 - 与非博客 - 与网 http://www.eefocus.com/liuy ...
随机推荐
- [转] iOS多线程编程之NSOperation和NSOperationQueue的使用
<iOS多线程编程之NSThread的使用> 介绍三种多线程编程和NSThread的使用,这篇介绍NSOperation的使用. 使用 NSOperation的方式有两种, 一种是用定义好 ...
- Oracle SQL篇(四)group by 分组与分组的加强 rollup
分组操作group by 和分组的强化(rollup) 分组操作和分组函数的使用,对于编写SQL语句的人来说,是最基本的概念. 我们来看下面的例子: 在这里我们使用员工表EMP scott@D ...
- Android之ListView性能优化
ListView滚动速度优化主要可以应用以下几点方法来实现: 1.使用Adapter提供的convertView convertView是Adapter提供的视图缓存机制,当第一次显示数据的时候,ad ...
- json数据的获取(网络摘抄)
一个简单的对象: $.ajax({ type: "post", url: "Handler.ashx", dataType: "html", ...
- SpringMVC 详解
一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 ...
- Value Categories
Value categories Three primary categories primary categories mixed special Each C++ expression (an o ...
- (转)内核线程对象--Event事件对象
在所有的内核对象中,事件内核对象是个最基本的对象.事件能够通知一个操作已经完成. 客户机和一个服务器,它们之间需要互相进行通信例子(vs2008 ) 事件内核对象的组成 一个使用计数(与所有内核对象一 ...
- STL之list(双向链表)
一,概述 List将元素按顺序储存在链表中. 与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢. list 不仅是一个双向链表,而且是一个环状双向链表 二,使用 #incl ...
- BZOJ 1620: [Usaco2008 Nov]Time Management 时间管理( 二分答案 )
二分一下答案就好了... --------------------------------------------------------------------------------------- ...
- XML 学习之保存节点
XmlDocumnet WriteTo 方法 说明: 保存xmldocument对象节点到xmlwriter(即xml文件写入流) 实例: public static void WriteXml( X ...