HDLBits 系列(4)如何设计一定不会产生Latch的组合逻辑?
目录
抛砖引玉
个人总结
麻烦的设计
抛砖引玉
假设您正在建立一个电路来处理游戏的PS / 2键盘的扫描代码(scancodes)。给定收到的扫描码(scancodes)的最后两个字节,您需要指示是否已按下键盘上的箭头键之一。这涉及到相当简单的映射,可以将其实现为具有四个案例的case语句(或if-elseif)。
Scancode [15:0] | Arrow key |
---|---|
16'he06b | left arrow |
16'he072 | down arrow |
16'he074 | right arrow |
16'he075 | up arrow |
Anything else | none |
您的电路具有一个16位输入和四个输出。建立识别这四个扫描码(scancodes)并有效正确输出的电路。
为避免创建锁存器,必须在所有可能的情况下为所有输出分配一个值。仅仅具有默认情况是不够的。您必须在所有四种情况和默认情况下为所有四个输出分配一个值。这可能涉及许多不必要的输入。解决此问题的一种简单方法是在case语句之前为输出分配“默认值”:
always @(*) beginup = 1'b0; down = 1'b0; left = 1'b0; right = 1'b0;case (scancode)... // Set to 1 as necessary.endcase end
这种代码风格可确保在所有可能的情况下为输出分配一个值(0),除非case语句覆盖该分配。这也意味着默认:case项变得不必要。
个人总结
上面这个问题说的是在case之前给输出一些默认值,这其实也是我一直以来的做法,在Verilog高级数字系统设计技术与实例分析这本书中,大量的设计运用了这种风格的代码。
这么做的好处在于:
首先永远不会产生锁存器,因为我的输出有了默认值,每一种情况下,如果没有case下面的条件覆盖,则都会有默认值,于是乎也就不存在有写情况下输出没有给具体值的情况了,自然锁存器也不会生成了。
对于上面这个问题,我们相应的代码设计可以像这样:
// synthesis verilog_input_version verilog_2001
module top_module (input [15:0] scancode,output reg left,output reg down,output reg right,output reg up ); always@(*)begin// left = 0;// down = 0;//right = 0;// up = 0;case(scancode)16'he06b: left = 1;16'he072: down = 1;16'he074: right = 1;16'he075: up = 1;endcaseendendmodule
代入HDLBits中验证:
麻烦的设计
如果不给默认值,我们可以这么设计:
// synthesis verilog_input_version verilog_2001
module top_module (input [15:0] scancode,output reg left,output reg down,output reg right,output reg up ); always@(*)begincase(scancode)16'he06b: beginleft = 1;down = 0;right = 0;up = 0;end16'he072: beginleft = 0;down = 1;right = 0;up = 0;end16'he074: beginleft = 0;down = 0;right = 1;up = 0;end16'he075: beginleft = 0;down = 0;right = 0;up = 1;enddefault: beginleft = 0;down = 0;right = 0;up = 0;endendcaseendendmodule
虽然也能实现同样的功能,但是是不是很麻烦呢?
HDLBits 系列(4)如何设计一定不会产生Latch的组合逻辑?相关推荐
- HDLBits 系列(0)专题目录
本篇博文是近来总结HDLBits系列的目录,点击蓝色字体即可进入查看具体内容. HDLBits 系列(1)从HDLBits中获取灵感,整顿自己,稳步前行 HDLBits 系列(2)如何避免生成锁存器? ...
- 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 系列(7)对for循环以及generate for的各种实践
目录 抛砖引玉 累加模型 纹波进位加法器 写在最后 抛砖引玉 本节内容主要讲解for和generate for的用法,这两个用法,之前也有写过: Verilog中关于for与generate for用 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据 ...
- 打造属于自己的underscore系列 ( 一 ) - 框架设计
underscore作为开发中比较常用的一个javascript工具库,提供了一套丰富的函数式编程功能,该库并没有拓展原有的javascript原生对象,而是在自定义的_对象上,提供了100多个方法函 ...
- 语音卡开发系列: LightweightCTI架构设计(作者:东成西就)
//评注:这是一位朋友的关于语音卡开发的开源框架,历时约一年.初步在.net实现,并有实用案例.后期希望开源并借助大家的力量完成c++,delphi的版本.其目的是使开发爱好者从某个台阶起步,更快的进 ...
- 怎样学习计算机动漫与游戏设计6,计算机动漫与游戏制作专业系列教材·动画设计软件应用:Flash CS6(第3版)...
<计算机动漫与游戏制作专业系列教材·动画设计软件应用:FlashCS6(第3版)>是计算机动漫与游戏制作专业系列教材,根据<中等职业学校计算机动漫与游戏制作专业教学标准>编写. ...
- 重复造轮子系列——基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印...
重复造轮子系列--基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印 一.引言 桌面端系统经常需要对接各种硬件设备,比如扫描器.读卡器.打印机等. 这里介绍下桌面端 ...
最新文章
- 【安全牛学习笔记】字典、在线密码破解-hydra
- 【Linux入门到精通系列讲解】系统调用和库函数路径
- linux查看nginx、apache、php、php-fpm、mysql及配置项所在目录
- Netbeans8下 Weblogic EJB案例
- zanli_android_1.1.0,【轻松集赞】写了个涉嫌混淆微信官方服务的小程序
- Android基于Glide的二次封装,借鉴Glide思想二次封装Fresco
- vscode怎么连接mysql_如何在VSCode连接使用MySQL数据库?
- 大批量安装系统的解决方案(集锦)
- Bootstrap页面布局18 - BS导航路径以及分页器
- 如何将response里header的date转化为当地时间_将产品20元利润提升到2000元,靠的是卖体验!...
- 3810.最长连续休息时间-AcWing题库
- NoSQL 数据库的使用场景
- 【转】C/C++中宏使用总结
- 【Driver】协作安装程序
- python 儿童教程_教孩子学编程PYTHON语言版PDF_Python教程
- macos复制粘贴快捷键 快速_Mac复制粘贴快捷键怎么修改 Mac复制粘贴快捷键修改步骤...
- eclipse转Androidstudio AAPT: error: file failed to compile.
- excel实现分组合并后居中
- 数据库CAST()函数,格式(CAST AS decimal)
- PS给照片添加镜头梦幻光斑动态图片效果
热门文章
- java 二分查找
- C语言scanf fgets,C语言中输入函数(scanf()、fgets()和gets())的区别详解
- python中module用法_Python学习之module用法
- php 取对象数据_过程式编程和面向对象编程有什么区别?怎么理解php对象的概念?...
- python运行完不能显示图_Python Pygame无法正确显示图像
- python bottle部署g_python web(bottle框架)之环境搭建
- pythonfor循环嵌套_python-嵌套和for循环中的字典和列表中的项...
- spring-gateway(一)Reactor编程基础
- c++链表形参丢失_LeetCode 例题精讲 | 01 反转链表:如何轻松重构链表
- lotus php,LotusPhp框架目录_PHP教程