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中实现父选择器效果这篇文章. 简单来说这个实现并不是真正的父元素选择器,只是利用其它思路来 ...
随机推荐
- C文件函数总结
1.fopen(打开文件) 表头文件 #include<stdio.h> 定义函数 FILE *fopen(const char * path,const char * mode); pa ...
- C++封装常用对象和对头文件探索
在C++实际开发中,难免会使用到一些你极为常用的算法(比如笔者经常使用的多线程技术),实现这些算法的类或是全局函数或是命名空间等等经常都要被使用多次,你会有哪些办法来使用呢?笔者有4个办法. 第一个方 ...
- 如何根据Jquery实现两级联动
<script language="javascript" type="text/javascript" > $(function (){ ...
- IOC-控制反转(Inversion of Control),也成依赖倒置(Dependency Inversion Principle)
基本简介 IoC 亦称为 “依赖倒置原理”("Dependency Inversion Principle").差不多所有框架都使用了“倒置注入(Fowler 2004)技巧,这可 ...
- [javascript]事件冒泡处理
<!DOCTYPE html> <html> <head> <style type="text/css"> #box1 { widt ...
- HTTP协议学习-01
在学习一门新知识前还是先了解一下这个知识的一点点背景吧! http是属于协议层当中的最顶层的应用层,的面向对象的协议:它于 1990 年提出, 经过几年的使用与发展, 得到不断地完善和扩展. 目前在 ...
- 转:如何创建.htaccess文件
方法1.开始-运行-键入cmd,打开cmd窗口 此时的cmd窗口路径是C:\Documents and Settings\username> 键入以下(不包括括号内信息): copy con . ...
- 开发者应该避免使用的6个Java功能(转)
本文作者是一名拥有多年Java开发经验的程序员,他从经验中得出,并不是所有的Java SE功能/API都值得程序员去使用,比如本文列举的这6个,大家在使用前得慎重对待.以下是对原文的摘译. 多年的Ja ...
- 学渣上手 LaTeX 完成毕业论文
学渣上手 LaTeX 完成毕业论文 作为一个标准的学渣,虽然经历了一系列变故但最终还是使用 LaTeX 完成了我的毕业论文.要问我感想的话,就是——如果没有做好迎接比较陡峭的学习曲线以及各种打击人的小 ...
- LeetCode——Two Sum
Given an array of integers, find two numbers such that they add up to a specific target number. The ...