HDLBits 系列(2)如何避免生成锁存器?
目录
抛砖引玉
实际测试
抛砖引玉
从一个小例子引入设计:
我们需要设计一个电路,要实现的功能是,如果电脑CPU过热,则电脑关机;
你可能想到的伪代码是这样的:
- If (cpu_overheated) then shut_off_computer = 1;
可以,是对功能的描述。
但是存在一个情况就是其他情况呢?
如果默认不写回事会有什么问题?
答案也很简单,默认不写,就相当于保持输出原来的状态:
而组合逻辑中,这种“保持输出不变”的行为意味着需要记住当前状态,从而产生一个锁存器。组合逻辑(例如逻辑门)无法记住任何状态。组合电路必须在所有情况下都为所有输出分配一个值。这通常意味着您 始终需要else子句或分配给输出的默认值。
那么正确的做法应该是:
reg shut_off_computer;
always@(*) begin
if (cpu_overheated) shut_off_computer = 1;
else shut_off_computer = 0;
end
或
wire shut_off_computer;
assign shut_off_computer = cpu_overheated ? 1 : 0;
这个例子就是所谓的避免生成锁存器的最常见的一种情况,就是组合逻辑中,要把else子句或者case的default补上,并且给出输出的默认值。
另外一个小例子,各位自己想想吧。
如果没有达到目的地,且没油了,则停止驾驶,有油的话,继续驾驶。还有一种情况呢?如果达到了,当然没必要继续驾驶了。
- If (~arrived) then keep_driving = ~gas_tank_empty;
上面两个小例子的代码放到一个模块中:
// synthesis verilog_input_version verilog_2001
module top_module (input cpu_overheated,output reg shut_off_computer,input arrived,input gas_tank_empty,output reg keep_driving ); //always @(*) beginif (cpu_overheated)shut_off_computer = 1;else shut_off_computer = 0;endalways @(*) beginif (~arrived)keep_driving = ~gas_tank_empty;elsekeep_driving = 0;endendmodule
实际测试
最后附上,以前的总结:
23、写出会生成锁存器的三种情况?
1)组合逻辑中,if语句缺少else,或者else内未给输出赋值;
module test (input [1:0] sel,input a,input b,input c,output out ); reg out; always@(*) begin if(sel == 2'b00) out = a; else if(sel == 2'b01) out = b; else if(sel == 2'b10) out = c; endendmodule
如果赋值了呢?
module test (input [1:0] sel,input a,input b,input c,input d,output out ); reg out; always@(*) begin if(sel == 2'b00) out = a; else if(sel == 2'b01) out = b; else if(sel == 2'b10) out = c; else out = d; endendmodule
猜想:时序逻辑中if缺少else会怎么样?
module test (input clk, input [1:0] sel,input a,input b,input c,//input d,output out ); reg out = 0; always@(posedge clk) begin if(sel == 2'b00) out <= a; else if(sel == 2'b01) out <= b; else if(sel == 2'b10) out <= c; //else out <= d; end endmodule
时序逻辑中if不缺少else会怎么样?
module test (input clk, input [1:0] sel,input a,input b,input c,input d,output out ); reg out = 0; always@(posedge clk) begin if(sel == 2'b00) out <= a; else if(sel == 2'b01) out <= b; else if(sel == 2'b10) out <= c; else out <= d; endendmodule
2)组合逻辑中case缺少中情况未列全且缺少default,或者default中没有给输出赋值,或者自己赋值给自己,就会生成锁存器(Latch);
module test (//input clk, input [1:0] sel,input a,input b,input c,//input d,output out ); reg out = 0; always@(*) begin case(sel) 2'b00: out = a; 2'b01: out = b; 2'b10: out = c; endcase endendmodule
如果组合逻辑case中default没有缺少,并且给输出赋值了,会是什么样子?
module test (//input clk, input [1:0] sel,input a,input b,input c,input d,output out ); reg out; always@(*) begin case(sel) 2'b00: out = a; //2'b01: out = b; //2'b10: out = c; //2'b11: out = d; default: out = d; endcase endendmodule
3)组合逻辑中always@()块内敏感列表没有列全;
第三种情况,大概的意思就是如果敏感列表没有补全,该触发的时候没有触发,那么还不是保存了之前的输出结果,因而会生成锁存器。
HDLBits 系列(2)如何避免生成锁存器?相关推荐
- HDLBits答案(4)_如何避免生成锁存器?
HDLBits_Verilog Language_Procedures HDLBits链接 组合逻辑的always块 [David说]: 考虑到硬件的可综合性,有两种always块是有意义的: 组合: ...
- HDLBits 系列(0)专题目录
本篇博文是近来总结HDLBits系列的目录,点击蓝色字体即可进入查看具体内容. HDLBits 系列(1)从HDLBits中获取灵感,整顿自己,稳步前行 HDLBits 系列(2)如何避免生成锁存器? ...
- FPGA基础知识极简教程(5)什么是锁存器以及如何在FPGA开发中避免生成锁存器?
博文目录 写在前面 正文 什么是D锁存器? 锁存器是如何生成的? 如何避免生成锁存器? 参考资料 交个朋友 写在前面 个人微信公众号: FPGA LAB 个人博客首页 注:学习交流使用! 本文我们将讨 ...
- HDLBits 系列(31)Serial Receiver and Datapath
目录 序言 原题复现 我的设计 序言 上篇博文: HDLBits 系列(30)Serial Receiver 写了串行接收器如何接收8位串行数据,正确接收8位串行数据后给一个接收完毕标志信号,这篇博文 ...
- HDLBits 系列(29)PS/2 mouse protocol(PS/2 packet parser and datapath)
目录 序言 原题传送 题目解释 我的设计 序言 上篇博客: HDLBits 系列(28)PS/2 mouse protocol(PS/2 packet parser) 只对PS/2 mouse pro ...
- HDLBits 系列(10)(Mux256to1)多路选择器的固定思维,你别想太多!
目录 抛砖引玉 思维陷阱 很有意义的语法讨论 最后想说的一些话 抛砖引玉 本文有一个诡计,先让我把你代入到多路选择器中,见如下一个小问题: Create a 16-bit wide, 9-to-1 m ...
- 【Verilog HDL】设计硬件电路时,如何避免生成锁存器?
这个问题很简单,前面的很多博文也多多少少提到了这个问题,(如:Verilog HDL 使用规范(一)),今天就系统地理一遍. Verilog HDL设计中容易犯的一个通病就是不正确使用语言,生成了并不 ...
- Verilog HDL中容易生成锁存器的两种情况
在Verilog HDL的程序设计中,有两种情况会生成锁存器. 第一种情况 在always块中使用if语句,但是没有else,这会导致当条件不成立时,没有其他语句可执行,使得被赋值的寄存器一直保持不变 ...
- 【SQL Server 学习系列】-- sql 随机生成中文名字
[SQL Server 学习系列]-- sql 随机生成中文名字 原文:[SQL Server 学习系列]-- sql 随机生成中文名字 1 DECLARE @fName TABLE(Id INT I ...
最新文章
- JavaScript 爆红后,微软为何还要开发 TypeScript?
- linux c 关键字 _Noreturn 简介
- Consider defining a bean of type ‘com.xg.stupro.service.StudentService‘ in your configuration.
- java easyui分页源码_SpringMVC+easyUI中datagrid分页实现_2014.5.1
- Vue3中的父子、子父组件通信
- c语言编程帐薄结算,用C++语言设计个人帐薄管理系统最终版(备份存档)
- c++线程类 linux,C++进阶学习——线程基类的设计(Linux)
- linux tab键失灵了,Linux grep \t Tab 键失效
- C sharp 拉姆达、回调函数、事件
- Android 获取系统语言,区分简繁体中文
- 饥荒独立服务器在线模式收不到,Windows 服务器搭建Don’t Starve Together饥荒独立服务器教程...
- 【我的OpenGL学习进阶之旅】EGL简介
- Predefined character classes
- 什么是算法工程师?算法工程师有前景吗?
- 大学物理绝不挂科期末考试复习
- 艾永亮:盘点产品创新的三种颠覆方式
- c++ vector 先进先出_STL从0开始
- jython_Jython简介,第2部分:编程要点
- 森林水文学类毕业论文文献都有哪些?
- 随手查——Lumerical
热门文章
- 浅谈搜索引擎百度分词技术
- 大四可以正式入职吗_三方协议一签,就不是应届生了吗?高校毕业生注意,别错失身份...
- 搭建测试环境属于软件文档,搭建软件测试环境应注意的几个问题
- 炫界 (587) -(牛一邓丽君音)_50音起源 for mac(日语五十音学习软件)
- idea bookmark 怎么用
- java数据结构教程_Java数据结构
- html5网站测试工具,基于HTML5网页的前端技术测试技巧
- 职工信息管理程序设计c语言,C语言程序设计职工信息管理系统.docx
- 智慧农场基本情况交流会议记录
- 信号与系统2021春季课程小论文批改