当前课程知识点:IC设计与方法 >  4、电路设计实例 >  b)电路设计实例2 >  讲课视频

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

讲课视频在线视频

讲课视频

下一节:讲课视频

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

讲课视频课程教案、知识点、字幕

我们再看第二个例子

第一个例子的有限状态机

是一个最简单的有限状态机

没有任何输入信号

应该说是没有任何控制信号的输入

第二个例子稍微复杂一点

是一个密码锁

带有一个控制信号的输入

这个密码锁的要求非常简单

假设一个密码锁

我们顺序输入三位密码

当密码正确的时候

密码锁输出一个开锁脉冲

在这个例子里面

我们顺序输入三位的密码931以后

就能够输出一个开锁脉冲

我们下面来看一下这个电路如何设计

首先确定电路的外特性

相对刚才的简单的例子而言

除了rst信号和复位信号之外

我们还会为电路确定一个输入的密码

在这里面

密码是一个十进制密码

(每位密码)最大可能从0到9的十进制数

所以我们大致可以确定密码的

输入(位宽)需要一个四位的数据

它可以表示十六进制0到十六进制的F

密码锁的输出是一个一位的信号

result信号

表示是一个脉冲

下面我们来分析一下这个电路怎么做

直觉告诉我们

对于这样一个电路

我们大致还是用一个有限状态机就可以完成了

然后输出一位信号就可以

有限状态机

大致需要几个状态?

通常对于有限状态机

对于这样的电路

我们知道931

输入三位数就可以完成一次密码判断

所以感觉上可能用三个状态就可以完成了

实际上对于这个电路我们有两种设计方法

如果是用Mealy状态机来进行设计的话

我们用三个状态就够了

如果用Moore状态机的话

或者说用Moore或者

Moore状态机大致三到四个状态

就可以实现这个电路

具体用Moore还是Mealy状态机

这两种状态机在实现的结果上会有微小的差别

我们先用其中的一种方法来实现

我们大致这么分析一下

我们假设用三个状态来实现

在0 1 2状态分别顺序完成三个密码的输入

并且进行判断

在第三个状态

也就是S2状态的时候

如果输入的密码是正确的话

我们就输出一个开锁脉冲

如果输入的密码是错误的话

我们就直接输出一个0电平

也就是锁不打开

并且直接回到初始状态

如果根据这种描述方式

就可以知道我们用的是一个Mealy状态机

因为在S2状态我们要根据不同的

输入条件来决定电路产生不同的输出

这是我们最终画完的有限状态机

在S0状态

也就是初始状态

如果输入了一个9

输入了正确的9

我们就进入到了S1状态

去判断下一位密码

下一位密码如果是3

我们就进入到了正确的状态

S2状态

再等待最后一轮的密码

如果最后一位密码是1

我们回到初始状态

但是在回到初始状态的过程中

我们要输出一个开锁脉冲1

这是在正确的情况下

密码输入正确的情况下

我们按照这个状态转移图来走

在中间的任何一个环节

如果密码输入错误

比如说在第一环节密码输入的不是9

还是回到初始状态等待

在第二个环节

如果密码输入的不是3的话

也回到初始状态

重新输入密码

这就是有限状态机的表述

完成这张图以后

应该说我们的设计人员的

设计工作基本上就到此为止了

下面

我们就要完成电路的描述

用Verilog把这个有限状态机表述出来

并且用电路实现出来

作为初学人员

我还是要求大家先把这个电路所对应的

电路图表示出来

然后再描述

或者说在写Verilog代码之前

我们要先把电路给它画出来

这里面

我们不但画出电路的

最初的简单的描述图

我们还把详细的结构图画出来了

大家看一下

上面这张图是有限状态机实现的

结构示意图

不管什么样的电路

长的都是这个样子

中间是状态存储逻辑

是一堆D触发器器

用来保存current state

左边是状态计算逻辑

右边是输出逻辑

我们来看一下详细的计算逻辑

在这个状态计算逻辑里面

我们首先根据current state来判断

如果current state,对于刚才的状态机

