当前课程知识点:IC设计与方法 > 3、Verilog语法 > e)Assign 举例 > 3-1-5 Assign 举例
前面我们说到连续赋值语句
可以用来设计简单的组合逻辑电路
下面我们来看一个比较简单的实际的例子
我们来设计一个奇偶校验位的产生电路
奇偶校验这种功能在电路设计里
是一种常见的电路
比如说我们在串行收发电路里
可能有些同学用过RS-232这样的异步通信电路
或者说在一些嵌入式系统的串行数据
通信里面经常会用到这样的通信电路
在通信过程中
保证通信的数据的可靠性和正确性
是非常重要的
因为有时候由于噪声等等各种原因
会造成传输的数据发生错误
我们这时候
就会用到奇偶校验电路
来检查发送的数据是不是错的
奇偶校验电路的功能
大致是这么一个功能
我们在连续发送的数据结束之后
再发送一个校验位
这个校验位的信息
表示的是前面的数据里边的1的个数
到底是奇数个还是偶数个
根据这种方式
来检查发送的数据是不是正确的
通常我们定义偶校验
就是说在数据发送结束之前
发送一个校验位
保证这个校验位一共有偶数个1
传统的设计方法是怎么设计呢
通常我们说根据输入的数据
假设我们输入的是一个4位的数据
根据4位数据去数一下
这4位数据里边1和0的个数
然后来决定到底输出是奇校验的1
还是输出一个偶校验的1
需求确定了以后
我们画出真值表
然后根据真值表再进行逻辑图、逻辑函数的优化
或者用卡诺图之类的(方法)进行优化
完成最终的电路的设计
如果用硬件描述语言怎么去做呢
我们回想一下
我们完成电路的功能需求定义以后
下面我们就要把电路功能表述出来
只需要把电路功能表述出来就行了
我们来看一下这段代码
左面的这段代码
我们的设计的电路的名字叫parity校验电路
它的输入输出信号有这么3个信号
输入的是input_bus
是一个8位信号
输出是一个偶校验位和一个奇校验位
就是表示这里面到底是奇数个1还是偶数个1
那么怎么产生呢
奇校验、偶校验
校验位的个数
我们通过把输入的8位信号做
异或运算就能够得到了
比如说把输入信号的第0位跟第1位
异或就能够判断出这里面到底有几个1
然后第二位第三位一直异或到第八位
也就是说
我们要做的事情就是把输入信号的8位信号
连续不断的去异或就可以产生偶校验位
那么怎么连续不断的异或
Verilog里面定义了归约操作
所以用这种方式表示就最简洁
当然不排除你可以写成
input_bus[7]异或上input_bus[6]
再异或上input_bus[5]
一直异或到input_bus[0]
这样也可以产生
产生了偶校验位以后
奇校验位是偶校验位的反
所以就是说
用偶校验位取个非以后就得到了奇校验位
这样就用两句话描述了校验电路
它的校验输出值是怎么产生出来的
具体这些逻辑函数是不是可以优化
或者说怎么优化才能得到更好的结果
这就不是我们设计人员该做的事情了
我们可以把这段代码丢给EDA工具
EDA工具就会帮我们根据这段代码
产生出具体的电路
并且对电路做优化
用一个最小代价的
性能最高的电路实现
我们所需要实现的功能
刚才这段代码
我们画出具体的电路来
大概就是这样一张电路
输入的8位信号
input_bus 8位信号
每两个、两个、两个进行异或
然后逐级逐级异或
最终产生出奇校验位信号及偶校验位信号
这就是我们刚才这段代码映射出来的
或者说设计出来的电路
长的大概就是这么一个样子
这里面
我们就要提出一些更新的要求了
刚才
我们只要求大家实现这个电路
现在我再要求大家
你怎么才能把这个电路做的面积最小
性能更高 速度更快
如果回到上一页幻灯片
我们想想看
我们只写了两行
从代码的角度来说
我们很难想象怎么修改
才能够让这个电路的性能能够变得更好
速度能够变得更快
但如果对着这个电路
我们就能够比较容易的去思考了
比如说从输入信号
从这个输入信号input_bus[0]
产生(输出)到奇校验信号
一共经过了一级门延时
两级门延时 三级门延时
一共经过三级门延时
才能产生出校验值的输出
如果要产生偶校验
还要再经过一级非门
也就是四级门延时才能输出
换句话说
如果我提一个新的要求
如果需要用三级门延时就产生偶校验位
应该怎么优化
根据这张图大家可以想
怎么去重新安排异或门
或者把异或门换成同或门
是不是就可以改变这种电路的实现方式
然后用更少的时间计算出输出值了
这就是说
我们分析电路性能
一定要基于电路图才能分析
而根据代码是很难直接看出电路的性能的
对我们设计人员就提出要求
你在写代码的时候
脑子里想的是这段代码
最终变成的电路结构图
大概是什么样子
我们再来看另一个例子
全加器 一位全加器
或者是多位全加器的设计
什么是全加器?
全加器就是可以把两个输入信号
进行相加的一个电路
如果只有两个信号
a、b两个信号进行相加
我们称之为叫半加器
全加器的意思就是说除了有a、b输入信号之外
还有一个进位(级联位)进来的输入信号
或者说全加器它是(可以)级连的
就是说可以由上一级全加器
给进来的一个信号
以及我们产生出的
它产生出
不但要计算出这个加法值
加法的和
还要产生出一个进位输出
送到下一级全加器
对于这样的电路
输入信号刚才我们已经说了
两个输入的操作数是a、b
以及进位输入产生计算出来的和
以及输出的cout
对于这样一个全加器
如果我们描述它的功能
用一条语句assign语句就可以表示出来了
把a、b和cin加起来
加出来这个值是一个矢量
矢量的低位部分我们赋给sum就可以了
矢量的最高位
就是产生出来的进位输出
这就是一个全加器的表述
在这里面
我们可以看到我们作为设计人员
我们在比较高的抽象层次进行了设计
用两个加法就表述出了电路内部的功能实现
我们作为设计人员
没有必要去把输出信号
跟输入信号之间的所有的逻辑关系
真值表列出来
节省了我们大量的时间
EDA工具
应该说EDA工具
会根据我们这样的一个描述
产生出具体的电路出来
这是一个1比特的全加器
或者说1位的全加器
把这个全加器的位宽拓宽到多比特的时候
比如说是一个4比特全加器的时候
我们对这段代码要做什么改动?
首先
我们把输入信号要定义成多位的信号
从原来的1比特的sum信号
变成了一个4位的信号
其他部分几乎不用改
输入信号还是a、b、cin
只有输出的sum发生了变化
对输入信号位宽
我们也要改成4位信号
在计算下面的全加器的时候
我们用了另一种赋值方式
另一种描述方式
这个方式跟左面的方式
其实是等价的方式
用这种方式
我们在后面会去讲
我们在这里面强调的是
大家看一下这两段代码
几乎是完全一样的
都是根据a、b、cin加起来以后
产生cout和sum
我们只是改变了信号的位宽
这也是Verilog语言它的优势所在
由于我们的设计是在比较高的抽象层次做的
当我们改变电路的某些功能需求的时候
比如位宽的时候
在代码上只要改几个数字就行了
软件会帮我们自动的把具体的电路产生出来
这样
我们的设计人员就可以
把注意力更关注到电路的功能
而不用去关注到电路实现的特别小的细节上
我们讲了连续赋值语句
可以用来实现比较简单的组合逻辑电路
在实际工程使用的时候
我们还要避免错误的使用连续赋值语句
因为我们在第一节课的时候讲过
电路可以分为组合逻辑电路和时序逻辑电路
当我们用连续赋值语句设计电路的时候
如果你用的不好
有可能你设计出来的
并不是一个组合逻辑电路
这就违反了你的设计的初衷
所以我们就要看在工程里面写完代码以后
我们要怎么去检查
避免设计电路是错的
我们来看这一页幻灯片
这里有一个例子
比如说我们的期望是把a和b相加
并把加完的结果又送给一个信号
这里面又送回到了a
如果这么写这句话
产生电路是什么样子
我们来分析一下
根据我们前面的描述
a加b就会映射出一个加法器出来
然后加法器的输出又被连回到了a
因为a是同名信号
在Verilog语言里同名的信号
我们就认为它是连在一起的
所以
电路就变成这样一个电路
大家看看这个电路有什么问题
电路的输出又被反馈回了输入
根据我们对组合逻辑电路
和时序逻辑电路的定义
当电路里面出现了一个反馈
这个电路就不是组合逻辑电路了
它到底是个什么东西
我们就不去管了
在工程里边我们通常是这么说的
当你发现一个电路有问题的时候
就可以不用再去追究
它到底会变成一个什么样的新的情况
(只需要)知道你的这种设计方法肯定是错的
直接去改正你的错误就可以了
所以
我们通常就不用再去检查这样以后
电路会变成什么样子
根据我们的经验
如果有这样一个反馈结构
这种反馈当然有可能是正反馈
也有可能是负反馈
通常这样一个电路就会变成
内部具有一个锁存器
或者说一个存储单元的电路
显然它就不再是一个组合逻辑电路了
所以我们在用assign语句的时候一定要记住
或者说在设计组合逻辑电路的时候要记住
我们电路的输出
不能再反馈回去
或者换句话说
从语法的角度来说
assign语句的输出信号跟输入信号
不能是同一个名字
否则就会把一个组合逻辑电路
变成一个时序逻辑电路
最后我们再来总结一下连续赋值语句
以及怎么用连续赋值语句来实现电路
首先连续赋值语句
它的形式是类似这么一个形式
有assign语句这样一个关键字和等号
来实现一个连续赋值语句
它实现的电路是什么呢
实现的是一个可以用布尔函数
所描述的任意复杂度的组合逻辑电路
在使用的过程中
我们一定要注意
要避免出现这种反馈情况
把组合逻辑电路变成了时序逻辑电路
在连续赋值语句的内部的电路设计过程中
或者说赋值的等号的右面
我们可以用一些算术操作或者是关系操作
来实现比较复杂的高层的抽象电路
每一个操作可能实际上都映射出一个子电路
-软件下载说明
-a) 集成电路的应用及市场
-a) 集成电路的应用及市场--作业
-b)集成电路的制造过程
-b)集成电路的制造过程--作业
-c)从CPU的发展看IC的进展
-c)从CPU的发展看IC的进展--作业
-d)从行业的发展看IC的进展
--Video
-d)从行业的发展看IC的进展--作业
-e)从ISSCC看IC的发展方向
--讲课视频
-e)从ISSCC看IC的发展方向--作业
-a)数字系统的实现方法 (ASSP/FPGA/ASIC的对比)
--讲课视频
-a)数字系统的实现方法 (ASSP/FPGA/ASIC的对比)
-b)组合逻辑电路
--Video
-2、数字集成电路设计方法--b)组合逻辑电路
-c)时序逻辑电路(1)
-d)时序逻辑电路(2)
-2、数字集成电路设计方法--d)时序逻辑电路(2)
-a)Verilog的历史和学习要点
--讲课视频
-b)端口、信号及数据类型
--讲课视频
-b)端口、信号及数据类型--作业
-c)逻辑电平及数据操作
--讲课视频
-3、Verilog语法--c)逻辑电平及数据操作
-d)Assign 语句
-e)Assign 举例
-f)Always
-f)Always--作业
-g)阻塞与非阻塞赋值
--Video
-3、Verilog语法--g)阻塞与非阻塞赋值
-h)D触发器的描述
--Video
-i)时序电路的设计
--Video
-i)时序电路的设计--作业
-j) 面向测试的Verilog语法(1)
-k) 面向测试的Verilog语法(2)
-k) 面向测试的Verilog语法(2)--作业
-a)电路设计实例1
--Video
-b)电路设计实例2
--讲课视频
-b)电路设计实例2--作业
-c)电路设计实例3
--讲课视频
-Modelsim仿真
-a)综合及相关基本概念
--Video
-a)综合及相关基本概念--作业
-b)综合及优化
--Video
-c)门级仿真
--门级仿真
-d)Quartus综合及分析(1)
--讲课视频
-e)Quartus综合及分析(2)
--讲课视频
-e)Quartus综合及分析(2)--作业
-f)Quartus综合及分析(3)
--Video
-g)Quartus综合及分析(4)
--Video
-g)Quartus综合及分析(4)--作业