当前课程知识点:IC设计与方法 > 4、电路设计实例 > b)电路设计实例2 > 讲课视频
我们再看第二个例子
第一个例子的有限状态机
是一个最简单的有限状态机
没有任何输入信号
应该说是没有任何控制信号的输入
第二个例子稍微复杂一点
是一个密码锁
带有一个控制信号的输入
这个密码锁的要求非常简单
假设一个密码锁
我们顺序输入三位密码
当密码正确的时候
密码锁输出一个开锁脉冲
在这个例子里面
我们顺序输入三位的密码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的
中间结果寄存器就可以实现了
所以我们可以用另一种数据结构
或者另一种数据路径
也可以实现
两个运动员计数的秒表的功能
我们就可以画出这样的数据路径
它也可以实现刚才的功能
在这个计数器里边
我们一组寄存器替代掉了原来的计数器
从某个角度来说
将来电路实现的性能
或者说实现的规模有可能优于刚才的这个设计
从这样的过程我们就可以看到
作为设计人员
我们的动脑筋的过程
或者说设计过程主要就体现在
你怎么才能够设计出一个比较好的
数据路径来完成设计
怎么用代码来描述数据路径
以及怎么用代码来描述控制器
有限状态机
这都是一些很机械很八股的工作
也就是说
大家要把精力尽可能放在前边
用你的知识
用你的经验去完成比较好的设计
这才是我们设计人员真正要去做的事情
-软件下载说明
-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)--作业