当前课程知识点:IC设计与方法 >  4、电路设计实例 >  a)电路设计实例1 >  Video

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

Video在线视频

Video

下一节:讲课视频

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

Video课程教案、知识点、字幕

我们已经学习完了Verilog语法的

一些基本的知识

学会了怎么描述

或者说设计一个电路

以及怎么对电路进行测试

我们下面我们再来看一下实际的

几个电路设计的例子

(例子的)电路跟我们实际电路的设计

跟我们前面讲的语法知识相似

也分为两大类

一个是组合逻辑电路

一个是时序逻辑电路

时序逻辑电路

我们也会分为

简单的时序逻辑电路和复杂的时序逻辑电路

我们首先来回顾一下组合逻辑电路的设计

组合逻辑电路按照设计的过程

大概分为几大步

用硬件描述语言来进行设计的话

大致可以说有三大步

第一步是确定电路的外特性

也就是电路有哪些输入和输出信号

第二步是描述电路的内特性

也就是说

要描述电路的输入和输出之间的关系

在描述电路的内部特性的时候呢

我们通常有几种手段

一个是用函数

或者说结构去描述出y=f(x)这样的一个关系

例如下面这张图

如果Y=ABB+CD这样一个逻辑函数

我们描述出来的话

(就)完成了电路的描述

第二种是用真值表的方式

第三种是用流程图

数据流图的方式

把电路的功能给它描述出来

描述完以后

第三步就是写代码

通过把电路的代码描述出来

就完成了我们的设计过程

最后是由EDA软件是把具体的

电路设计出来

我们来看一下

如果我们的电路能够用

逻辑函数表示出来

对应的我们通常用assign语句就可以很简洁的

把电路描述出来

代码就会写出来

如果我们的电路是一个真值表

或者说对电路功能的描述

我们是用一个真值表表述出来的

那么对应它实现的时候

电路结构

如果让大家画一张图的话

这样的电路的结构通常就是一个多路选择器

一个有多输入的多路选择器

构成的(电路)

在描述的时候我们常见的

手段是用always语句块

里面的case语句去描述出

这个组合逻辑的功能

如果组合逻辑不适合用

前面两种手段描述的话

我们通常可以用一个流程图

把它表示出来

或者说用类似这样的数据流图

我们称之为数据流图的

方式描述出数据怎么一步一步的

经过哪些电路模块

或者经过哪些逻辑运算得到输出结果

如果是这样的数据流图

我们在描述这段组合逻辑电路的时候

通常用一个always语句块

在语句块内呢

是用if-else语句的嵌套以及里面的加减乘

或者是类似这样的一些赋值语句

或者是逻辑运算

组合这些语句所构成的

总而言之我们在描述

这些组合逻辑电路的时候

常见有这几种类型

描述的语句针对不同类型

我们相应的使用这三种描述风格进行描述

对于时序逻辑电路

如果是一个简单的时序逻辑电路

我们大致有四大步

第一个还是一样

和前面几个组合逻辑电路相类似

我们确定电路

有哪些输入和输出信号

以及确定这个电路(需要)用时序逻辑电路

也就是有限状态机进行表述的时候

它需要有几个状态

以及状态间的转移关系

我们画出状态转移图

或者是状态转移表

完成第二步以后

我们对电路的描述基本算是做完了

下一步我们要把电路实现出来

实现的时候

对于初学者而言

我们通常建议画出电路的结构图

也就是说实现这个有限状态机的时候

它最终实现完了以后

电路长的是什么样子

这样会加深我们对代码和电路的理解

画出电路结构图以后

最后用Verilog代码把电路表述出来

这是简单时序逻辑电路的设计的四个步骤

在这里面电路图长的是什么样子呢

这张图是我们前节课里面提到过的

是由一个D触发器加上两个组合逻辑电路构成的

D触发器描述了我们电路的

或者说保存了我们电路的状态

前面的组合逻辑电路一

也就是状态计算逻辑

又称为状态计算逻辑

它负责根据电路的当前状态current state

以及电路的输入

计算出我们电路的next state(下一个状态)是什么

然后在时钟的有效沿到来的时候

把next state打入到状态寄存器

把next state变成了current state.

组合逻辑电路2又称为输出逻辑

它根据电路的当前状态以及

电路的输入信号计算出当前状态的输出

如果这根虚线存在的话

那么是一个milly状态机

如果不存在

就是一个Moore状态机

我们来看一个实际的电路的例子

一个序列发生器

