目录

抛砖引玉

实际测试


抛砖引玉

从一个小例子引入设计:

我们需要设计一个电路,要实现的功能是,如果电脑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)如何避免生成锁存器?相关推荐

  1. HDLBits答案(4)_如何避免生成锁存器?

    HDLBits_Verilog Language_Procedures HDLBits链接 组合逻辑的always块 [David说]: 考虑到硬件的可综合性,有两种always块是有意义的: 组合: ...

  2. HDLBits 系列(0)专题目录

    本篇博文是近来总结HDLBits系列的目录,点击蓝色字体即可进入查看具体内容. HDLBits 系列(1)从HDLBits中获取灵感,整顿自己,稳步前行 HDLBits 系列(2)如何避免生成锁存器? ...

  3. FPGA基础知识极简教程(5)什么是锁存器以及如何在FPGA开发中避免生成锁存器?

    博文目录 写在前面 正文 什么是D锁存器? 锁存器是如何生成的? 如何避免生成锁存器? 参考资料 交个朋友 写在前面 个人微信公众号: FPGA LAB 个人博客首页 注:学习交流使用! 本文我们将讨 ...

  4. HDLBits 系列(31)Serial Receiver and Datapath

    目录 序言 原题复现 我的设计 序言 上篇博文: HDLBits 系列(30)Serial Receiver 写了串行接收器如何接收8位串行数据,正确接收8位串行数据后给一个接收完毕标志信号,这篇博文 ...

  5. 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 ...

  6. HDLBits 系列(10)(Mux256to1)多路选择器的固定思维,你别想太多!

    目录 抛砖引玉 思维陷阱 很有意义的语法讨论 最后想说的一些话 抛砖引玉 本文有一个诡计,先让我把你代入到多路选择器中,见如下一个小问题: Create a 16-bit wide, 9-to-1 m ...

  7. 【Verilog HDL】设计硬件电路时,如何避免生成锁存器?

    这个问题很简单,前面的很多博文也多多少少提到了这个问题,(如:Verilog HDL 使用规范(一)),今天就系统地理一遍. Verilog HDL设计中容易犯的一个通病就是不正确使用语言,生成了并不 ...

  8. Verilog HDL中容易生成锁存器的两种情况

    在Verilog HDL的程序设计中,有两种情况会生成锁存器. 第一种情况 在always块中使用if语句,但是没有else,这会导致当条件不成立时,没有其他语句可执行,使得被赋值的寄存器一直保持不变 ...

  9. 【SQL Server 学习系列】-- sql 随机生成中文名字

    [SQL Server 学习系列]-- sql 随机生成中文名字 原文:[SQL Server 学习系列]-- sql 随机生成中文名字 1 DECLARE @fName TABLE(Id INT I ...

最新文章

  1. JavaScript 爆红后,微软为何还要开发 TypeScript?
  2. linux c 关键字 _Noreturn 简介
  3. Consider defining a bean of type ‘com.xg.stupro.service.StudentService‘ in your configuration.
  4. java easyui分页源码_SpringMVC+easyUI中datagrid分页实现_2014.5.1
  5. Vue3中的父子、子父组件通信
  6. c语言编程帐薄结算,用C++语言设计个人帐薄管理系统最终版(备份存档)
  7. c++线程类 linux,C++进阶学习——线程基类的设计(Linux)
  8. linux tab键失灵了,Linux grep \t Tab 键失效
  9. C sharp 拉姆达、回调函数、事件
  10. Android 获取系统语言,区分简繁体中文
  11. 饥荒独立服务器在线模式收不到,Windows 服务器搭建Don’t Starve Together饥荒独立服务器教程...
  12. 【我的OpenGL学习进阶之旅】EGL简介
  13. Predefined character classes
  14. 什么是算法工程师?算法工程师有前景吗?
  15. 大学物理绝不挂科期末考试复习
  16. 艾永亮:盘点产品创新的三种颠覆方式
  17. c++ vector 先进先出_STL从0开始
  18. jython_Jython简介,第2部分:编程要点
  19. 森林水文学类毕业论文文献都有哪些?
  20. 随手查——Lumerical

热门文章

  1. 浅谈搜索引擎百度分词技术
  2. 大四可以正式入职吗_三方协议一签,就不是应届生了吗?高校毕业生注意,别错失身份...
  3. 搭建测试环境属于软件文档,搭建软件测试环境应注意的几个问题
  4. 炫界 (587) -(牛一邓丽君音)_50音起源 for mac(日语五十音学习软件)
  5. idea bookmark 怎么用
  6. java数据结构教程_Java数据结构
  7. html5网站测试工具,基于HTML5网页的前端技术测试技巧
  8. 职工信息管理程序设计c语言,C语言程序设计职工信息管理系统.docx
  9. 智慧农场基本情况交流会议记录
  10. 信号与系统2021春季课程小论文批改