刚才的是状态转换图

如果current state是S0的话

当前状态是S0的时候

我们要判断输入的key是什么?

如果输入的密码是正确的密码9

我们就进入到S1

进入到下一个状态

如果输入的密码是错误的

我们还保持在当前状态不变

在状态S1,如果输入的密码是3

就进入到下一个状态S2

否则的话就回到初始状态S0

S2和其它情况我就没有再去画下去了

这就是状态计算逻辑

从这里面

我们大致可以看到

不管状态计算逻辑多复杂

它无外乎就是一些多路选择器的嵌套

从代码描述的角度来说

无外乎就是一些case语句和if语句的嵌套

或者是if语句再跟case语句循环的不断嵌套下去

嵌套的层次可以是非常的多

右边是输出计算逻辑

根据当前状态

也是根据当前状态计算输出值到底是什么

如果状态在S2状态

就是最后一个状态

输入的密码是1

输出一个开锁脉冲

在其它所有情况下

脉冲都是0

不输出开锁信号

这就是状态计算逻辑和输出逻辑详细的细节

下面我们再来看一下刚才这个设计

刚才这个有限状态机所对应的RTL代码

在电路图里面

我们已经看到了

有一个时序逻辑电路

一个状态计算逻辑

一个输出计算逻辑

两个组合逻辑电路

加上一个状态寄存器这样的时序逻辑电路

我们先来看比较简单的状态寄存器

和前面的例子一样

在时钟的上升沿工作

复位信号是一个低电平有效的复位信号

在复位信号到来的时候

把状态清为零

然后在其它情况的

时候都是把next state 赋给current state

用的是非阻塞赋值语句

状态计算逻辑和输出逻辑都是组合逻辑

我们先来看一下状态计算逻辑

根据当前状态来判断

当前状态是0的时候

如果输入的密码是四位数的9

下一个状态是01

就是00状态到01状态

否则保持00状态

然后再判断当前状态是01的话

下位密码是3的话

进到10状态

否则的话还是回到00状态

下一个状态是10状态的话

不管输入的密码是正确还是错误

都回到00状态

作为组合逻辑电路

我们一定要写default分支

default分支是00状态

注意

在这里

电路的输入信号是什么呢

除了有current state

也就是case语句里边的信号

表示作为输入信号

然后条件分支的key信号

也要放到敏感表里面

回顾一下我们对组合逻辑电路代码描述的要求

所有的case语句和条件判断语句里面的这些信号

条件信号都是电路的输入信号

所有的赋值语句右边的信号

也都是电路的输入信号

初学者在写这个敏感表的时候

经常会漏掉信号

漏掉的话有时候很难发现

要求我们在使用软件工具进行编译

进行仿真和综合的时候

一定要去检查

(软件)给了报告

(软件)会告诉你这个地方是不是漏掉信号了

在右边的输出逻辑里边

我们把它换成 @*

@* 的另一种写法

把那个括号都省略掉了

用这种方式可以确保

我们不会漏掉敏感表里面的信号

一般来说我们现在推荐大家现在写代码的时候

都采用这种新的代码风格

在右边的这个风格里边

我们写的就比较简单了

在输出逻辑里边

我们只要判断S2状态的时候

如果输入的密码是9的话

result输出开锁脉冲

其它所有情况result都是0

这就是输出的逻辑

所以我们可以看到

不管我们的有限状态机多复杂

最终描述我们电路的时候

通常就是三段代码

状态计算逻辑

状态寄存器

以及输出逻辑这样三段代码

如果你在写的时候

不按照这种风格去写

有时候错误的把某两段代码

比如把输出逻辑写到了

状态寄存器这个逻辑里边来了

就会导致代码出错

这在我们前面讲RTL语言描述的时候强调过

在我们自己写代码的时候

每次写完代码

我们自己也要去检查一遍

到底是采用了哪种风格描述代码

应该采用几个进程来描述这段代码

代码描述完了以后

最终我们进行仿真验证

这是刚才这个有限状态机仿真验证的波形

我们看一下

