Verilog中锁存器与多路选择器

  • Verilog是一种硬件描述语言,它代表的是硬件。

  • Verilog代表的就是逻辑门和连接线。

  • 对于一个always@(*)控制的块而言,只要块中的表达式包含的任意的一个变量发生变化时,这个块都会被重新读取。

锁存器


always块不完整的敏感信号列表

if-else不完整结构

case忽略某些值

assign语句锁存器

只对电平敏感(不考虑posedge和negedge边沿敏感),且always块中的敏感变量表中没有包含在块中出现的所有变量(称为不完整的敏感变量表),那么这个块的功能就是某种类型的锁存器;

拥有完整的敏感变量列表则表明这是一个由组合们或者多路选择器等组合而成的组合逻辑电路。

但如果控制条件中包含的if或cace忽略掉了某些值的话,那么即使敏感变量是完整的,也有可能出现锁存的状态。

代码段一


always@(a,b,sel)
if(sel == 1'b1)
z = a;
else
z = b;

代码段二


always@(*)
if(sel == 1'b1)
z = a;
else
z = b;

代码段三


always@(sel)
if(sel == 1'b1)
z = a;
else
z = b;

代码段四


always@(a,b)
if(sel == 1'b1)
z = a;
else
z = b;

代码段一、二代表多路选择器,因为

[1] 表达式中的所有变量都被包含在了敏感信号表中(完整的敏感变量列表)

[2] if中的每一个选项都被赋给了一个输出(z)。

代码段三、四代表两种不同的锁存器,当敏感表中的变量不发生变化时实现锁存。

没有控制结构的非标准锁存器


always@(a,v)
z = a | b;

b值的变化对z的锁存并无影响,这种类型的锁存器通常是由敏感变量表中的输入错误造成的。

透明锁存器(可综合的推荐写法)


always@(*)
if(sel == 1'b1)
Q = D;

连续赋值的可综合锁存器


assign Z = (sel == 1'b1) ? D : Z;

避免锁存器


采用组合逻辑实现的锁存器的时序(包括可能出现的毛刺)容易出现问题。为了避免这些问题,应采用时钟控制结构(即触发器)二不是由使能控制的结构(即透明锁存器)来保存数据,避免使用锁存器。

参考资料


[1] Verilog数字VLSI设计教程 [美] John Williams 著 李林 等译

Verilog中锁存器与多路选择器的更多相关文章

  1. 关于verilog中if与case语句不完整产生锁存器的问题 分类: FPGA 2014-11-08 17:39 260人阅读 评论(0) 收藏

    在很多地方都能看到,verilog中if与case语句必须完整,即if要加上else,case后要加上default语句,以防止锁存器的发生,接下来就来说说其中原因. 一,什么是锁存器?锁存器与触发器 ...

  2. 多路选择器实现总线结构——Verilog

    ////////////////////////////////////////////////////////////////////////////////// //该程序完成通过多路选择器MUX ...

  3. Verilog中的UDP

    概述 Verilog HDL语言提供了一种扩展基元的方法,允许用户自己定义元件(User Defined Primitives,UDP).通过UDP,可以把一块组合逻辑电路或者时序逻辑电路封装在一个U ...

  4. 关于Verilog 中的for语句的探讨

    在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Test ...

  5. verilog中的latch到底是个啥??简直快疯了!!!!!

    在很多地方都能看到,verilog中if与case语句必须完整,即if要加上else,case后要加上default语句,以防止锁存器的发生,接下来就来说说其中原因. 一,什么是锁存器?锁存器与触发器 ...

  6. system verilog中的跳转操作

    在verilog中,使用disable声明来从执行流程中的某一点跳转到另一点.特别地,disable声明使执行流程跳转到标注名字的声明组末尾,或者一个任务的末尾. verilog中的disable命令 ...

  7. system verilog中的类型转换(type casting)、位宽转换(size casting)和符号转换(sign casting)

    类型转换 verilog中,任何类型的任何数值都用来给任何类型赋值.verilog使用赋值语句自动将一种类型的数值转换为另一种类型. 例如,当一个wire类型赋值给一个reg类型的变量时,wire类型 ...

  8. 一段比较有意思的代码——介绍system verilog中的新增幅值语句

    system verilog中新加了很多幅值语句,虽然都只适用于阻塞幅值,但是在某些场合中非常实用. 下面是一段有意思的代码,覆盖了一些用法. package definitions; typedef ...

  9. CSS中模拟父元素选择器

    很多情况下,我们需要找到父元素,但可惜的是css中并没有这样的一个选择器. 至于原因可以看张鑫旭的如何在CSS中实现父选择器效果这篇文章. 简单来说这个实现并不是真正的父元素选择器,只是利用其它思路来 ...

随机推荐

  1. Android Studio删除Project

    最直截了当的方法是在Project所在目录直接删除整个Project,然后再次打开Android Studio的欢迎界面中把光标移到你的Project上,然后按键盘上的Delete键即可! 参考自st ...

  2. inputtype

    <EditText android:layout_width="fill_parent" android:layout_height="wrap_content&q ...

  3. 【USACO 2.4.2】穿越栅栏

    [描述] 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找 ...

  4. Win7下启用IIS7

    1.进入“控制面板-->程序”: 2.点击“打开或关闭Windows功能” 3.选择“Internet信息服务”相关选项,如下: 点击“确定”后,请稍等.. 5.启用成功后,可在浏览器访问:ht ...

  5. Sql 格式化工具

    SQL Pretty Printer:目前提供4种使用方式,桌面版本,SSMS(SQL Server Management Studio)插件,VS插件,和提供API接口. SQL Pretty Pr ...

  6. 转发:[Python]内存管理

    本文为转发,原地址为:http://chenrudan.github.io/blog/2016/04/23/pythonmemorycontrol.html 本文主要为了解释清楚python的内存管理 ...

  7. Kafka笔记--指定消息的partition规则

    参数的设定:参考资料 不错的资料:http://blog.csdn.net/honglei915/article/details/37697655 http://developer.51cto.com ...

  8. SQL中 WHERE与HAVING的区别

    SQL语句中的Having子句与where子句之区别 在说区别之前,得先介绍GROUP BY这个子句,而在说GROUP子句前,又得先说说“聚合函数”——SQL语言中一种特殊的函数.例如SUM, COU ...

  9. MySQL重置root密码的几种方法(windows+Linux)

    重置root密码的方法: windows系统下:1.停止mysql服务:2.新建文件init-root.txt,写上如下内容: update mysql.user set password = pas ...

  10. keil优化论

    谈到优化,其实很多人都哭笑不得,因为在一个C51软件工程师的生涯中,总要被KEIL的优化耍那么一次到几次.我被耍过,想必看着文章的你也被耍过,如果你回答说不,那只能说你写的C51程序不多! 看看KEI ...