当前课程知识点:IC设计与方法 >  3、Verilog语法 >  e)Assign 举例 >  3-1-5 Assign 举例

返回《IC设计与方法》慕课在线视频课程列表

3-1-5 Assign 举例在线视频

3-1-5 Assign 举例

下一节:3-1-6 Always

返回《IC设计与方法》慕课在线视频列表

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语句这样一个关键字和等号

来实现一个连续赋值语句

它实现的电路是什么呢

实现的是一个可以用布尔函数

所描述的任意复杂度的组合逻辑电路

在使用的过程中

我们一定要注意

要避免出现这种反馈情况

把组合逻辑电路变成了时序逻辑电路

在连续赋值语句的内部的电路设计过程中

或者说赋值的等号的右面

我们可以用一些算术操作或者是关系操作

来实现比较复杂的高层的抽象电路

每一个操作可能实际上都映射出一个子电路

IC设计与方法课程列表:

课程准备:Quartus II软件的下载

-软件下载说明

--Quartus II软件下载教程

1、集成电路的发展

-a) 集成电路的应用及市场

--1-1集成电路应用及市场

-a) 集成电路的应用及市场--作业

-b)集成电路的制造过程

--1-2 集成电路的制造过程

-b)集成电路的制造过程--作业

-c)从CPU的发展看IC的进展

--1-3从CPU的发展看IC的进展

-c)从CPU的发展看IC的进展--作业

-d)从行业的发展看IC的进展

--Video

-d)从行业的发展看IC的进展--作业

-e)从ISSCC看IC的发展方向

--讲课视频

-e)从ISSCC看IC的发展方向--作业

2、数字集成电路设计方法

-a)数字系统的实现方法 (ASSP/FPGA/ASIC的对比)

--讲课视频

-a)数字系统的实现方法 (ASSP/FPGA/ASIC的对比)

-b)组合逻辑电路

--Video

-2、数字集成电路设计方法--b)组合逻辑电路

-c)时序逻辑电路(1)

--2-3时序逻辑电路的设计方法 (一)

-d)时序逻辑电路(2)

--2-3时序逻辑电路的设计方法 (二)

-2、数字集成电路设计方法--d)时序逻辑电路(2)

3、Verilog语法

-a)Verilog的历史和学习要点

--讲课视频

-b)端口、信号及数据类型

--讲课视频

-b)端口、信号及数据类型--作业

-c)逻辑电平及数据操作

--讲课视频

-3、Verilog语法--c)逻辑电平及数据操作

-d)Assign 语句

--3-1-4assign语句

-e)Assign 举例

--3-1-5 Assign 举例

-f)Always

--3-1-6 Always

-f)Always--作业

-g)阻塞与非阻塞赋值

--Video

-3、Verilog语法--g)阻塞与非阻塞赋值

-h)D触发器的描述

--Video

-i)时序电路的设计

--Video

-i)时序电路的设计--作业

-j) 面向测试的Verilog语法(1)

--3-3-1面向测试的Verilog语法(1)

-k) 面向测试的Verilog语法(2)

--3-3-2 面向测试的Verilog语法(2)

-k) 面向测试的Verilog语法(2)--作业

4、电路设计实例

-a)电路设计实例1

--Video

-b)电路设计实例2

--讲课视频

-b)电路设计实例2--作业

-c)电路设计实例3

--讲课视频

5、Modelsim仿真工具

-Modelsim仿真

--Modelsim仿真

6、Quartus工具

-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)--作业

3-1-5 Assign 举例笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。