第一行是周期性的时钟信号

第二行是当前状态

第三行是下一个状态

我们自己脑子里应该明白

当前状态和下一个状态之间

是怎么变化的过程

比如说

当前初始状态是0

当我们输入一个密码9

输入一个正确密码9的话

下一个状态就是1

在时钟沿到来以后

就进入到

当前状态就变成1

在当前状态是1的时候

输入了正确密码3

我们就进入到了状态2

状态2的时候

输入了错误的密码

我们回到初始状态

如果一开始输入的也是错误密码

就始终处在初始状态

如果输入了正确的931这样一个密码以后

我们进入到状态2的时候

就能够输入一个正确的开锁脉冲了

用这样一个方式

就可以验证我们电路的功能

达到了我们设计的预期

对于简单的有限状态机

状态机的输出

经过特别简单的计算逻辑

就可以作为我们整个电路的输出

对于复杂的电路而言

有限状态机通常是作为电路的一个控制系统

电路更重要的核心是数据路径

或者说电路要做什么事情

对于这样的电路

我们通常用一种叫带有数据路径的

有限状态机来进行设计

电路设计的核心是数据路径部分

有限状态机只是起一个控制部分

首先我们要定义

我们电路里面都有什么东西

或者说数据路径里面要做什么事

电路要有哪些模块

比如说是不是要有一个计算模块

完成特定的计算

以及若干个计算模块之间

它们是一个怎么样的协调过程

在每一个节拍或者说每一个状态里边

要完成什么样的动作

比如说这个数据路径来完成相应的动作

有限状态机来控制数据路径

在指定的节拍完成指定的动作

所以我们可以用这样的结构图来表述我们的电路

把电路所需要完成的动作部分

我们合并到数据处理电路里边去

它完成相关的计算

完成这个加减乘除

完成相应的存储等等这样的功能

换句话说

数据路径里边

不一定只有组合逻辑电路

可能也会存在一些存储电路

或者特定功能的电路

第二个是有限状态机部分

它完成电路的节拍控制

产生一定的控制信号

控制数据路径在特定的节拍

或者说特定的状态完成特定的动作

数据路径会给出一定的反馈信号

告诉有限状态机该按照什么样的

流图来产生相应的控制信号

最终数据路径会产生输出信号

这就是我们复杂时序逻辑电路的设计方法

采用这种方法设计的

核心是确定我们的数据路径

首先第一步是确定数据路径

然后再是用有限状态机

用状态机去对数据路径进行控制

下面举一个秒表的例子

假设我们设计一个

能够对两个运动员进行计数的秒表

秒表只有一个按键key

当按下第一个按键的时候

按键按下第一次的时候

两个运动员同时开始计数

然后当第一个运动员跑到钟点的时候

我们按一下按键

然后结束对第一个运动员的计数

秒表持续的还在对第二个运动员进行计数

再按一下按键

秒表结束对第二个运动员的计数

这时候显示的是第二个运动员的结果

再按一下按钮

秒表显示第一个运动员的结果

最后我们再按一次按键

秒表清零

回到初始状态

采用这样的定义方式

我们这个电路只需要有一个按键

一个显示屏就能够完成对两个人的计数

这也是我们大家常用的

秒表所采用的这个设计方式

当然对于这样的秒表

我们还一定要有个时钟信号

去完成计数里面对秒计数的功能

这就是秒表的描述

对于这样的秒表

我们首先要确定电路的外特性

刚才已经说了

对这样的电路

我们需要一个时钟信号

一个按键信号

以及相应的必要的复位信号

产生的是秒表输出的计数值

对于一个实际的工程电路

首先我们就来考虑一下时钟信号

作为一个秒表

如果我们考虑的比较粗的话

一秒钟一秒钟的计数的话

我们其实需要的是一个秒脉冲

但实际上我们可以想象一下

我们的电路里面这个秒脉冲信号怎么来呢

秒脉冲是物理的

世界里面很难产生一个秒脉冲信号的

通常我们的秒表会用一个32.768千赫兹的信号