对于序列发生器

它的设计需求是什么呢

序列发生器电路是比较简单的

可以认为是没有输入信号

没有特定的控制信号

只有时钟信号和复位信号

它在每一个状态

或者说每一个时钟周期产生一个固定的输出

整个序列有一个序列的周期

然后在这个周期完了以后

它会重复不断地产生一个固定的序列的输出

以我们这个例子为例

它要重复不断的产生01001011001这样一个序列

序列周期是11

对于这样一个序列发生器

我们可以先确定电路的外特性

或者电路有哪些输入和输出

从前面的文字描述

我们知道电路的输出只要产生一个一位的信号

我们起个一位的名字dout就可以

但作为一个完整的电路

通常我们还做一个完整的时序电路

我们还要给它clk信号和reset信号

我们可以用

这样的图来描述这个电路的外特性

以及它有哪些输入和输出信号

第二步

就是要设计我们这个电路了

因为这个电路非常简单

我们可以把它归成是一个简单的时序逻辑电路

或者说用一个有限状态机就可以表述了

这个有限状态机

假设初始状态是一个零状态

零状态作为一个初始状态

在初始状态的时候

每一个状态产生这个序列周期里面的

一个输出值

这样我们大家就知道了

用一个11状态的有限状态机就可以完成了

状态转换的时候

也是无条件的从状态0到状态1到状态2到状态3

一直到状态10

再回到状态0的转换过程

是没有转换条件的

在每个状态

固定的产生一个输出

在这里面

由于我们画图不太方便

按理说

如果用摩尔状态机来实现的时候

输出信号直接放到状态里边就可以了

表示在当前状态它的输出始终是固定不变的

换句话说

这个输出值在当前状态电路的

输出是根当前状态的输入是没有关系的

只跟当前的状态值有关系

所以这是摩尔状态机的表示方式

完成了状态机的表述以后

下面我们就要画出电路的结构图

那么这个结构图就是我们前面的

最原始结构图的变形

中间是一个寄存器

一组寄存器

保存我们的电路状态

左边要有一个状态计算逻辑

根据电路的当前状态current state

决定电路的下一个状态是什么

在这张图里边

我们可以看到

如果当前状态是0的话

下一个状态是1

当前状态是1的话

下一个状态是2

依次往下推

推的话

我们大致就可以知道

左边这个状态寄存器

状态计算逻辑,它实现的时候

基本上就是一个多路选择器

多路选择器对应的就是一个case逻辑

左边是一个状态计算逻辑

最右边是一个状态输出逻辑

状态输出逻辑是

根据当前状态直接产生出电路的输出

并不需要把外面的输入信号再送进来

这也是一个标准的摩尔状态机

那么这个输出逻辑我们看一下

在当前状态是0的时候

输出0

当前状态是1的时候输出1

依次往下去推

也就是说它能够循环的

产生01001011001这样的周期是11的

这样一个序列

这就是我们要实现的电路图的结构

针对这种结构

我们可以看到

里面有两个组合逻辑电路

加上一个D触发器这样的时序逻辑电路

所以我们在描述的时候

可以用三个过程去描述它

一个过程描述状态计算逻辑

一个过程描述状态寄存器

一个过程描述输出逻辑

这是最标准的描述方式

下面我们看一下代码

我们看一下,这是序列发生器的四部分代码

四部分代码里边,实际上根据刚才的图里边

我们应该有三个always进程

一二三个always进程分别描述两个组合逻辑

和一个状态计算逻辑

另外

作为一段完整的代码

我们把前面的module

也就是电路的外特性也给出来了

在后面的

例子里,我们就不再描述电路的外特性了

我们首先看一下模块的名字叫Gen

用来产生序列

模块有两个输入信号

clock和rstn

以及一个输出信号dout

这里边呢

我们用了一种比较新的描述方式

我们在定义reset

clock和out的时候

直接把信号的输入输出方式

以及信号的wire

reg类型放在module

定义的括号里了

这也是一种描述风格

大家可以学一下

将来你也可以使用这种风格

或者能够看懂这种风格

在这里边

由于dout信号是

由一个always块产生的dout信号

所以dout信号在这里边定义的时候

需要定义成是reg类型

我们电路里边的

current state和next state信号也都是

由两个always块来产生的

所以它们也都需要定义成是reg类型

我们可以看到current state信号

它是一个寄存器的输出

对吧 从这个地方可以看出

这个always块

描述的是D触发器类型的电路

