Verilog中锁存器与多路选择器
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中锁存器与多路选择器的更多相关文章
- 关于verilog中if与case语句不完整产生锁存器的问题 分类: FPGA 2014-11-08 17:39 260人阅读 评论(0) 收藏
在很多地方都能看到,verilog中if与case语句必须完整,即if要加上else,case后要加上default语句,以防止锁存器的发生,接下来就来说说其中原因. 一,什么是锁存器?锁存器与触发器 ...
- 多路选择器实现总线结构——Verilog
////////////////////////////////////////////////////////////////////////////////// //该程序完成通过多路选择器MUX ...
- Verilog中的UDP
概述 Verilog HDL语言提供了一种扩展基元的方法,允许用户自己定义元件(User Defined Primitives,UDP).通过UDP,可以把一块组合逻辑电路或者时序逻辑电路封装在一个U ...
- 关于Verilog 中的for语句的探讨
在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Test ...
- verilog中的latch到底是个啥??简直快疯了!!!!!
在很多地方都能看到,verilog中if与case语句必须完整,即if要加上else,case后要加上default语句,以防止锁存器的发生,接下来就来说说其中原因. 一,什么是锁存器?锁存器与触发器 ...
- system verilog中的跳转操作
在verilog中,使用disable声明来从执行流程中的某一点跳转到另一点.特别地,disable声明使执行流程跳转到标注名字的声明组末尾,或者一个任务的末尾. verilog中的disable命令 ...
- system verilog中的类型转换(type casting)、位宽转换(size casting)和符号转换(sign casting)
类型转换 verilog中,任何类型的任何数值都用来给任何类型赋值.verilog使用赋值语句自动将一种类型的数值转换为另一种类型. 例如,当一个wire类型赋值给一个reg类型的变量时,wire类型 ...
- 一段比较有意思的代码——介绍system verilog中的新增幅值语句
system verilog中新加了很多幅值语句,虽然都只适用于阻塞幅值,但是在某些场合中非常实用. 下面是一段有意思的代码,覆盖了一些用法. package definitions; typedef ...
- CSS中模拟父元素选择器
很多情况下,我们需要找到父元素,但可惜的是css中并没有这样的一个选择器. 至于原因可以看张鑫旭的如何在CSS中实现父选择器效果这篇文章. 简单来说这个实现并不是真正的父元素选择器,只是利用其它思路来 ...
随机推荐
- IE layout详解
引言: Internet Explorer 中有很多奇怪的渲染问题可以给他一个”layout”得到解决,John Gallant 和 Holly Bergevin把他归类为“dimensional b ...
- 错误:Duplicate interface definition for class
错误: Duplicate interface definition for class "类名称" 原因:在工程中有相同的文件或相同的 @interface 类名称 解决办法: ...
- Python datetime time 常用操作
测试版本: Python 2.7 获取当前时间的两种方法 import datetime,time now = time.strftime("%Y-%m-%d %H:%M:%S") ...
- 关于PHPstorm 使用技巧
慢慢更新,一点点积累,都是自己在使用中遇到的问题 设置:(2016.4.15) 1:注释模板,phpstorm 有非常强大的注释模板,可以根据自己的需求随时更改,并设置快捷键,非常方便 新文件注释 P ...
- 常用命令(ubuntu)
1.打开终端的方法 Ubuntu 中按左侧栏的第一个“面板主页(Dash 主页)”(可以按win键调出),在里面输入terminal可以打开终端,另外打开终端的快捷键是Ctrl+Alt+T 2.修改用 ...
- 周赛F题 POJ 1458(最长公共子序列)
F - F Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Description ...
- Scut:通用配置管理器
1. 配置节 ConfigSection private List<ConfigNode> _configNodes; public class ConfigNode { public C ...
- IOS--UIActivityIndicatorView的使用方法详细
IOS--UIActivityIndicatorView的使用方法详细 // UIActivityIndicatorView的常用方法 活动指示器,就是旋转进度轮 UIActivityIndica ...
- java web 组件Listenter(一)
JavaWeb中监听器的事件源(ServletContext.HttpSession.ServletRequest.JavaBean) 1.ServletContext 生命周期监听:ServletC ...
- 转:Node.js异步处理CPU密集型任务的新思路
原文来自于:http://www.infoq.com/cn/articles/new-idea-of-nodejs-asynchronous-processing-tasks?utm_source=i ...