这是一种很常见的晶体振荡器的信号

它能够产生32.768千赫兹的信号

为什么是32.768呢 是因为32.768是2的15次方

所以

采用这样的晶体信号

我们可以用一个简单的除2除2

一直除15次2的这种方式

产生出一个秒脉冲

这就是我们用这种频率的

时钟信号的由来

在产生秒脉冲的时候呢

我们也可以有很多种方法

来产生相应的这种秒脉冲信号

一个是用异步的方式

也就是我们把32.768用D触发器做一个二分频

然后用15个D触发器级联15次以后

就能够对冲出一个秒脉冲信号

这是第一种方式

第二种方式呢

我们是用同步分频电路

在本科课程里面应该也讲过

我就不多说了

它经过同步分频以后

也能够产生这个秒脉冲信号

如果采用异步分屏的方式来做的话

或者说我们的时钟信号在后续的电路里面

都用异步方式来做的话

我们在看结果的时候

有时候会看到一个秒表的

时分秒这些信号在更新的时候

例如从23小时59分59秒

变成24小时的时候

这3段变化的时候是错开的

中间会间隔

有一个很小的间隔

如果是用同步脉冲去进行计数的话

这三段时分秒的这三段是同步进行变化的

是秒脉冲的情况

另外一个就是需要去考虑按键

我们用的这个按键

秒表上的按键去按启动和停止

按钮是一个机械的按键

我们在做电路设计的时候

想的都是非常理想的情况

秒脉冲

我们按了一下键

产生一个脉冲信号

这个信号正好被我们有限状态机进行处理

这里面其实隐含的就是说

这个按键key的信号的持续的宽度

key脉冲的宽度

正好是一个状态的宽度

这时候我们作为

有限状态机去处理是非常合适的

非常方便的

但实际上我们用去按这个脉冲的时候

按这个按键的时候

你是很难去控制产生出你所要的

这样一个宽度的一个信号的

所以我们需要一个预处理电路

去让按键信号能够产生出

我们需要的宽度的信号

是一个预处理电路

我们预处理就有两种需求

第一个

如果我们按这个键的宽度比较宽的话

我们需要把宽脉冲

调整成一个只有时钟周期

一个时钟周期宽度的窄脉冲

我们需要做一个预处理去处理

第二个就是要去考虑

按键的机械特性

因为现在用的按键通常是一个簧片来做的

一个磷铜的簧片或者类似这样的簧片

当簧片在按下去或者是抬起的时候

由于簧片的弹性会导致弹几次才能够稳定下来

具体到电特性来看

就是在一个脉冲的上升沿

或者是脉冲的下降沿的

附近会出现多次振荡波形

这个振荡波形具体到电路来看的话

就好像我们在按键的时候

重复被按了多次

有时候如果我们买到是低端的秒表的时候

就会可能会遇到这种情况

我们好像只按了一次键

但是从电子产品的特性来看

被按了多次

通常就是我们所遇到的刚才这种情况

在预处理电路里面没有做特别好的处理

导致按了一次键会被处理成是按了两次键

或者三次键以上

处理的方法也有多种方法

一个是用这个

比如说在按键上并联一些电容

消掉这些震荡信号

或者说毛刺信号

第二是可以用一些

同步处理电路去把这个按键当成一个

用一些高频信号

高频时钟信号

对按键做同步处理

产生出我们所需要的宽度

第三个是可以用二次触发器

去做一个特殊的处理电路

把按键处理成一个单脉冲的输出

这是常见的按键处理

假设经过这些预处理电路

经过这些考虑以后

我们已经把秒表的输入信号

变成了我们所需要的这个特定的输入信号以后

我们就可以完成一些比较简化的设计

或者说设计我们这个秒表的核心电路

我们来看一下

秒表的输入

已经按照我们的需求定义好了

只有标准的时钟信号

标准的复位信号

以及满足我们要求所需要的key按键信号

以及我们所需要的四位输出信号

key信号

每次我们按一次键

只产生一个脉冲

对于这样的秒表