所以current state对应的是一个D触发器的输出

Next state是一个组合逻辑电路的输出

也就是说current state和next state信号

分别是组合逻辑电路的输出和时序逻辑电路输出

但在信号定义的时候呢

都要定成是reg信号

进一步说明了reg信号在描述的时候

只要看我们信号

只要是always语句产生的输出信号

都要定义成reg信号

跟我们具体的电路的属性

到底是组合逻辑电路还是时序逻辑电路

是没有任何关系的

这是电路的端口描述部分

我们再来看一下

详细看一下三个进程

第一个进程是寄存器

或者说状态寄存器的进程

在时钟的上升沿以及复位信号的下降沿动作

一看到

我们从分析电路的角度来看

一看到always语句后边的

敏感表里面描述的是信号的边沿

我们就知道这个进程描述的

是一个D触发器类型的进程

由于这地方是下降沿

所以我们这里面先要判断异步复位信号

异步复位信号判断的时候

感叹号表示的是低电平有效的异步复位信号

在复位信号到来的时候

为reset复位一个初值0

然后else表示是时钟沿

在时钟有效沿到来的时候

把next state赋给current state

这个进程是一个时序逻辑进程

或者说一个状态机类型的进程

所以这里面的赋值语句

我们用的是非阻塞赋值语句

这是中间的触发器的进程

第二个进程

另外两个进程都是组合逻辑进程

组合逻辑进程的

敏感表里边我们就要把所有的

输入信号current state写在里边

根据当前状态来决定

这是状态计算逻辑

当前状态是0的时候

下一个状态是1

当前状态是1的时候

下一个状态是2

依次我们就把所有的状态转移

状态机表示出来了

最后我们还有一个default语句

记住

我们在描述组合逻辑电路的时候

一定要有default语句

不管是组合逻辑电路还是时序逻辑电路

通常我们都要把这个default语句给它加上

我们在描述组合逻辑电路的时候

我们一定要加上default语句

在default语句的时候

为next state复一个值

这样才能保证我们不会有漏写的分支

以确保我们这个电路描述的是组合逻辑电路

右边是输出计算逻辑电路

也是一个组合逻辑电路

描述风格跟左边是完全一样的

在当前状态是0的时候输出0

当前状态是1的时候输出1

这样描述完了以后,所有的状态

输出这么一个序列

同样我们也要把default分支给它写上

确保这个电路的特性是一个组合逻辑特性

而不会由于漏写了某个分支变成了时序逻辑

这是我们代码时候写的风格要求

注意

在右边这段代码里边

我们把always@后面的current state换成了一个*号

这是verilog的新的表述方式

用*号可以表示所有的输入信号

代表的是所有的输入信号

用这种方式可以防止我们在写代码的

时候漏写了某些信号

导致了电路的出错

导致电路的RTL级电路的

描述以及我们最终综合出来的电路

这两者行为之间的不一致

所以以后我们在分析代码的时候

也可以看

我们去分析这段代码的特性的时候可以去看

如果在always敏感表里边

有边沿语句的话

它一定是时序逻辑电路

有*号的话

一定是一个组合逻辑电路

或者说

如果是直接是电平类型的话

它也是组合逻辑电路

在现在的代码里

出现信号的可能性越来越小了

因为用“*”更简单

可以直接代表所有的信号

所以现在的新的Verilog代码

通常我们看到的是这种形式

完成了代码的描述以后

下面我们就要对代码进行仿真验证了

具体怎么仿真验证在相关的章节里面会去讲

我们这里面只看仿真的结果

这是用modelsim仿真这段代码所得到的结果

我们看一下

第一行是时钟信号

是一个周期性的时钟信号

第二行是复位信号

由于我们在这个设计里面

我们只截取了一段波形

所以前面复位的脉冲我们就没有看到

第四行是电路的当前状态

第三行是下一个状态

我们可以看到

当前状态是2的时候

下一个状态是3

当前状态是3的时候

下一个状态是4

所以这是符合我们设计的需求的

最后是在每个状态产生的输出信号

对应的是我们所需要的序列

这个序列,从状态机可以看到

到10状态以后

就会回到初始0状态

然后周而复始地运行

这就是一个简单的时序逻辑电路的设计过程

完成电路的外特性定义

有限状态机的表述

电路结构图的描述

以及RTL代码的编写

最终进行仿真验证

去验证电路的功能是不是符合我们的预期

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

Video笔记与讨论

也许你还感兴趣的课程:

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