目录

抛砖引玉

个人总结

麻烦的设计


抛砖引玉

假设您正在建立一个电路来处理游戏的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的组合逻辑?相关推荐

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

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

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

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

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

  4. HDLBits 系列(7)对for循环以及generate for的各种实践

    目录 抛砖引玉 累加模型 纹波进位加法器 写在最后 抛砖引玉 本节内容主要讲解for和generate for的用法,这两个用法,之前也有写过: Verilog中关于for与generate for用 ...

  5. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据 ...

  6. 打造属于自己的underscore系列 ( 一 ) - 框架设计

    underscore作为开发中比较常用的一个javascript工具库,提供了一套丰富的函数式编程功能,该库并没有拓展原有的javascript原生对象,而是在自定义的_对象上,提供了100多个方法函 ...

  7. 语音卡开发系列: LightweightCTI架构设计(作者:东成西就)

    //评注:这是一位朋友的关于语音卡开发的开源框架,历时约一年.初步在.net实现,并有实用案例.后期希望开源并借助大家的力量完成c++,delphi的版本.其目的是使开发爱好者从某个台阶起步,更快的进 ...

  8. 怎样学习计算机动漫与游戏设计6,计算机动漫与游戏制作专业系列教材·动画设计软件应用:Flash CS6(第3版)...

    <计算机动漫与游戏制作专业系列教材·动画设计软件应用:FlashCS6(第3版)>是计算机动漫与游戏制作专业系列教材,根据<中等职业学校计算机动漫与游戏制作专业教学标准>编写. ...

  9. 重复造轮子系列——基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印...

    重复造轮子系列--基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印 一.引言 桌面端系统经常需要对接各种硬件设备,比如扫描器.读卡器.打印机等. 这里介绍下桌面端 ...

最新文章

  1. 【安全牛学习笔记】字典、在线密码破解-hydra
  2. 【Linux入门到精通系列讲解】系统调用和库函数路径
  3. linux查看nginx、apache、php、php-fpm、mysql及配置项所在目录
  4. Netbeans8下 Weblogic EJB案例
  5. zanli_android_1.1.0,【轻松集赞】写了个涉嫌混淆微信官方服务的小程序
  6. Android基于Glide的二次封装,借鉴Glide思想二次封装Fresco
  7. vscode怎么连接mysql_如何在VSCode连接使用MySQL数据库?
  8. 大批量安装系统的解决方案(集锦)
  9. Bootstrap页面布局18 - BS导航路径以及分页器
  10. 如何将response里header的date转化为当地时间_将产品20元利润提升到2000元,靠的是卖体验!...
  11. 3810.最长连续休息时间-AcWing题库
  12. NoSQL 数据库的使用场景
  13. 【转】C/C++中宏使用总结
  14. 【Driver】协作安装程序
  15. python 儿童教程_教孩子学编程PYTHON语言版PDF_Python教程
  16. macos复制粘贴快捷键 快速_Mac复制粘贴快捷键怎么修改 Mac复制粘贴快捷键修改步骤...
  17. eclipse转Androidstudio AAPT: error: file failed to compile.
  18. excel实现分组合并后居中
  19. 数据库CAST()函数,格式(CAST AS decimal)
  20. PS给照片添加镜头梦幻光斑动态图片效果

热门文章

  1. java 二分查找
  2. C语言scanf fgets,C语言中输入函数(scanf()、fgets()和gets())的区别详解
  3. python中module用法_Python学习之module用法
  4. php 取对象数据_过程式编程和面向对象编程有什么区别?怎么理解php对象的概念?...
  5. python运行完不能显示图_Python Pygame无法正确显示图像
  6. python bottle部署g_python web(bottle框架)之环境搭建
  7. pythonfor循环嵌套_python-嵌套和for循环中的字典和列表中的项...
  8. spring-gateway(一)Reactor编程基础
  9. c++链表形参丢失_LeetCode 例题精讲 | 01 反转链表:如何轻松重构链表
  10. lotus php,LotusPhp框架目录_PHP教程