我们下面就要考虑内部怎么设计了

刚才我们已经说了

秒表的设计核心并不是有限状态机的设计

核心是数据路径怎么去设计

怎么去完成这个秒表的数据路径

我们想一下

秒表要完成计数功能

所以一定要有个计数器

计数器是一个比较特殊的电路

我们可以把它当成一个单元电路

我们当成是一个可以直接使用的电路

在我们前面讲RTL级设计的时候

已经给大家举过一个例子

一个可以加 可以减

可以预置数据的同步计数器

给过这样一个计数器的代码

所以我们可以把计数器当成一个子电路

或者是一个小模块

我们直接拿过来用

现在

我们回顾一下我们对这个设计的需求

我们要能够同时对两个运动员进行计数

对吧 所以我们想象一下

我们在数据路径里面

可以放两个计数器

C1和C2

或者说Counter1和Counter2

分别对两个运动员去进行计数

然后呢

当第一个运动员跑到终点的时候

我们把计数器1停下来

计数器1这时候保持的是第一个运动员的结果

然后当第二个运动员跑到终点的时候

我们让第二个计数器也停下来

这样

计数器1和计数器2里边

分别保存的是第一个运动员

和第二个运动员他们的结果

然后我们因为只有一块显示屏

要显示两个运动员的结果

这时候我们就可以用一个多路选择器来选择

在某些时刻显示的是第一个运动员的结果

在某些时刻选择的是第二个运动员的结果

用这种方式

用这样一个很简单

或者是很朴素的思路

我们就可以用右边这张数据路径的

图来表示我们的设计思想

我们有两个计数器Counter1和Counter2

然后它们分别有一些输入信号

Counter1接收的是start1信号来控制它的计数

然后Counter2接收的是start2信号

来控制它的计数

clear信号用来把Counter1和Counter2都清零

它们俩的输出值送到一个多路选择器

由一个sel信号来选择

把这个结果送到最终秒表的显示屏上去

这就是我们的数据路径

为了让秒表的动作机构能够工作

我们需要有一个控制器来产生一些控制信号

在启动的时候

或者说在开始的时候

要把这两个计数器都清零

然后当按下key

在不同的时刻按下key的时候

我们分别要启动这两个计数器

在合适的时刻再把这两个计数器分别停下来

然后在合适的时刻

用相应的sel信号把计数器的值送到输出端

这就是我们的有限状态机

这就是我们的数据路径

按照这样数据路径

我们可以设计出控制器

也就是有限状态机

完成它的

把它的这个有限状态机的

状态转换图设计出来

我们想象一下

相当于是在S0

初始状态是S0

这时候如果按了一个key的话

我们要把两个计数器

Counter1和Counter2都启动

也就是说

我们要产生出start1和start2信号

再按一下key的时候

也就是运动员1跑到终点了

我们要把计数器1停下来

我们把start1给它去掉(设置为无效)

相当于产生一个Stop信号

只要把start1停掉

这个计数器就不计数了

当第二个运动员跑到终点的时候

我们把start2也停掉

然后我们这时候就要选择

到底是把运动员1的结果

还是运动员2的结果输出了

也就是说在相应的状态

我们分别选择输出Counter1

或者说在前面这几个状态

因为Counter2一直在计数

对吧

所以我们只要把Counter2结果送出(显示)就行了

然后当我们需要观测第一个运动员的时候

我们把sel信号输出为1

就可以把第一个运动员的结果送出来了

最后我们再按一下key的时候

我们把Counter1和Counter2同时都清零

也就是说我们要产生一个clear信号

在这个最后一次的时候产生clear信号

回到初始状态

这样就能够让计数器

秒表能够同时

能够重新回到初始状态

这就是我们的设计过程

或者说我们的思路

首先我们完成数据路径的设计

然后完成一个有限状态机的设计

控制数据路径在规定的节拍完成规定动作

然后最后完成这个设计以后

我们再用代码把相关的

数据路径和有限状态机表述出来

下面我们来看一下相关的代码

我们先来看一下数据路径部分

数据路径是我们电路的核心

在这个数据路径里边

有两个计数器和一个多路选择器

所以我们可以直观的用三个进程

两个进程描述计数器

一个进程描述多路选择器

我们先来看一下多路选择器

比较简单

多路选择器是一个组合逻辑电路

对吧

所以是一个always@

后面是一个*

然后当sel信号是1的时候

我们把计数器1的值送给count

sel信号是0的话

把count2的值送给这个count

这就是多路选择器

我们再来看一下计数器1

这个计数器1呢

其实就是我们上课所讲过的

在RTL级电路设计里面所讲过的

计数器的简化版本

在时钟的上升沿动作

低电平的复位信号

复位信号到来的时候

计数器清零

有个异步的清零信号

计数器可以清零

然后判断

如果是start1信号有效的话

计数就在持续的加1

然后如果clear信号到来的话

计数器是清零

如果start1信号没有的时候

计数器就可以停止或者是保持状态

所以这个计数器具备保持

加1和清零这三个功能

计数器2跟计数器1是完全相同的

所以代码看起来完全是一模一样的

这是数据路径部分

再看一下有限状态机部分

有限状态机是跟我们的

标准的有限状态机是一模一样的

所以我们就没有再看这个图了

我们只看相应的代码

代码我们只是给出了部分代码

因为这个状态机的状态比较多

在PPT上很难表示出来

所以我们只给了部分代码

一个是右上角的状态寄存器部分的代码

这是一个标准的八股的代码

复位信号到来的时候

状态被清零

然后在每个时钟上升沿

把下一个状态打到当前的状态里边来

第二个是状态计算逻辑

在我们的状态机里边

因为我们状态机并不需要状态输出逻辑

我们只要给出状态计算逻辑就够了

状态计算逻辑是一个组合逻辑

所以这个地方是*

根据每一个当前状态判断要做什么事

当前状态如果是0的时候

如果按了一下键的话

我们进入到

下一个状态是1

否则回到状态0

保持当前状态不变

在当前状态是1的话

如果按了键的话

我们进入到当前状态是2

否则的话保持当前状态1不变

所以这部分描述了状态转移部分

后边这一部分

描述的是在当前状态的输出

所以这一段代码它其实描述的是两个组合逻辑

一个是状态计算逻辑

一个是输出逻辑

从这里边我们可以看出

我们用的是

在这个进程里面

我们是把两个组合逻辑合并到一个进程里面来了

我们看一下输出

输出这里面用了一个比较巧妙的表示方式

当然看起来可能有点不直观

只是代码写起来比较巧妙一点

应该说在工程里边各有各的好处

我们知道

在每个状态

我们要输出start1

start2

clear和sel信号

我们可以把这四个信号变成一个矢量

在右边我们直接用矢量去表示就行了

对应的相当于是

在第一次按键的时候

我们把start1和start2都置1

启动两个计数器

然后当某个情况的时候

我们把start1比如说在第二次按键的时候

我们把计数器1给它清掉

置0

start2置1

用这种方式代码写起来比较简洁一点

另一种方式就是

我们直接写start1等于什么

start2等于什么

clear等于什么

sel等于什么

第二种方式看起来也许会更直观一点

但是代码行数会更多一点

所以这就是状态机的状态转换部分

我们只是给出了前两个状态的代码

后面几个状态的代码

我们就省略掉了

就没有写

大家可以根据自己的理解

去把这段代码给它补齐

这就是我们这个秒表设计里面的

数据路径部分

以及有限状态机

或者说控制器部分的代码

完成代码的编写以后

下面就是去做仿真验证

我们来看一下这个有限状态机仿真的波形

其实对于一个复杂的时序逻辑电路而言

仿真验证已经是我们电路的最后一步了

我们作为设计人员的

设计工作其实是在前面的数据路径部分的设计

以及有限状态机的设计

有限状态机的设计最核心的就是这个状态转移图

或者状态转移表的设计

对于刚才这样一个电路而言

状态转移图有时候并不是的直观

或者说的准确

状态转移图它的转移关系

是我们用大脑给它想出来的

所以有时候在设计描述的时候

我们需要设计人员自己就把现在的这个仿真结果

或者仿真结果里面的状态转移图

手工的给它画出来

把它跟状态转移图去做一个验证工作

做一个验证对比

确保我们的状态转移图的设计没有错误

下面我们来仔细的去检查一下时序图

下面我们来检查一下这个时序图有没有错误

或者说这个时序图是不是满足我们的设计要求

前面是clk信号

第二行是clk信号

然后下面有这个key信号

是我们的电路的输入

我们可以看到初始状态

current state是0

然后按了一下key以后

进入到1状态

再按下key以后

进入到2状态

再按一下key进入到3状态 4状态 5状态

以及最终回到0状态

这是状态转换机的转换

是一个无条件的往右转的过程

然后从0状态进入到1状态以后

我们可以看到

从0状态进入到1状态

两个运动员都在跑

所以两个计数器都在往下计数

1状态结束进入到2状态的时候

计数器1就停下来了

第二个运动员还在跑

然后到所有的过程都完了以后

两个计数器都被清零

sel信号在3状态结束的时候

sel信号被置高

所以这时候就完成了一个输出的切换过程

一开始显示的是计数器2的结果

然后当需要显示运动员1的结果的时候

把1的结果送到输出

也就是说

我们一开始计数的

这个count就是我们的秒表的输出值

一开始随着运动员2的跑步在显示

到运动员2的停止

当到达这个最终状态的时候

切换到运动员1的输出

然后最后再回到0

这就是我们秒表的完整的

工作波形的显示

我们按照刚才这个流程

完成了一个秒表的设计

作为一个项目的设计

或者一个工程设计

并不是说只是把它做完就算完了

功能验证出来就算完了

我们作为设计人员还要去考虑

我们这个设计能不能进一步去优化

怎么才能够做出一个更好的设计

对于刚才这样的设计

大家想一下

怎么才能优化呢

怎么才能更好呢

通常我们优化的方向是什么呢

一个是让设计能够用更小

或者更少的规模能够实现

第二是让设计能够跑的工作频率更高

对于有限状态机而言

也就是我们怎么用更少的状态去实现这个设计

怎么让设计真正的更小

或者是更快呢 关键还在于数据路径

我们回到数据路径这个幻灯片

我们来看一下

在我们这个设计里边

我们用了两个计数器

加上一个多路选择器

来完成两个运动员的计数和结果的显示

大家来想一下

根据刚才这个波形图

我们可以看到在最初的时刻

这两个计数器在做同样的事情

都是在同时做相同的计数

然后到达某一个状态以后

计数器1停下来了

计数器2在计数

对吧 所以从某个角度来说

我们其实只需要一个计数器就够了

因为在前面的这个计数阶段

这两个计数器在做相同的计数工作

也就是说我们如果只用一个计数器

当第一个运动员停下来的时候

我们需要把这个计数器的

中间结果保存下来

也就是说我们改变一下这个结构

我们只用一个计数器加上一个寄存器

或者说一组寄存器用来保存运动员1的

中间结果寄存器就可以实现了

所以我们可以用另一种数据结构

或者另一种数据路径

也可以实现

两个运动员计数的秒表的功能

我们就可以画出这样的数据路径

它也可以实现刚才的功能

在这个计数器里边

我们一组寄存器替代掉了原来的计数器

从某个角度来说

将来电路实现的性能

或者说实现的规模有可能优于刚才的这个设计

从这样的过程我们就可以看到

作为设计人员

我们的动脑筋的过程

或者说设计过程主要就体现在

你怎么才能够设计出一个比较好的

数据路径来完成设计

怎么用代码来描述数据路径

以及怎么用代码来描述控制器

有限状态机

这都是一些很机械很八股的工作

也就是说

大家要把精力尽可能放在前边

用你的知识

用你的经验去完成比较好的设计

这才是我们设计人员真正要去做的事情

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

讲课视频笔记与讨论

也许你还感兴趣的课程:

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