01:04
有声音吗?有画面吗?有是吧,稍等一会儿啊,看他们都在干嘛呢。
02:42
这是现在都比较忙是吗?还是事儿比较多呢。大晚上都这么忙的话,白天的事岂不是更忙了,哪有时间学习啊?
03:00
好了啊,嗯,其他人他可能有事吧,然后呢,我们先简单说一下这个前两天我们讲的内容啊,然后呢,呃,也简单的等一下其他人啊。呃,我们前两天呢,讲的这个,呃什么东西呢?啊,首先第一个呢,我们讲了一个叫做呃呼吸灯,那讲了第一个呼吸灯啊,然后呢,在呼吸灯当中的话呢,呃用了叫做这个三个计数器对吧?然后呢,用两个计数器的对比啊,形成了最终的那个结果啊那么呃我们在这呢,我们不讲说啊,一直在跟大家强调说我们不去理解啊,就是说我们说不去想这个想法怎么来的啊,我们就只是说是说什么呢说哎他只要是能够实现什么呢?哎在德尔塔T啊,就比较小的德塔T之内呢,哎占控比逐渐升高就可以了啊,所以就是做了这样的一个,呃这个占控比的升高就能控制亮度啊,这控制亮度这就是一个啊这个呼吸灯啊,那么呃,我们怎么来实现呢?后边给大家举了很多例子,比如用三个计数器呀,还有十分秒呀,然后等等这样的一些呃例子,然后呢,我们确定用这种。
04:13
方法可以实现啊,这就是我们的一个实验方法。然后呢,我们这个呃,今天是周一是吧,我们周五的时候讲讲了一个数码管的一个驱动设计啊,也就是说呢,我们真的可以驱动起来一个呃显示设备了,然后它呢,呃能够去显示一些什么呢?就显示一些就是我们呃想要的一些数字啊,当然了,它是四位啊四位啊每四位显示到一个管上啊,每四位显示到一个管上啊这是一个叫做这个数码管的一个驱动啊,那么呃,在这个当中的话呢,啊,在这个当中的话呢,我们呃那天有于时间的关系呢,有一部分呢,可能没给大家呢,这个就是还没讲啊还没讲,所以今天的话呢,我们把前面这个数码管驱动设计当中的话呢,有一部分啊,我们给大家呢,再来修改一下啊,再来修改一下啊,这是第一个,第二我们讲一下这个装态机理论,再一个呢,我们讲一下自动收货机和修的检测,那么今天任务呢,就相对来说也比较多啊,还是比较多。
05:17
那么呃首先呢,我们先来说这个第一个问题啊,第一个问题就是这个,呃到现在为止呢,还是有一部分这个同学呢,对什么呢?呃就对咱们这个ipg设计的话呢,可能还是啊有一部分的这个就是特别是关于寄存器的这个,呃理解啊可能就是比较费劲,呃那么呃在这的话呢,我来给大家呢把这个问题呢再来强调一下。啊,然后呢,我们这个在这儿我也给大家呢,也画一下,然后大家能够呃知道啊,要不然的话呢,还每次都有这样的一些问题,就不太好了啊呃,首先呢,第一个问题的话呢,就是只要我们写的是吧,只要说我们设计了什么呢,只要我们设计了寄存器。
06:12
那么就一定会出现个什么问题呢?就是说一定会出现这样一个问题啊,就是说哎,前边一个值给到寄存器啊,然后呢,这有一个时钟上生涯啊,这叫CLK,这叫D,这叫Q,对不对?那么在这个的这样的一套系统当中啊,一定会出现个什么问题呢?一定会出现的问题就是上升沿踩到D,等于什么Q就会出什么。一定是这样的啊,一定是这样的,也就是说clock上升沿踩到的D是几,输出的Q一定是几,这是没有任何问题的啊,这是没有任何问题的,好了,那么这是第一个,第二个,当有些人把这个听明白以后,对另外一个问题死活不理解了,什么问题呢?就是我们来说这个问题。
07:07
比如说这个是一个CNT啊,它的位宽可能是说四位吧,然后的话呢,这有一个上升眼,比如这是CRK,然后这个问题这呢,就是这个CNT啊,三杠零,然后这呢。拉过来,比如说这呢,有一个加一,然,然后把它这个。然后把它这个呢,拉到这个。这边来,那么大家都能明白什么呢?大家都能够明白,这个叫做。上升牙一来加一,上升一来加一,那好了,这个波形我给大,我给大家呢,简单来画一下。好,然后呢,我们简单来说一下啊,比如说的话呢,这个地方呢,就是我们我们一做的话,这现在点的是吧,我们来画生成影,比如从这开始。
08:06
这个是二。然后这个是三,然后这个是四,嗯,然后呢,这个是五。啊,这是跟上个一点完全对齐的。那好了,那么到这的时候呢,有一部分同学呢,就开始迷糊不清了,比如说我们在讲课的时候,我们一直在讲什么问题呢?我们说如果这个上生涯去踩count的话,踩到的是几呢?踩到的是几呢?我们给大家讲课一直讲的是踩的是前边对不对,踩的是二对吧。这个没问题吧,那么踩的是二会输出三啊。那你不刚跟我们讲了吗?踩到的是几,输出的就是几对不对,那到这儿为什么踩到的二会输出三呢。对吧,所以现在这个问题有一部分人呢,就死活理解不明白了啊,做这个东西的话呢,就是理解不清楚了,首先呢,第一个问题啊,这两个话都没有任何的错误啊,都没有任何的错误,那么我们来分析一下他为什么啊这个错或者没错,首先第一个对于寄存器分析而言,上升沿踩到D是几,输出是几,这一定是对的,那么第二个在这上沿踩到是二,输出三。
09:29
这很明显是不对的,那我们首先就要来问一句话,这个的时候我加了一句话什么,我说上升沿踩到的地段是谁输出就是谁,对不对,好了,那这个呢,在这个上升牙的时候,我采样的这个二是D端吗?它可不是啊,我们的二是谁?我们二是这一端,它地段是几呢?它的D端应该是二加一,应该是这一段,也就是说在这个上升芽,我们对于这个计算器来说,采到是几呢?采到的数据D端是几啊是三,而它本身是等于几呢?它本身是等于二的啊,本身是等于二的,那么这是第一个问题,那好了,到这儿又开始不理解了,那么下边我再举个例子说,假如说下边还有一个判断,说判断CNT等于三的时候,就把某一个信号拉高好了,那我问如果判断它等于三的时候就把信号拉高,那么来问一下,它应该是这一种的,还是应该是这一种呢?
10:34
应该是上边那一种呢,还是下边那一种呢?因为等于三拉高,那不就是这这一种吗。所以在这儿我们就要去讨论的问题就是什么?就是在上升沿的时候,我们采样的count到底是谁呢?注意我们说上升也踩到看到等于几,在这上也踩到几到等于二,在这时踩到等于三,很明显在这这个是对的啊,很明显这个对的,那上升也踩到的是三啊,说的是谁是三呢?注意说的是Q端。
11:04
啊,说的是Q端啊,也就是说当Q端等于三的时候,怎么怎么样啊,而我们在讲上边的是候什么,说的是踩的是D端,踩到二输出二,踩到三输出三,这是没问题的,而在我们这个电路图当中的话呢,我们说上升力而踩到的二,二这个是谁信号啊,这个可不是Q端的信号啊,这个是D端,不是这个这个可不是D端的信号,这个是Q端的信号,对不对?所以说我们这个上面踩到几的,上面肯定踩到的Q端数据肯定是二,这是没问题的,那他为什么输出三呢?对,你踩到的是二,也就是这个时候它等于二的二过来加完一之,这不不是三嘛,所以它踩的D端是三,所以输出酸而踩到的二说的谁呢?说的是Q。那么你要说在这踩到的D是谁,踩到的D就是三,因为是二加一嘛,所以在这也就很明显说了,这个上踩到的是三,所以在这儿会拉高,为什么?因为踩的是Q端嘛。
12:00
啊,因为踩的是Q端嘛,对不对,就是在这上升沿踩到的是三啊,踩的是三,为什么呢?因为很简单啊,这也就是说,如果说我们说判断三会拉高,那怎么办呢?也就是在这个位置上会有一个比较,也就这边是不是等于三,如果是的话就拉高,如果不是拉低,那很明显只有当它等于三的时候。对不对,这它等于,那什么时候等于三呢?也就是说在这个时刻才能踩到Q等于三啊,所以这个的话呢,大家呢,呃要去着重去呃理解一下啊,要着重去理解一下啊,也就是说我们说的到几输出几是对单个寄存器来说啊,对计算器单个来说,采说说的踩到几输出几说的是谁呢?说的是D端踩到D等于几,输出Q就是等于几,这是一定的啊,这是一定的,这是第一个,第二个我们说踩到的二。踩到了二,注意,我说踩到了二,那踩到谁等于二,说是上升也踩到了CT等于二,那好了,那踩到了CT是谁呢?说的是CT的Q。
13:04
所以当踩到了Q等于二的时候,那就踩到了寄存器的D呢,就是等于三,所以这输出三啊,所以这个地方输出三是没有任何问题的,所以希望大家一定要知道踩到几输出几,这句话是针对于计算器的D端来说的,踩到D等于几输出就是几,这是没问题的,在下边就是什么,我们去应用的时候,比如说这个克拉德集啊,用的是用都是谁啊,用的都是CNT的Q端啊,用的都是CNT的Q端,所以我们说踩到的是前边的啊,踩到的是前面的是二。那踩得是二啊,就给大家解释一下,踩到的是二,为什么输入是三,给大家解释下这个问题,这是第一个,第二个就给大家再次说明了啊,上个升下踩的是前面啊上踩,因为这个呢,说什么?哎说的是Q端啊说的是Q端好了,那么呃,这个呢,是这几天啊呃,咱们同学也好,或者说呃,很大一部分人啊,就是说感觉都学了很长时间了啊,对这个还是迷迷糊糊的,迷迷瞪瞪的啊,可能还是不清楚啊,在这给大家再来解释一下,然后大家的话呢,呃,也去好好的这个想一想啊,分析一下啊,这是咱们的这个内容啊好,那么呃,下边的话呢,我们再来呢,给大家呢说什么呢,给大家呢再来去讲解我们的这个,呃第二个内容啊什么呢,就是关于我们这个数码管的这个,呃,驱动的设计的一个部分更改啊,呃什么呢,因为呢,在这个叫做这个。
14:39
前天啊,我们在上这个数码馆的时候呢,有一部分内容啊,我说啊,我没说啊,那么今天呢,我们在这儿给大家呢去加上啊,这一部分内容呢,也是比较重要的啊,也是比较重要的。
15:13
啊,对于我们呃,这个设计来说的话呢,我们再一次给大家呢,一步一步一步一步的去给大家呢,慢慢慢慢的啊,把整个这个设计啊,给大家来说的明明白白的啊,那么我不知道大家还记不记得呢,我们在这个。在最前面的时候,我们给大家说什么,我们跟大家说,哎,有些设计可以用组合逻辑,有些设计可以用时序逻辑,对不对,哎,有些这个逻辑呢,它只能用时序逻辑,比如带反馈的对不对,那比如说带反馈的,那么它不带反馈的呢,用组合也可以,用时序也可以,那么我们来说一下啊,在我们的这个。设计当中啊,在我们设计当中啊呃,为什么说CL-N啊用的是实序逻辑呢?因为它有什么,因为它有一个叫做什么,就是自己像自己一味的这样的一个操作,那如果说你要用组合逻辑的话呢,就一直在移,就不停了,就跌就这个震荡了,对吧,就迭代了,那么对于实际逻辑来说呢,满足一下,只移一下对不对,指一下好了,那么对于他来说,他没有任何的什么,他没有任何的迭代,那么为什么他不可以用实序逻辑呢?以及他也没有,他为什么也不可以用时序逻辑呢?为什么只有他在用,而不是他必须要用,那为什么这两个都不用呢?那么在这儿我们给大家来去说一下啊,来说一下,首先呢,第一个来大家来看一个问题啊,比如说CL-N是什么?C2杠胺是用来控制哪一个数码管导通的,就是给电的,那好了,那么cell-N啊和so date啊,如果说我在这儿用时序逻辑。
16:57
的话,那会出现什么问题呢?哎,在这用水里会出现什么问题呢?那就会出现什么,那就会出现说收data变什么会变成寄存器,而它寄存器的输入谁输入有date和谁呢?和CL-N,那也就意味什么,也就是说CL-N的输出就是寄存器的输出会经过一堆变换给到收date什么呢输入上。
17:23
啊,会给到受力的输入上,那么这样的话呢,就会导致一个什么结果呢?就会导致收date信号要比谁呢?要比cell-N信号会晚一拍啊,会晚一拍,那么在这儿我们给大家呢,也简单去更改一下啊,简单去更改一下,希望大家也要知道这个问题,也就是说呢,只要你使用寄存器了,那么就会比它的就是你的输出的信号啊,就要比这个输入信号呢,就要晚一拍啊在这的话我们来改一下,嗯,我们给个show date给个值,那比如我们给个四片地零,然后else好了,OK。
18:12
好,那么这的话呢,因为是时序逻辑赋值的,所以要写成小于等于,好,那么下边的话呢,我们把这个呢进行综合分析一下啊,因为它是这个,呃,就只是把收date改成了寄存器啊,其他的我都没改,那么我们来看一下是不是收date要比CL-N呢要晚一拍啊,因为组合逻辑呢是没有时间的啊,组合逻辑是没有时间的,也就是说呢,只要是输入发生改变,输出立刻跟着变,最多就是有个门延时呗,而如果说一旦加上计算器会发生什么现象呢?也就是说呢,它就会真真正正的输出要比输入呢,要晚一个使用周期啊,要一个使用周期,我们来看一下是不是我所说的CL-N的信号啊,CL-N的信号来看一下,这个是CL-N对吧?这个是CL-N5啊,CL-N好了,那么对于这个CL-N来说,我们来看一下啊。
19:13
看这不是收date嘛,对不对,这是收date对吧?收date的输入有这么多在这是由这个译码过来的,而这个译码呢,我们来看一下,而这个输入谁呢?而这个输入的话呢,它就是由它的五再加上这边的一堆值啊,加上这边的一堆值,也就是说它们是所有的Q所得来的值,然后给了他,再给到它,那么这样的话导致什么,就导致收date呢?会应用他们两个的输出值,会导致什么,就导致晚一拍,那么在这儿的话呢,在电路上我觉得就已经能说明问题了,但是呢,在这儿我为了给大家呢说明白这个问题怎么办呢?我们去做仿真啊,我们去做仿真,我们做完仿真之后,大家就能看到show data呢?会要比谁呢?会要比CL-N呢,就要晚一拍了啊,也就是说呢,晚一拍就晚一拍,无所谓啊,先不要着急啊,我们来一步步来看一下啊,这出问题了是吧。
20:16
我先把它关掉啊。嗯,出问题的原因应该是咱们之前搞了一些东西啊,给他搞错了,呃,什么呢,就是这个地方的话呢,我定义了一个date啊,然后呢,我把输入给弄没了,而在我们的TB当中的话呢,应该是还有这个端口,对吧?设计当中没有这个端口,而而这个呃,仿真里边有这个端口,那就会报错对吧。
21:09
好,那么下面我们来看一下啊。呃,这个是CL-N对不对,这不这个是CL-N啊,这个是我们的这个,呃,C-N,然后我们把给调出来。好,那么收对调出来以后,我们来看一下啊,我把收ED调到第二倒数第二个来看一下啊收date的值啊就这一条啊就这个线啊,这个线呢啊这个线它比谁呢?它比上边那个C1-N呢,晚了一个什么呢?晚了一个这个叫做时用周期啊,咱们还能看到的了一个时用周期,但你会发现什么呢?Show date跟CN是同步的,Show date跟C格是同步的,那为什么呢?啊原因就是什么原因就是因为show date到C呢用的什么?用的是组合逻辑,那么有人说那我下边这个呢,我也可以用什么,我也可以用时期逻辑,那这样的话呢,它就比什么呢?它就比show date还要再晚一个时用周期啊,就比手还要晚个时钟期,那么这样就是直接做完之后,下版会不会报错,其实并不会啊,很多人去学这个东西的时候呢,他就这么做,做完之后会报错嘛,其实不会啊,不会报错也就下版,我估计也看不出什么现象来啊,但是这么来做,从某种意义上来说是不对的,为什么?
22:31
不对呢,大家来看一下啊,如果从从目前来看啊,CL-N和C-N不同步,也就是说呢,C-N比C2N要晚一拍,那么什么时候都晚一拍对不对,那好了,那就会出现什么问题呢?也就出现就在这个时刻就出问题了。也就是说C-N比C-N要早,那么C-N管什么管切换管子,也就是说管子切换了,但是呢,管子上量的数还没切换。
23:01
啊,管出来的数还没切换,那么就会出问题啊,那么就会出问题,那么会出什么问题呢?啊会出什么问题呢?那么在这儿啊我来给大家呢,简单来说一下,会出什么问题呢?呃,其实呢,呃,我们来说啊,如果说呢,第一个数码管的是一,第二个数码管上量的是二,咱们就举这个例子,那么如果说C-N和C个杠N不同步,那么会出现什么问题呢?也就是说C-N已经切换了管子了,而C个杠N的数还没换,那么对于咱们来那么来写就是这样了,因为是C-N要比CL-N要晚,对不对?那好了,那就意味什么?意味着我都已经让第二个管点亮了,其实你还会让第二管亮一段时间的什么呢?一,然后才会改成二,那么这个一呢,就会导致这一段也亮,但是我们学过什么,我们学过叫做这个视觉在流,大家就会明白什么呢?因为这个二所点亮的时间会比较长,而这个。
24:02
这一一呢,这小数呢,它点零时间特别短,为什么?因为它只是错开了两个时用周期而已,因为我们一个灯得来一毫秒嘛,对不对对得来一毫啊对对一毫秒,而错开一个生周期呢,会错两个生周期呢,只错了40毫秒,不是40纳秒或者20纳秒,对不对?所以对于这个灯来说呢,它点亮的时间呢,会特别特别短,那么这个灯的亮度就会特别特别暗,所以这个灯也会亮,但是它的亮度特别特别暗,那么对于IP来说,由于它的差距比较小,所以这一段大家可能看不清楚,但是如果大家用什么来去做呢?如果用单片机来做,就是把cell和SG啊去写完之后,你发现什么,你会发现这一段会特别亮,为什么呢?其实就是因为cell和这不同步所造成的啊,不同步所造成的啊,那么这个在哪呢?这个在D拼当中称为什么称为叫鬼影,那么在咱们这儿呢?呃,其实也可以称之为鬼影,为什么?就是因为cell和S不同步啊,不同步,那么我们为了让它同步怎么办呢?所以。
25:02
啊,很简单的问题就是什么?就是so date和CL-N同步,而C-N和so date同步,所以我们要做什么,所以我们要做一件事是什么,就是说把我们的这个代码当中,啊,就把这一段话再次改成组合逻辑。如果要把它改成组合逻辑了,那么就跟什么,那么就跟时钟就没有任何关系了,跟时钟如果没有关系的话,那就意味什么?意味着只要C-N发生改变,收date就会立刻变,而收date立刻变,C-N就会立刻变,所以他们就会三个就会对齐,那么我们来这儿呢?来给它改完代码了,对吧?然后我们来这儿给它编译一下。好,编译成功以后,我们再来restart run一下。好了,都不用动,大家看到这三个是不是就对齐了,那么这三个对齐有什么作用呢?哎,我们不要说,我们不要说说对了对没对齐,因为说对这中间我们只看CL杠和C缸对没对齐,它只要对齐了,那就会有个好处,什么好处呢?就是啊,当切换管子的同时,我们也就切换了什么,切换杨铁亮的数字,那么此时就不会有什么,此时就不会有任何的这个叫做这个这个这个鬼影的存在了啊,就不会有任何鬼影的存在了,所以这个呢,就是什么,就是我们给大家所说的啊,那么在设计当中到底用组合逻辑还是用时序逻辑呢?其实啊,很多地方是你愿意用什么就用什么,但是在很多地方不是你想用什么就用什么的。
26:38
啊,它会有什么,它会有规定的啊,会有规定,比如说咱们现在这个就是你如果要用时序逻辑出现什么问题呢,就会出现这个叫做两个输出,人家要求是同步的,因不同步就出现鬼影了,对不对,那好了,那你要想同步,那好了,除非你改变实计方法,你要不改变实计方法的话呢,那么只能这么来做,也就是说哎,强行让so-N和C尔杠N是同步的啊,是同步的,也就是说呢,它没有任何的叫什么,就没有任何的这个节拍上的延时,那当然了,它肯定有什么,它肯定有门店路上的延,为什么?因为你收date势必是通过C2-N出来的,所以呢,门延时收肯定要比它稍微晚一点,而C2-N呢,要比它晚一点,所以呢,二杠N要比C2-N呢,这个C-N要比C2-N呢,要晚晚多少呢?它是一个门的延时啊,它不会什么,它不会是节拍上的延时啊,它不会是节拍上的延时啊,所以呢,这是给大家呢,来把这个问题给大家来说一下啊,给大来说一下。
27:37
好了,那么呃在这儿呢,呃算是解决了什么呢?算是解决了就是说呃,我觉得对于大家来说比较难的两个问,难理解的两个问题吧,就是第一个啊,就是寄存器啊,踩到的是几,输出的是几,为什么在这儿拉高,为什么在这拉低啊,这两天一直有同学在问,包括在网上有一部分人在问,看不懂。第二个什么呢?就是说啊,这个什么时候用实际逻辑,什么时候用组合逻辑呢,很大一部分人也不知道啊,很大们也不知道,就完全挨着别人抄,或者呢,我也我也见过,之前有一部分人呢,就是学过这个,做这个实际逻辑以后,就是所有的信号呢,都去写实际逻辑设计啊,不写组合逻辑了,因为他也不知道什么时候用,因为有很多地方是什么呢,用组合逻辑是报错的,比如说什么呢,我们最开始说呢,就是带什么大家要反馈那种你直接用组合逻辑报是是报错的,或者你实现不了功能的,那么他就用都用实序逻辑,那都用实序逻辑对不对呢?其实很多时候也是不对的。
28:36
但是呢,如果说呢,呃,他也不知道对不对,反正一一仿真出图了,也不知道图对不对,一下板,诶板子上没有看出异样的现象,那么就觉得是自己是对了,那么其实呢,不然啊,其实不然,希望大家一定要知道,比如我们后边在做什么呢?我们在后边给大家来讲解,这个叫做图像的时候,那么你就别说你错一个数据了,你就是错,你就你就是你就是错,这个两两万个数据你也在图像上,你也看不出来这个图有啥不一样。
29:06
啊,那个图有啥不一样,但是在通信当中的话呢,你错了一个这一包直接就是这个,这个数据就直接就损坏掉了,那数据损坏掉了啊呃,所以这个呢,大家一定要知道啊,一定要知道啊,不能错不能错好了,那么呃,下边的话呢,给大家来呢,来讲讲咱们这个状态机的这个理论啊,其实呢,呃,我们在哪儿呢?我们在这个最开始啊,我们给大家去讲解这个呃,数字电路的时候。啊,在这当中应该就已经提过了,什么呢?提过了叫做状态机,什么是状态机呢?啊,什么是状态机呢?在这儿呢,其实很简单,什么状态机呢?我们就可以认为时序电路就是状态机。啊,时序电路就是状态机,就是我们的时序逻辑电路就是状态机啊,那么状态机定义什么呢?也就是说呢,我们可以很简单来举个例子,比如说什么是状态呢?
30:03
啊,什么是状态呢?比如说如果说我们这儿有一个寄存器啊,比如这是一位的啊,这是一位的,那么这个寄存器,那好了,这个寄存器有几个状态呢?是不是它只有高和低没了对不对,那好了,高就叫高状态,低一句叫低状态,它是什么?这是它的两种状态,然后呢,又通过一种逻辑啊,又通过一种组合逻辑,可以让这种状态呢,不断的去翻转啊,这种状态可以做翻转啊,然后呢,我们又可以根据当前的状态去做一一些输出,那好了,我们就把这一段电路称之为叫状态机,或者叫称之什么呢?叫做算法状态机。啊,这就叫做算法状态机,那好了啊,这是我们所说的啊这个问题,那么我们在这儿呢,我在这儿呢,给大家呢,呃,做了一个这样的一个状态机理论啊,我们简单的来去呃学一下啊,简单来去学一下。
31:01
首先呢,呃,状态机呢,啊叫什么呢?呃叫FSM啊叫有线啊状态机啊叫有线状态机啊,它是有线状态的,因为什么呢?因为我们只要干什么,我们只要说想去把整个设计做出来,我们只能干什么,我们只能去做的是有限有限的,而无线的我们是做不出来的啊无线的我们做不出来的,所以我们只能做有限的状态好了,那么啊状态机呢,哎,它呢是广泛的应用于啊硬件啊这个控制电路当中,那么也软件上呢,也会经常去应用,那这是什么呢?叫有线消息机,那无所谓啊,那么也就是说呢,我们可以把一个很复杂的一个控制逻辑分解什么呢?分解成有限的稳定状态。啊,然后呢,每个状态上呢,我们来判断什么呢?判断事件啊,我们呢,然后去干什么,去做处理啊,去做处理啊,因为有限状态机具有有限个状态,所以我们是可以实现的,但是这并不意味着有限状态只能进行有限次的处理,相反有限状态机是一个闭环系统,我们可以做有限的状态当中处理什么呢?无穷无尽的事情,为什么呢?因为我们把这一件事情呢,已经分成什么,已经分成了啊几个状态,也就是说呢,无论发生什么都会有这几种状态的。好,那再让我们来看一下,这是我自己写了一个例子啊,就是说比如说呢,我们把咱们家里的电视啊的工作过程,我们看这个状态机,那好了,我在这分成分成三个状态啊,就是正常断电状态,然后呢,正常上电就是播放状态,就是你打开电视了,还有一个叫不正常状态。
32:48
好了,那么下边大家来想一想啊,我就把你家电视机分成了这三种状态啊,我就把你家电视机分成了这三种状态,那好了,那么请问你的电视机能跑得出这三种状态吗?其实你无论怎么着,你也跑不出三种状态对不对,无论你发生什么事情,永远在这三种状态里边,对不对?那么这三种状态干什么?这三种状态就可以来回去做切换啊,比如说啊,首先呢,我们把电视机买回来以后啊,我们把电视机买回来以后处于什么处啊,非常简单的一个就是处于正常断电状态S0。
33:24
那如果说我要一直不通电,那么它就一直就会在这儿,比如说呢,我们认为什么,我们认为电视机的状态是一秒钟我去查询一次,一秒钟我查询一次,那好了,那么在我没有去给它做通电的时候,那么它就一直在这转。他就一直在这转,一直在这儿转,对吧,比如永远是每每一秒钟都是这个正常这个断电状态啊,然后呢,我们给它有一个条件是C1C什么通电我吧一通电变成变成S1状态了,就是正常播放状态,在S1,那么好了,就一直在S1,然后我给了一个另外一个输入,叫什么断电,它又回到S0了啊又回到S0了,然后呢,我还有一个状态叫叫违规使用C4,比如说在断电状态。
34:13
也可以违规使用,在正常使用状态也可以违,比如说在断电状态的情况下,怎么违规使用了?很简单啊,刚买回来电视啊,你看着不舒服,拿锤子梆梆梆把它砸烂了,这也叫违规使用状态,对吧?你就违规使用了对不对,那好了,那正常播放状态对吧?哎,正常播放状态啊,人家告诉你不要去摁什么,不要去摁什么,你非得去摁,非得去调好了给弄坏了吧,那就记住了,记住到。为进入到这个这个不正常状态S2了,那好了,经过在S2经过维修就可以什么,就可以到我们的S0就是正常断电状态了,拿上家,然后又可以上电,又可以工作了,所以这就什么,这就是我把电视机的工作分成什么,分成了这三个状态,那我们来看一下我一共就这三个状态,那么这三个状态是不是可以表示电视机所有的状态了。
35:04
那么你想啊,你家电视机啊,你家电视机从买回来开始啊,你可以无穷无尽一直看,每一天都可以看,什么时候都可以看,它每时每刻都在工作,我们可以么?断电也在工作对吧?维修也在工作是吧?那每时每刻都在工作,那好了,也就是说它可以是无限长,但是呢,永远逃不过这三个状态,所以呢,我就给他做了一个三个状态,那么这三个状态你会发现什么呢?电视机是有什么?它不可能同时处在两个状态,它不可能记在S0又在S1,它也不可能记在S0,又在S2,它是不存在的,对不对,它是不存在的,所以对于我们来说啊,所以对于我们来说什么?就是说我们用了这三个状态来表示什么,来表示了这样一件事情啊,它从头到尾,当然了,有的时候可能没有尾,一直在进行,那可不可以也可以啊,那我用了这有限的状态表示什么?表示了无穷无尽的事情,因为它是一个闭环的,什么叫闭环呢?就是从头往前走,走到前面还可以再回来,不是说走到头回不来了。
36:05
他还可以回来,也就是它是一个闭环的,那么这样的话可以处理所的事情,那么一定要知道它不可能同时处于两个状态,所以呢,这几个状态我认为啊,也是顺序型的啊,就是初1S0的时候不可能是S1,初1S1就不可能是S2啊,它是这样啊,这是啊我们所说的啊这样的啊三个状态,那么我们来说呢,我们分成了三个状态,那么这是什么?这是这几个状态跳转的条件,那好了,还有什么状态的输出啊,就我们没有做输出,比如说我们把屏幕作为输出,S0状态屏幕输什么?屏幕输出就是黑屏,S1状态屏幕什么,屏幕输出的就是这个这个这个广播,呃,这个电视剧电影对吧?S2呢,平板出什么平面输出,就是正在维修对吧,那好了,那你想一下,你不可能屏幕上。这个这个这个这个同时出现这三种情况吧,那两种也不可能,对不对,只有可能当中的一种啊,只有可能当中的一种啊,所以呢,根据状态呢,我们就可以做输出了,对不对,状态输出了,好了,那么在这儿我们来看一下啊,状态机呢啊,总共分为两大类啊,那么这个呢,呃,我们在这只给大家说一下,比如说呢,这什么,这是一个状态,那这是一个状态机的中间的状态部分啊,状态部分,然后呢,这个状态部分呢,哎,从这儿是输出的状态,那好了,这是状态啊,那么根据当前的状态和输入的结果啊,和输入的这个条件来产生次态,然后呢,上升沿一来就更新到当前T了,然后这个呢,是根据当前T做的输出,比如在这举是这个例子当中,比如说现在是S0状态啊,那好了,那就是说state就是S0。
37:52
240就是S0,那好了,那如果说此时我输入了一个C1呢,就是我还在S0的时候,我输入了个C1怎么办?那好了,这个NEX变什么了,就变成了就是S1了啊S1了,那上升线一来S1是不是就到这儿了,所以这儿就变成S1状态了,所以呢,这个叫什么?这个叫次态,这个叫线态啊这是什么?这就是根,这个就是根据当前态和外部输入来产生次态,这是什么?这个是组合逻辑啊,这个是组合逻辑,那么这个什么呢?这个是根据当前钛做的输出,也是组合逻辑啊,也是组合逻辑,那好了啊,这叫什么,这个叫什么?这个叫做摩尔型状态机啊摩尔型状态机,那来看一下这叫什么,这个叫美类型状态机,有没有发现它和上边的摩尔型的是一模一样的,但是呢,它多了一条线。
38:40
也就是说米粒型状态机呢,是什么米粒型的状态机呢,它的输出呢,不仅仅取决于当前状态,还取决于外部输入,所以从这个地方我们来看的话呢,我们可以什么,我们可以说摩尔型状态机是什么?是米粒型状态机的一种特殊形式。
39:01
啊,一种特殊形式,所以在这我们只要记住一件事儿,什么事呢?就是啊就这种就可以了啊中间是状态机啊,中间什么中间不是对中间叫状态寄存器啊,时序逻辑嘛,中间状态寄存器,然后根据当前状态和输入产生次态,用组合逻辑来产生,然后呢,根据外部输入和当前状态用组合类产生作为输出就OK了,这就是一个状态机的一个电路啊这一个电路,那好了,在这我们来说一下啊,在数字电路当中呢,所有的信号都是数字型号啊,在状态机当中,我们用S0 S1 S2这什么来表示的一些符号,对吧?那好了,那这些符号呢,也只是我们在设计的时候,我们去说的对不对,那好了,那这些符号能在当中运行吗?肯定不能,怎么办呢?在因为电运行什么,还得是高低电瓶,所以还要什么,还要用数字信号来代替各种状态啊,来代替各种状态,就像什么,就像我们之前说的那个。
40:01
Parameter,比如parameer t1秒,那么那么好了,那么在电路当中能运行那个T1秒这三个字吗?肯定不能,为什么呢?因为它遇到T秒钟会什么都会换成数字,对不对,其实也是很一样的啊,我们这个可以叫什么叫000状态,零一状态,一零状态,这是可以的,因为在数字证当中真的就可以运行这些数字,对不对啊,就能可以运行这些数字,好,那是不能运行S0S1的好了,那么但是我们在写代码的时候呢,我们又习惯于用数,用用字母来代表数字,为什么呢?因为字母来代表一些数字的时候,有什么好处呢?就是说呢,比如像我们参数那个primeer t1秒用来代表那个50兆是吧,或者等等这样的一些代表,那有什么好处呢?方便去更改,这是第一个,第二个呢,增加一些可读性,对吧,来讲可读性好了。那么我们到底用什么样的一种编码形式去代替它呢?那有人说,那么你刚讲了吗?用零零代表S0状态,用零一代表S1状态,用幺零代表S2状态可不可以,当然可以了啊,没有任何问题,那好了,还另外有没有另外一种方式呢?叫格玛啊,叫格雷玛来代表这个状态啊,用格雷马来代表,有人说那格雷玛来代表有什么作用吗?什么是格雷玛呢?啊,什么是格雷玛呢?那好了在这儿啊,我来给大家呢,呃,来讲一个东西啊,那么这个东西的话呢,呃,应该是我当初在干什么呢?再去看这个叫做,呃,国外的一本书店上啊人家讲的一种方式,我觉得这个呢讲的特别好啊,我觉得这个呢,就是说明了很多问题啊,说明了很多问题,比如说呢,呃,举个例子。
41:45
呃,现在的话呢,这有什么,这有一个圆,这有一个这个白色的一个转盘,然后呢,这个转盘呢,中间呢,被分成了十字叉状啊,分成十字叉状啊,然后呢,这个13上呢,这个上面呢,有不同的颜色,比如说这个呢是有红色啊,这个是白色啊,这个是蓝色啊,这是我随便瞎写的啊,这个是绿色。
42:08
好了,没问题吧,然后的话呢,我来做了一件事,什么事呢?比如说呢,我在这个就是这个转盘的这个半圆的大概这个位置吧,我在这个上边呢,放了一个探头,就比如说它呢,也是个检测仪,它检测然后呢,有什么作用呢?比咱做一个抽奖,做个什么抽奖呢?比如说我哗一转啊,当我这个探头呢,诶这个这个这个最终你这个转盘停到哪儿,停到了这个对到这个白色上了,我就认为你中奖了,那是不是就这个探头呢,得探到白色啊,并不是说指针呢,指针是用肉眼看的,我现在不用肉眼看干什么,我用这个探头去检测,那好了,那么这个探头呢,检测到,比如说它检测到红色的时候,它就向外什么,向外输出零零。检测到白色的上面输出的是零一,简单色,蓝色的让面输什么,输出的是幺零,检测到绿色呢,输出幺幺,这是没有任何问题对吧?也就是说呢,我把它能往这一放,这个转盘唰转起来以后好了,那么按道理说,外部所收到的数字应该什么,比如说我是这个逆时针转的话呢,说嘛,应该是先说到的是零零,再说到零一,再说到110,再说到幺幺,然后呢,又说到又是零零,对不对,他应该这么循环对吧?再是呢,我们都知道一个问题,什么问题呢?就是啊,任何一件事儿,比如说我们在讲这个。
43:29
竞争冒险,不知道大家还记不记得,在竞争冒险当中,我们就说由于布线也好,或者由于某些原因也好啊,他们两个说是同时输出的,但是呢,在中间的传输也好,他们有可能什么有可能会出现错位就错开,那么也就是说白了什么可能会有先有后,对不对?那好了,现在先来看,对于零零和零一来说。那么由于它只变化了这一位,前面没有变化对吧,所以呢,无论说是因为前面不变,所以只能后边变对吧,你后边变那晚也好,变得早也好,无所谓,红的下边肯定是白的,这没问题,那好了,那如果说白的。
44:11
再往蓝的上变的时候呢,是不是这两位要进行翻转呀,那两位翻转的时候就出现什么问题呢?就会出现谁先谁后的问题,那比如说如果是高位先变了呢,那是不是就会出现一个中间过渡态叫幺幺啊,那如果是低位先变了呢,就出现什么出现了一个过渡态叫零零啊。对不对,那好了,那么110到幺幺呢也不会出问题,而幺幺到零零呢也会出问题,高位先变呢,就会出现幺零的中间态,低位先变呢就会出现,呃,这个不是高位先变的话呢,就会出现这个零幺,低位先变就会出现幺零,那么就会出现中间态,那么有人说出现中间态会有什么作用呢?我来举个例子,假如说你要不知道转盘是什么颜色呢?
45:01
那么你我要让你通过探头来分析转盘什么颜色的,那么你一定会分析红的下边是白的,而白的和蓝的中间,你一定还会认为它存在了一小细条,叫绿色或者红色。因为它势必会有过渡态的零零和幺幺,而幺幺转到零零中间也势必会认为有一条不是蓝色就是白色,也就是说呢,你会认为什么呢?中间会出现一小条的错蓝值,为什么呢?原因就是。零幺幺零两位同时翻转的时候,它会出现什么呢?叫过度态,那这个叫什么呢?这个我们有个名字叫电子噪声,也就是说呢,在这个当中的话呢,势必会得到一些不正确的值啊那怎么来处理呢?啊,那怎么来处理呢?啊这个呢,呃,不好处理啊,不好处理,比如说呢,有的人可能会有规定,比如我告诉你,告诉你什么呢?告诉你我说这个,呃,这个这个红蓝白啊,他们的这个格啊,它里边所有的分量都是一模一样多的,叭,如说你一测量,这个红的啊存在了三秒钟,白的存了三秒钟,而这个小条呢,存在了0.1秒钟,那就肯定是假的,它不对,我们可以不要它滤过啊,跟上一个保持一致也可以啊,跟下个保持一致也可以,那那都没问题,但是呢,这个呢,终究不是什么好的方法,那么我们怎么来处理呢?所以有些人呢,就做另外一件事,叫什么叫换一种编码方式,什么编码方式呢?红的还是零零,白的还是零幺,而蓝的呢,它不叫幺零,叫什么叫幺幺?
46:35
而绿的呢?改什么?改成了幺零?那么这样有什么好处呢?就是零零变零幺只有一个变,零幺变幺幺也只有一个变,幺幺变幺零也只有一个变,幺零变零零也只有一个变,那么当只有一位发生翻转的时候,那么这一位翻转的早和翻转的晚是没有任何影响的,它翻转的早了,那就是说正确的立刻就来了,他翻转的晚了也不是错了,而是上一个还在,所以呢,这就叫什么,这就叫格雷马,所以格雷马是什么?格雷玛就是相邻两个编码之间只有一位发生反转,那么格雷马是一种非常良好的能够这个去除掉电子噪声的这样的一种码值啊,这个呢,哎,非常有用啊,但是呢,有一个很不好的作用是什么呢?就是说格力嘛,只能什么,比如说转盘呢,是在这儿啊,它只能说顺时针转或者逆时针转,那么它呢,永远是什么?永远是零零变零幺,或者零零变幺零,它不能。
47:40
者不能出现幺幺和零零之间互换,幺零和零幺之间互换,那这是不存在的,因为它只能是这样顺序变化,但是在我们日常的生活当中的话呢,你比如说对于我们刚才举那个例子,状态机理论来说,比如说呢,我0S0,我可以认为是零零,这个呢,我认为啊,认为是这个零幺,这个呢,我认为是幺幺,那么很明显什么呢?哎,零零变成零幺是变了一位,零幺变成幺幺变了一位,但是你来看啊,幺幺也可以变成零零啊,你幺幺变成零零的话呢,是不是就变成两位了。
48:14
所以呢,在某些地方,格雷马也不一定会适用啊,格雷马也不一定适用啊,那好了,那么来看第三个编码叫什么叫毒热码,什么叫毒热码呢?就是说比如说现在呢,有三三个状态,我们要给它进行编码,编码怎么编呢?就是它是001,它是010,它是100,就是说呢啊有几个状态我们就用几位来表示,然后的话呢,我们怎么办呢?我们把它啊只有当中的某一位制成妖啊就是这个,说白了就是只有自己一个是妖嘛,就举个例子,叫什么叫毒热嘛,那这叫毒热马的编码,那么这三种编码方式啊是都可以的啊是都可以的,那么在这我们来说了是吧,呃,那么呃,在这的话呢,就是持持续编码,就是说这个这个普通二进制的连续编码啊,和格雷码编码用的都是两位,而独尔码需要用到三位,那么它用的这个这个,那这个叫做这个这个编译呢。
49:14
通这个资源啊,会多一部分,对吧?那么格雷马的优势呢,是两个状态之间跳转只有什么一位发生变化,不会产生过虑噪声,但是呢,如果状态的跳转不是按照顺序变化的话呢,那么格雷马就没有任何优势,你还不如用这个这个连续编码呢,格雷马呢,反而他呢比较恶心,为什么?因为大家都不知道格雷玛的下一个是什么,还要去查,对吧,还不如用二进制呢,对吧,好了,那么呃,毒热玛呢,用到了触发器比较多,但是呢,它的这个译码状态呢,比较简单,比如说呢。在这种情况下,我想确定现在是不是S2状态,那对于连续编码来说,它就是确定高位是不是幺,低位是不是零,而对于格雷玛来说的话呢,他要确定高位是不是幺,低位是不是幺,而对于独热玛来说的话呢,他只需要确定高位是不是幺就行了,其他不用确定啊,因为其他肯定都是零,所以呢,这种毒热码的编码方式是比较常用的,所以我们建议大家呢,都用毒热码的方式去做编码啊,都用读热码的方式去做编码,那么在后边学习当中的话呢,我大多数都是用读热码,那么有一部分的话呢,我也会用一些啊,这个叫做二进制编码啊,二级编码这都可以啊,没有任何问题。好了,那么呃,在这的话我们来看一下啊,呃,对于我们这儿啊,我这一本没没改过来啊,这个的话呢,是我们所谓的叫做摩尔型状态机,这个呢叫做米粒型状态机,那么它都是什么,它们都是电路啊,那么这个电路分成三部分,第一部分呢,是由。
50:48
当前肽和外部输入产生的组合逻辑啊,当前肽和外部的输入产生的叫次态啊,啊根据当前态和外部输入产生的是次态,这部分是组合逻辑,而这个呢,就是个寄存器,那这个就是个寄存器啊,就是什么呢?叫做状态寄存器,就是个触发器啊第三部分什么呢?是由当前态和外部输入所产生的输出是组合逻辑,所以呢,我们只需要把这三部分描述清楚就行了。
51:22
那么在装载机中的话呢,我们呢,可以由啊把这个当前态和外部输出产生的这个组合逻辑啊,我们可以在左逻辑后边干什么,加一个寄存器对不对?如果我们要加一个寄存器的话呢,那么这个寄存器的是可选项可以要可以不要。那如果你要要了呢,那么就会比当前钛和外部输入呢,晚一个生周期,你要你你要这个不要呢,那就是跟他们对齐的对不对,对齐的啊是在这儿我们来说一下啊,对于设计来说,明白装载机结构以后就可以进行设计了,但是呢,有很多人呢,在网上一查呢,和你说就一查装载机啊,可能估计大家不仅仅只会看到什么,看到我刚才所画的电这个装载机的结构啊,也不仅仅只会看到什么,看到说这个我给大家说的什么,就是叫做米粒型状态机啊,或者叫做摩尔型状态机啊这样的一种解释,还有什么叫一段式,两段式,三段式,那么在这儿我们来看一下啊,对于一段式来说,什么叫一段式呢?啊,我们就是说啊,去做编码的时候,我们可以用呢,一个always模块,把整个的电路,就这三个电路可以包到一个里边同时写出来。那么两段式是什么呢?两。
52:42
断式的话呢,就是啊,我们不选择输出后边的计算器啊,然后呢,将状态计算器单独描述,然后将状态转移,就产生姿态和输出一起描述,这叫两段式,那么将三个部分呢全部分开叫三段式,那么其实我来说一下啊,无论你是哪一种描述,其实这三种描述方式都是什么,都是同一段电路,并没有任何本质上的区别啊,并没有任何本质上的区别,那么在这儿的话呢,我们建议大家呢,使用什么呢?三段式的风格,但是呢,三段式呢,应该是所有设题当中是比较难的,但是呢,我来给大家讲课的时候呢,就是因为很多人他为什么会觉得三式难呢?是因为呢,他没有学过宏观的设计啊,没有学过这个宏观的一个设计技巧啊,然后呢,呃,之前呢,又是都是按照别人的去抄呀,或者什么之类的,都是按照这个别人的之前做的那些东西往下顺的,所以的话呢,就觉得什么,就觉得三段式会比较难,那么对于大家来说的话。
53:42
呢,我会把三段式给大家讲明白,然后呢,一段式给大家讲明白,包括呢,还有一部分用的什么,用的是一种叫做特殊的两段式啊,我也可以给大家去讲,但是希望大家一定要知道,无论哪一种描述,只要你描述的是这样的一种电路结构都可以啊,都可以啊,那么呃,只能说嘛,只能说在很早以前的话呢,综合器啊,不是那么的牛逼啊,那么写代码的时候呢,三段式呢,会比较好一些,因为方便综合技术综合,那么对于现在来说的话呢,呃,123段式呢,其实都可以啊,都可以。
54:22
所以我们来学习的时候呢,我就不再去重点强调啊,把某一个设计改成三段式,或者把某一个设计改成一段式啊,或者怎么改啊,这个我们就来不再去做讨论了,我们就直接说,只要我能够把这三种逻辑啊,这三个电路给大家描述清楚就可以了啊,描述清楚就可以了,那么后边还有计算器,对吧,这个计什么,这个计算器是一个叫我称叫做可选项,就是你可以要也可以不要啊,那么在很早之前我们在讲课的时候,我们就给大家说过一件事,什么事呢?就是说如果前面是组合逻辑,后边计算器,那么这个什么,这个可以合到一起去写对不对,这个合到一起去写也是可以的啊,也是可以的,好了,那么这就是我们的一个状态机啊,这是我们状态机啊,在这的话呢,因为这个呢,我没有去考虑输出啊,所以这个只是举了一个例子,我们也就不用去代码实现了,那么下面来讲解这个,呃,我们的这个叫做啊关了是吧,我们来讲解这个叫自动售货机。
55:22
啊,就是我们用我们刚才所讲的状态机的例子,我们来讲解自动售货机应该怎么来做啊,这就自动售货机怎么来做好了,那么下边的话呢,我把这个再给打开啊,因为一会儿会用得到。好,那么这个的话呢,我就给大家干什么呢,我就给大家呢,来去做这个设计报告。啊在这啊,我们来给大家呢,来去做一个自动收货机,叫A啊自动收货机。
56:15
叫doc。RTL。和我们的QPRJ好了,下面我们来做一下这个设计报告。啊,叫做自自动售货击射击报告,大家把这个的话呢,呃,就是我让大家在这个word里啊,去写各种画图啊,截图啊,截哪些东西啊,大家最好也都去做一做,因为到时候工作也好,或者说你在学校,如果到时候做毕业设计也好,这些东西肯定都能用得上是吧?好了,在这我们来说一下啊,自动售货机。
57:04
啊,自动售售售货机啊,设计要求啊,在这儿的话呢,我们来给大家做几个简单的,做几个简单的啊,比如说呢,呃,我是要求什么呢?比如说我们对于输入来说,比如我们对于输入来说啊,或者说我们就直接就写啊,呃,什么什么要求呢?那就是说这个呃,这个机器。啊,这个自动售货机纸售卖一种饮料啊,或者一种水。啊,一种喝的啊,一种水啊,比如矿泉水对吧?啊一种矿泉水好了,那么哎,售价多少钱呢?售价是2.5元啊售价是2.5元啊售价是2.5元啊好了,然后呢,呃,输入啊输入的啊这个金钱啊,数额啊,比如数额啊只能是只能为多少呢?一元和0.5元。
58:19
啊,输入的金额只能为一元和0.5元啊,那么啊,那么就有问题了,什么问题呢?因为输入的是一元和0.5元的时候呢,就会出一个问什么问题呢?就是说别人的输入呢,很有可能呢,哎,输入的最后的钱数嘛,是正好是2.5,那么你出瓶水就OK了,那如果说呢,别人输入是是是三块呢,有人输入了两个三个一块呢,那么干什么呢?所以你还要给别人找零对不对,所以在这儿的话呢,就是说哎,输入总额为啊三元时啊,或者是2.5元吧,2.5元时啊,那么输出啊水啊,输出水啊,输入总额啊总为啊三元时啊,那么输出水和找零,那么这个找零啊,你就不用想它不用找多少,因为它找零就只有可能找零点五元,它不可能去。
59:20
多的啊,不可能多的啊,那么这就OK了啊OK了,我们就这么来做,那好了。下面我们来看一下啊,如果我要让大家把这个东西实物给做出来,大家能做出来吗?大家怎么做呢?所以在这儿的话呢,我们来呢,一点一点的给大家来去说啊,就这个东西如果你要做出实物来很费劲啊,为什么很费劲呢?首先我们来说第一步啊,一步一步,一步一步,我就跟大家来讲第一个你是不是要求别人给你输入钱呀,那好了,那别人如果往里塞张报纸怎么办?别人如果往里放了一个游戏币怎么办?别人如果放的钱不是一块也不是五毛,放了个100的怎么办?
60:05
所以等等等等,这一堆东西应该怎么办呢?就我们也不知道,所以如果要做实际的就很难了,对吧?在这儿的话呢,我们只是给大家来讲解什么,讲解理论来了,那怎么办呢?所以我们就来这么想,怎么想呢,就是说呢,这个前面自动售货机的前面是有一个什么呢?有一个叫做验钞机。叫验钞机啊,就是说验钱币的一个一个机器啊,验钱币一个机器,那么这个机器有什么作用呢?说当输入的钱币为一块钱的时候,它会把这个信号拉高一个时钟周期的高高定屏。啊,拉高一个时钟性的电屏,那么当它输入的钱数是五毛钱的时候,它会把这个信号拉高一个时钟周期的高电平,那其他钱呢,再往里塞的话,报纸往里塞的话呢,为什么就是这个这个机器有什么作用呢?就是它就会直接呢。
61:04
你塞什么,不是五毛,不是一块,我管你是啥呢,我直接给你退出去,我就给你吐出去,我就说我不认识对不对,好了OK了,所以在这的话呢,就这么对于我们的设计来说的话呢,哎,就是说这是什么,这就是我们的ipg是主控芯片。那么主攻静脉输入什么?就是输入的前面这个验钞机啊,或者说输入的前面这个机器啊,它会给我们两个脉冲,那么这两个脉冲的话呢,只要哎有啊有外部输入啊,就外部正确的输入就会对应的就会拉高一个时钟周期啊,拉一个时钟周期,我们把这个什么叫做脉冲啊,我们把这称之叫做脉冲啊,就是说它的宽度是一个时钟周期啊,它的宽度是一个时钟周期好了,那么ipga的话呢,就可以根据外部的输入的0.51去做运算,那么当呢,当别人输的钱币是2.5或者是30,那么你ipg该怎么办?Ipg是不是应该去输出一瓶水啊,那我问个问题,Ipg咋能输出水呢?它也不可能输出水,对不对,那怎么办呢?所以在这的话呢,我们再来往后来讲,那么对于输出来说,我们认为是这样的,Ipg能控制。
62:21
输出水吧,它就是个芯片,它怎么能给人输出水呢?那怎么办呢?大家来想象一下啊,在真正的自动售货机里边,当你扫完码或者当你投完钱之后,他是怎么给你水的呢?它是不是里边有一个履带啊,有一个传送带,然后传送在哪立了一堆商品,然后呢,你付完钱之后,你选择那个商品,下面那个履带就干什么,就会往前。滚动,然后呢,正好滚动一个商品的长度,然后那对履带的上边的商品就会哗嚓掉下来,对不对,也就是说白了用法控制的是电机对不对,也就是说IP叫什么要控制电机去了,那ipg控制电机的话呢,又比较费劲,咱们刚开始学怎么办呢?我来举个例子,假如说我这边什么呢?假如我这边也有个机器,这个比如说是这个单片机,单片机用来干什么呢?单片机就用来去控制这个履带的,就是转的好了,那举个例子,所以我认为ipga给他一个信号,就是ipg给他一个高脉冲,单片机就会自动的去控制谁呢?去控制这个履带往前转一个商品的距离。
63:35
那是不是对于IP来说,是不是认为什么输出一个脉冲,就认为着已经出了一瓶水了,对不对,那好了,那找零怎么找呢?找零其实也很简单,大家也可以认为什么,大家也可以认为找零的零钱,因为呢不存在说找多少,因为我们找零就只有可能找五毛钱,对不对,那怎么做呢?就是我们也可以想象成我把五毛钱也当成货物也放到履带上,然后呢,往前赚一个就只掉一个一个硬币,那这样的话,是不是说我也可以说用另外一个单片机来去控制它,然后我产生一个脉冲,也就认为什么,也就认为找了零了,对不对。
64:15
好了,当做到这儿的时候,我们啊,就是说我们要做的什么,我们这个呢,就只是做了一种叫做示意模型对不对?好了,那来看一下,对于我们这个设计来说,输入是两个钱数的脉冲,输出是出水和找零的脉冲,对不对,就弄好了在这儿啊,我们在这写一下啊。啊什么呢?就是输入的啊金钱啊,输入的金钱的方啊,或者说我们用什么,我们用用flag_one o绊示输入一元。
65:04
啊,那么flag one代表什么意思呢?啊,就是啊这个高脉冲啊,高脉冲啊,一个生周期的高脉冲啊,那么在这的话呢,用这个flag啊,这个一半啊表示什么?哎,表示输入的是0.5元啊好了,那么我们用flag下划线啊,比如水是吧,Water好表示什么?表示输出一瓶水啊flag下划线还有什么找零对吧,我们称之叫做money啊flag money啊表示输出啊,输出啊或者找零啊,那么当做到这的时候呢,我们就可以去画一个什么,画一个我们的叫做这个。叫做架构图。
66:03
我们叫a to_ER。居中,OK,好。下边的话呢,我们来去做它的输入输出。好,那么输入第一个呢,要有什么,要有的是时钟啊,要有时钟。好叫CRK好,那么第二个输入呢,是我们的叫复位,好,那么第三个呢,就是我们的金钱,比如下线啊,这是们自己说的,这是一块钱的。
67:10
啊,这个叫五毛钱对吧?好,那么下边的话呢,我们来看一下啊,输出呢。是不是有两个,一个叫出水。啊,那么还有一个呢,叫诶。叫出钱啊找零。好了,那么当我们做到这的时候呢,其实啊,我们就已经可以去写代码了,因为什么呢?因为大家你会发现什么呢?我通过这个例子啊,我来干什么呢?我来给大家呢,去往下来讲解啊,当我们写完这些东西以后,我们就可以干什么呢?我们就可以直接呢去写代码了啊建工程。
68:06
注意我们还没没完事儿呢,啊,还没完事呢,就是我们设计还没完事呢,但是呢,呃,我觉得给大家来讲解,就是一步一步的怎么来做。好,那么再来想,当你看到这个图的时候。啊,你脑子当中浮现的代码应该是什么呢?啊,所以我们会给大家呢,一步一步的来去讲什么呢,就是说以后我们就变什么,就只要是什么,只要是设计报告出来了啊写代码呢,都是什么,都是体力活啊,都是体力活啊就是说呢,他根本就这个,呃。
69:14
不占有任何脑子,因为他就是一个体力活,那好在这儿我们来写一下啊,好,当你把这个输入分析明白,输出分析明白,那好了,那你的代码呢,就应该在你的脑子当中,就应该已经要存在的东西。啊,需要存在的东西啊,就应该有这么多啊,你来看一下,我现在写这个代码的话呢,我根本脑子就都不过了啊,因为上面有图啊,你就看着图上抄就完了。
70:01
我意外好了,那么这就是我们想要的图啊,好了,我们来综合分析一下啊,我们来综合分析一下啊,也就是说呢,当我把设计做完,也就是说呢,我根据要求啊,我根据要求,然后我做出来了一些它的输入是什么,输出是什么,我觉得能够完成功能好了,那对于我来说,我的整个的什么呢?叫做哎这个top level的一些端口我就写完了。那我就写完了,你先不用管内部怎么做,我先把端口做完了,所以呢,大家来想,当设及到这儿的时候,是不是已经有了端口的代码了,好了,下面再往后面讲,那中间我准备怎么实现呢?啊,中间的设计我准备用什么来实现呢?在这我们来说一下啊啊本设计采用状态机实现,那好了,我们来看一下,对于自动售货机来说,我们大家来想一下,一共会有几个状态呢?我们来分析一下,共会有几个状态呢?我们一起来分析啊一共有几个状态呢?嗯,一共有几个状态呢?那就那就看呗,首先第一个,嗯,第一个状态没有人没没有人买东西吧,那就是zero,比如我们叫zero状态啊,就是说啊,没有输入啊,没有输入金钱的时候就是zero种状态,然后呢,你输入了五毛钱就变成什么,就变成h halff,就五毛钱的状态,对不对,就0.5元的状态,对吧。
71:30
那好了,那么然后呢,是不是还有什么,是不是就会有一个叫做一块钱的状态,好,我们称之为叫做一块钱的状态,那还有什么,是不是还有一个叫做1.5元的啊,不能叫1.5,应该叫轮一消划线har啊,叫做一块五的状态,对不对?那还有什么,是不是还有一个叫做两块钱的状态,对吧?T wo叫两元的状态,那好了,下面我来问个问题啊。
72:02
呃,你觉得会有三块钱的状态和两块五的状态吗?就大家想想,你让你设计的话,你会设计两块五的状态和三块钱状态吗?其实设计也行,那当然了,不设计也行,有人说如果你要不设计的话,那你怎么去出水啊,比如说到两块五了之后我们才出水,对不对?那我问个问题啊,那么如果说到两块五了你才出水,这是没有任何问题的啊,这是没有任何问题的,但是我来问个问题,是不是,如果说别人投钱投够两块五了,你出完水了,然后怎么办?然后是不是两块五那个状态出完水之后,就会自动的再跳入到零状态里边去,就是没有钱的状态里边去,所以在这儿我就举个例子,我就不再去做两块五和三块了,我就假如说在两块钱状态的时候,比如说在两块状态了,你又投入了五毛钱,我就直接给你跳到zero状态去了,并且往这儿跳的时候,我还直接再给你输入输出一瓶水,如果在两块钱状态你输入了一块钱,那怎么办?我还是跳到zero状态去,然后呢,我输出水的同时再给你输出。
73:21
到零这不就OK了吗?对不对,所以那两个状态的话呢,我先不要它啊,不要它,那一共有几个状态呢?一个两个三个四个五个,一共有五个状态,对吧?啊没有钱五毛钱一块,一块五两块好了,那么下面的话呢,我们来去。一起来分析一下啊,一起来分析一下,就是把输入和输出呢,我们一起来分析一下啊,什么呢,首先第一个啊,就是说这个复位结束以后。复位结束以后,应该进入到什么状态呢?他应该进入到的是zero状态,也就是说呢,它应该是一个。
74:03
你机器刚上电对吧,就是呢,等于幺的时候机器刚上,那么它呢,应该怎么办呢?它应该在zero状态。好啊C好了,那么他在这个zero状态的时候呢?啊,我们来看一下啊,我们说如果在这个状态的情况下,如果它输入的是五毛钱。如果你输入的是五毛钱,你是不是应该跳入什么呢?是不是应该跳入到alf状态啊啊,那如果你输入的五毛钱,那你五毛钱是用什么来表示的,应该是用它来表示对不对。好,那如果说你输入的是一块钱呢。
75:10
它是不是应该等于on对不对,如果你输入的是一块钱,那么是不是应该是啊,好像点错了,应该是这个。如果你输入的是一块钱,那么是不是应该从没有钱的状态直接跳入到一块钱,对吧,是不是这样下下没下来等会儿啊。嗯,要不然就这样吧,这个好像他不认为是在这个下面,那就这样,呃,所以呢,这种状态收入五毛钱在这儿,入一块钱在这,那如果五毛钱和一块钱都没有收入呢,它是不是应该在自身啊去在这的话呢,我来给大家画一个这个。
76:04
嗯。就是画一个弧形就可以了。然后弄出一个大概3/4圆。然后把它缩小。缩小,大概就缩成这个大小的样子了,就是说不要太大,也不要太小,然后把它的这个末端改成箭头,就是它自己指向自己,然后把这个拿到这边来。然后呢,把它给旋转一下。好,完了就到这,就是他呢,这个状态是自己指向自己的,那么什么情况下他会自己指向自己呢?也就是说当他不来,那不来我们用什么,用他的非来表示啊,用它的非来表示,那么它不来,并且呢,也要在语上,谁不来呢,感叹号。
77:00
啊,谁不来呢?对于我们啊,就是一块钱他也不来。啊,也就是说五毛钱不来啊,并且呢,哎,一块钱也不来的情况下,就在本状态跳啊不断跳那好了,那么是不是zero状态就考虑完了,你就算是每一个生周期刷新一次,那好了,那我每个周期都要判断什么,都要判断flag啊和这个flag他来不来,他要来了,我就直接就跳转对应状态,如果他不来干什么,我就在这不动啊,就在这不动啊,你都不来就在这不动。好了,那么下边的话呢,我们再来看对于五毛钱的状态的话呢,他要来五毛钱是不是正好去跳转到这儿啊,那如果来一块钱呢,是不是应该什么,是不是应该去一块五的状态啊,是不是应该去一块五的状态,对吧?这没问题吧,是不是该去一块五的状态,所以在这的话呢,我们画一个一块五的状态。When。我们把一块五的状态,我们把块五的状态到这。
78:06
呃,画到这儿吧。一块五的状态。嗯,还是在这儿吧。好一块五的状态是一块。Alf好,一块五的状态,那好了,那如果来的是一块的话呢,那么它就应该去一块五的状态。所以就应该从这。到这儿。好。挪一下好了,那么如果来到一块呢?是来这儿。对不对,那如果什么都没来呢,是不是还在本周上待着,所以我们把它这个移到这。给他转一个圈。转的比较狠了。这转一下。到这边来好,那如果什么都不来呢,是不是在这儿?
79:07
好,那对于一块钱状态呢,块钱状态如果来的是五钱呢,他是不应该去一块的状啊。所以我们给它作为这个。啊,这个是一块是吧,五毛。在这好,那如果他来的是一块呢,是不是应该去两块钱状态啊。我们来给它做一个两块钱的状态啊,两块钱的状态的话呢,我们给它放到这。我们给他一个T啊,两块钱啊,如果来了一块钱的状态呢,如果是在一块钱状态里面来了是一块钱的是吧。放到这好,如果他来的是一块钱的,就是这个。好OK啊,来到这一块钱就在这儿,那好了,那如果什么都不来呢。
80:08
如果什么都不来,那就在状态待着。好啊,是不是来就在本地待着?好了,那么对于一块五来说呢,啊,因为一块钱考虑完了,对不对,对于一块五来说,对于一块五来说,如果来五毛钱呢。啊,换了个方框呢。好。对于一块五来说来五毛钱就在这儿,那对于。他来说啊,对于他来说,那如果来的是一块钱的一块五,来一块钱是不是两块五就够了,那么如果要够了之后怎么办,是不是就应该直接去清零了。
81:04
也就是说,如果说在这来的是一块钱好了。该干什么,该去做输出了,对不对,所以在这个话,我们把它变成生成条件,那就是说在这啊加个条件。好,那么它又可以干什么,就可以做输出了,对不对,谁输出谁呢?啊就是输出啊flag_water等于一。啊,也就是说呢,在这一条线上啊,在这条线上啊,就是说啊输入啊,上边是输入,下边是输出啊就是输入啊,如果flag one啊,它等于一的情况下,那好了啊,那么就跳入到zero状态,并且输出一个水那好了,那如果在如果在这个状态下,如果什么都没有呢。那就在本状态待着。
82:06
啊,如果什么都没有,那就在本那待着啊,什么都没有,我们给他拉过来。好,什么都没带本状态了,好了,那如果是现在一块,我也考虑不了给两块了,对不对,那如果两块钱状态下啊,无论来的是五毛钱还是一块钱,他是不是都应该去Z种状态啊啊,如果他要来的是五毛钱。点错了,如果来的是五毛钱。好,如果来的是五毛钱,那好了,是不是这个。他是不是就应该在这儿去做一个。如果来的是五毛钱啊,这是一块是吧?呃,我们给它改一下吧,如果来的是h half LF啊,如果来的是五毛钱就出个水就可以了,那如果来的是一块钱呢?是是它还是趋于这种状态啊啊,他是不是还是取于zero种状态,在这再来画一下,这个就可能越画越长了。
83:30
好,那如果它是一块钱呢,那它的结果是什么,是不是就应该是不单单会输出水,然后还会什么,还会输出一个。Mon等于一。这两个不要啊,这是下划线,下划线嗯,它代表的是条件啊,我们输出不要下划线好了,OK啊好了,那么是不是在两块钱当中,是不是还有一种情况,就是什么都不来对吧。
84:14
好好了,那么大家来看一下啊,这一个就是什么?这一个就是啊,我们为大家呢做的什么,就是说我们根据我们的考虑,我们做了一个什么,我们做了一个叫做叫做状态转移图啊,这就状态图一共有五个状态,那么这五个状态呢,分别谁跳到哪,谁跳到哪都有条件啊,都有条件啊,然后呢,并且还有什么,并且呢,我们还做了输出,比如说在一块五的状态下,如果来的是一块钱,那好了,我就要出一瓶水进入这个状态,如果是在两块钱状态下呢,来的是五毛钱出水,如果在两块钱的状态下来的是一块出水找零,如果在两块状态什么都不来,在这不是不变,那好了,那么来看一下,呃,我在最早之前给大家讲课的时候,我是不是说过一个问题,什么问题呢?我是不是说过,我说。
85:04
你不能说只去写满足什么条件下,它等于一,你一定要写什么,你一定要写它满足什么条件下。那就是满足数命线等于一,那还要写什么,还要写满足数命线等于零对不对,就在这的话呢,一定要注意啊,就是只要标注等于一的就等于一,没有标注的都等于零啊,没有标注的都等于零啊,就说只有在这种情况下都等于一,其他情况都等于零啊,这才产生的是一个脉冲,那好了,下面来看一下啊,当你把正在转移图做出来以后,我们就认为什么,我们就认为大家呢已经把整个设计做完了。啊,这个事做完了,比如说为什么呢?好了,我们下面把这张图在这摆着,我们不动啊,前面写代码,那么写代码的话怎么写呢?所以首先第一件事儿啊,第一件事儿啊,你要做什么叫做状态编码啊,对于状态编码来说,我们用什么?我们之前是不是讲过参数叫primemeer,对吧?那么在这我们不用project,我们用用另外一个叫local prime什么作用呢?就是叫做本地的参数,那么本地的参数和meer有什么区别呢?Premeer是外部,在利益化的时候是可以更改的,而local是不可以的。
86:14
啊,Local prime是不可以的啊,所以在这的话呢,我们用local p啊,因为是状态,我们内部的不希望别人去改啊Z啊一共有几个状态呢,应该是一共有。啊,123455个状态啊,在这我们来写五个状态,就是五撇B00000啊在这我都先写成000啊,因为一会儿好修改好,那么zero,然后呢是na aaf啊然后呢是on啊然后呢是on_h half一块五对吧,然后呢还有一个是两块钱t wo好了啊那么对于我们来说毒热码变码呢,就是一步一步往前移是吧?好读热码编码写完了啊,也就是说呢,这个就是我们采用中态机读热码编码啊,给了这四,给了这五个参数啊,给了它分别对应的值,下边的话我们写什么RG写一个四。
87:28
到零的啊,叫做当前T,叫c state reg,再写一个四到零的n state好了,那么这个c state n state分别代表什么呢?它就分别代表的是我们这个图当中呢,这一个信号称之为the c data,这个信号称什么呢?叫做N,这个叫当前值,这个叫下一个值啊叫next嘛,啊叫下一值,所以我叫叫当前状态和次态啊,啊这是一样的。好了,那么我们先来描述中间这个志愿者嘛,之间这个就是个组合逻辑对不对啊,就是个组合逻啊不是它就是一个寄存器对吧?啊,就是个寄存器啊,那人家坏了就是个寄存器对不对?所以对于我们来说呢,先描述中间这一个叫寄存器,好写代码。
88:18
Always。那么在这的话呢,我们在嗯,复位的时候呢,我们给的是这个。Zero啊,那么复位结束以后呢,我们就是把这个不复位了以后,把N给到这个。
89:05
而这一段啊,电路描述什么,其实描述了一个就是寄存器嘛,它就描述了一个非常简单的一个寄存器啊,就是什么,就是我们这个中间这个寄存器。啊,对于他来说它是什么,它是根据当前输入。啊,不是根据这个当前态和输入的一段组合逻辑产生的次态,对吧?所以呢,注意它是组合逻辑啊,怎么描述呢,Always eight here begin end,然后case括号c state and the case好,结束了啊,那好了,下面我们怎么来描述呢?来看一下,注意此时写的代码就是什么,就完全不用,不用不用过脑子啊,不用过脑子你就直接按照这个图抄就完了,比如说现在是呢,我们复位结束以后在zero状态对不对?那好了,现在我干什么就写zero zero,这写错了,Zero好,Zero状态。
90:12
然后呢,我们去往后写啊,Begin啊,End,好,那么在这段状态里边要干怎么跳转呢?因为我们只关心跳转对吧?哎,只关心跳转,那我们来看一下,在这个状态的话,如果两个都不来,就还在本状态,那还在本上什么意思?还在本身的意思就是说次态还是本状态,那么如果来的是一块钱,跳到one,那么如果意思是什么意思?就是flag one来了,那么虽然你还在这种状态,但是flag one已经来了,那次代变什么?要变成one对不对?那如果在zero种状态来的是五毛钱呢?那就是L变成half状态对不对,次代就是half状态对吧?那么对于我们来说的话呢,我们怎么做呢?我们先判断五毛钱,再判断一块钱啊,然后最后剩的就是他对不对,就条件总共有三条路嘛,就是你总要更新对吧,你次态是总要更新的,注意我所说的更新,它不是换了一个值啊,它不是换了一个值啊,就是要去更新一下啊,要去更新一下啊,就是说什么,就是说。
91:12
当前它是zero更新了一下,可能还是zero啊,它就必须要更新,因为每个使用件都要更新一下啊,是这样的,好了,那么在这我们来看一下啊,根据我们刚才所说的这个关系。在这儿先判断flag_五毛钱是不是等于一撇B1如果是的话,那么N这条等于什么?要等于的就是五毛钱的状态好else判断flag one是不是等于一撇B,如果是的话,那就n state等于什么,等于one状态,那else那就是什么?问五毛钱来了吗?没有,一块钱来了吗?没有,那就只能什么都没来了,什么都没来怎么办?那就是N4就等于什么,就等于Z好了,做完了,所以对于状态跳转来说,只是来产生什么ns state,并且呢,这个的话呢?
92:11
啊,并且这个的话呢,我们什么我们是完全按照这个图来抄的啊,就是说先判断它,后判断它,然后判断的就是剩的就是它对不对,那对于五毛钱状态来说也是一样的啊,就是我们还是按照那个图抄half r点的判断括号flag,五毛钱等于一撇B1,如果五毛钱来了怎么办?如果你都懒得想我们啊去一块一块对不对,因为呢,我们这个逻辑啊比较简单,也就说五毛钱来了啊,在五毛钱这状态啊,五毛钱来了啊应该去哪儿啊,应该去一块钱对吧?啊这个呢,大家呢都比较简单啊,因为都可以说直接就啊其实不画那个图,我觉得大家也可以能想出来啊,但是呢,就有了一个问题,什么问题呢?就是如果在比较复杂的时候呢,那你做不出来对不对,所以在这儿呢,五毛钱的状态来了五毛钱应该去一块钱,那如果来了一块钱呢。
93:11
啊,我们在图上啊,在五毛钱状态下,如果来了是一块钱,应该去一块五对不对,On一块五,那如果什么都不来呢?所以N等于的是还在本状态,好,OK,搞定,那下一个就是什么一块钱的状态呗,对于一块钱的状态来说,那么我们再来,如果来的是五毛钱呢,就是判断先五毛钱来呢,一块钱的状态,那就是这个状态了,五毛钱来应该是去的是一块五,所以n state应该等于的是一块五,如果来的是一块钱呢,那就N。
94:02
好在一块钱状态,如果来的是一块呢,一块钱状态啊,如果来的是一块,应该去两块钱状态啊,这少写了一个。啊,如果在一块钱状态来的是一块钱,应该就两块钱状态,所以在这的话呢,等于的是。T wo,好,那如果一块和五毛都没来呢?那N保持不变好,OK,好,那如果是一块五状态呢?好判断flag等于五毛钱W拉,如果五毛钱来了,那么n state应该等于的是TW那个我就不看了啊,在这儿就比较简单嘛,对不对啊,等于flag_one等于一撇B1,那么n state就应该等于的是。呃,这个一块五状态啊,一块五状态如果来的是一块应该怎么办呢?在一块五状态,如果来的是一块钱,那就应该回到这种状态,就是Z。
95:17
Else,那么n state就等于的是什么都不来,就还在。这个一块五的状态好,就只剩最后一个两块钱的状态了,T,好,那在两块钱的状态当中的话呢,我们来看一下。啊,在两块钱平台里边,无论来的是五毛钱还是来的一块钱,其实都要回到zero,对不对,只有什么都不来的时候,会在本质状态对吧?所以在这的话呢,我们就可以写个简单的,比如说判断啊,错了,FLAG5毛钱是不是等于一撇B1,或者flag一块钱是不是等于一撇B1,无论这两个当中哪一个满足了,我们的state都是去zro,然后如果这两个都不满足,那就还在t t wo啊,OK,最后剩一个default n state等于the,好了,搞定啊,也就是说呢,我们这一段逻辑写的什么?这一段逻辑就是根据当前肽和外部的输入来产生了次肽,就是n state就是什么?就是产生了S。
96:38
这寄存器的前面这个地端嘛,这跟我们这个当中是一样的,对不对,这不就组合逻辑嘛,对不对,根据当前态和外部输入来产生的一个人家这个寄存器的地端嘛,对不对,注意这段是组合逻辑啊,不要写错了,写错了就可能出不来了啊,写错了就出不来了,然后呢,最终还要输出,输出是不是也是组合逻辑啊,但是这个组合逻辑的话呢,我们后边可以加个寄存器,那么可以合到一起写,那么也可以分开写,在这儿的话呢,我们来呢,可以给大家呢分开写,那比如在这的话呢,我们来写一下输出,输出组合逻辑嘛,对不对,组合逻辑begin end,那好了,那么在这的话,我们来看一下。
97:17
对于我们状态机来说,我说了说什么说只是满足条件下啊,满足条件下等于一,剩下三项都都等于零对不对,那好了,那么对于我们来说,我们来看一下啊,在这个一块五的状态下啊,在一块五的状态下,输入一块钱的时候,输出等于一对不对,好,先把这个描述出来。判断括号c state是不是等于一块五一块五,且与上flag one是不是等于一撇B1,如果是的话,那好了,Flag water等于一撇B1,好,Else再判断,因为还有什么,因为还有一个输出水呢,两块钱状态下,两块钱状态下无论是五毛来还是一块来,是不是都应该出水啊,就在这儿再判断c state是不是等于t wo,如果是的话,那好再与上括号FLAG5毛钱等于等于一撇B1,或者flag一块钱等于一撇B,也就是说呢,在这种情况下呢,Flag water呢,也是等于一撇B1的,然后else,剩下所有情况都等于零,好搞定了,那么对于另外一个数来说。
98:40
Flag one来说呢?呃,不是flag这个money来说的话,找找零,找零是只有在两块件状态下起来的,是一块钱才会找零,对吧?好了,那在这啊,这个也是组合逻辑,所以用星对GA end判断括号state是不是等于T且与上啊,什么呢?Flag one是不是等于一撇BE1,如果是的话,那么flag money等于一撇B1,然后else flag money等于一撇B0啊。
99:18
所以你会发现什么呢?当我们有了这个状态转移图以后,你会发现啊,我看着这个状态转移图啊,我去写这些输出的时候啊,其实压根就没过脑子,全在抄,有说你为什么在这就这样啊,没有为什么呀,因为我把设计都写完了呀,就好像说我都已经规划好了,对吧,你比如举个例子,比如说我,比如说我现在啊,我从这儿啊,我从石家庄啊,我要去北京,那么我怎么办?我在去之前啊,我也没有买票,什么都没干,我就头脑风暴,我应该怎么去啊叭如我先到先到这个衡水啊,再到这个这个这个山东德州,然后我再到沧州,再到天津,再到北京,还是说我从石家庄啊往上走啊,直接去这个保定,然后再去这个各个地方是吧,保定,然后再到北京,还是说再往南转一圈啊,我做了好几种路线,到最后呢,我选中了,已经选出了一种路线,那这种路线呢,我做完了啊第一步干什么。
100:18
几个小时到哪几个小时我做完了,然后呢,我下边实施的时候怎么办。我还要再去想啊,我往这边走合不合适啊,那早就想完了对不对,所以按照这个表就开始抄啊,下一步要去哪儿,待多长时间,下一步要干什么,待多长时间就有了表了,对不对?所以呢,你会发现什么,给大家说最难的什么,最难的是你有没有想法,有没有设计思路,把整个设计做出来,当你把整个设计都做完的时候,做整个的这个代码的时候,这个代码完全就是抄,抄什么就是超设计报告。所以我们啊,所以我们经常会说一件事,什么就是最难的是什么,最难的根本就不是这些代码,这些代码有什么呀,这些代码什么这些代码都很简单,就就就就这几个,但是你会想它为什么能够实现功能呢?在哪啊,就是有没有人给你出这张表,当然了对于大家来说就应该自己去做,所以以后。
101:16
啊,就是说我们讲到后期的时候,我可能给大家讲的,或者我可能做的就最多做到这儿,就是我给你这张表,就把转转移图给你,我就不管了,代码我都不带写的,为什么?因为你就一定能从把这张图换成代码,如果说换成代码以后不对。那么对于大家出去的来说,可能刚开始就是什么,就是这个翻译的过程当中,比如说给你图了,这个图写代码写的错了,但是如果大家等到后边的时候,大家就会知道,如果代码不对,一定什么,一定是设计思路错了,就会找设计报告,所以对于我们来说。最重要的什么是设计报告啊,是设计报告,只要设计报告有了,设计报告没错啊,代码啊,就是照抄,所以我们就说这个什么叫体力活对不对,那这两个呢,在这个always当中输出了,我们来呢,进行综合分析一下。
102:11
啊,进行综合分析一下啊,这个就是我们的一个啊自动售货机啊,自动收货机啊,我们来看一看啊写了这么多对吧,它能够能不能够实现功能呢?那么这个呢,我们只能去仿真对吧,我们给两个脉冲,然后呢,看一看我们给了一堆脉冲以后,它能不能对应的输出水和这个钱啊赵灵对吧。好,我们打开R图先看一下。好,那么这二幺视图好像很简单的样子,对吧?啊,就有两几个货门雨门,还有一个二选一多路选择器,对吧?那在这的话呢,我们这有个黄色的叫s date,这是什么?其实这个就是状态机,也就是说呢,R这个这个call呢,自动的把我们所写的状态机呢给综合成了这样一种形式,人家不让你看啊,人家不告诉你我内部是怎么做的,那怎么办呢?我们可以双击打开。
103:06
啊说你可以打开,然后打开以后呢,它就会形成一个什么,它就会形成一个叫什么,这个叫状态转移图啊,就是它内部会综合出来一个状态转移图,然后呢,这个叫什么,就这个叫状态转移表,状态表这个叫圆状态,就是比如说从五毛钱的状态。再跳到五毛钱的状态的时候,什么条件呢?就是这个条件啊,你看点哪那个红啊,比如说这是一块钱,如果一块钱状态我想跳到什么呢?我想跳到是两块钱状态啊,从一块钱状态跳到两块钱状态,那是哪根线呢?啊,应该是这根线对不对?这根线什么这根线就是这个就是啊来的是一块钱而不是五毛钱啊,来的是一块钱而不是五毛钱,所以这个正态转移表,所以呢,大家也可以看什么,就是说它综合出来的正态转图和我们所做状态图一不一样,大家也会发现呢,状态转移图当中的话呢,只有什么,只有状态和转移条件,没有输出。
104:07
还没有输出的输什么输出他都做到外边去了啊,输出他也他也自己都做到外边去了啊,所以在这的话呢,希望大家呢一定要知道啊,那么有的时候你大家写的代码呢,可能会综合不出来这个啊,那么综合不出来这个呢,只能证明什么,呃,只能证明就是综合器啊,它的综合力度或者什么东西可能不太好啊,或者说在写的代码呢,可能有点乱,识别不了,在这这个呢,我们就不做这个太多的介绍啊,综合不出来就综合不出来吧,我们主要以功能为主,好吧,以功能为主好了,那么下边的话呢,我来赶快呢给大家把这个代码呢啊,这个来仿真一下,我们来看一看啊,我们来看一看它能不能实现功能。TB。好,做个绿化。
105:59
好,RG适中复位。
106:06
啊,然后呢,Reg flag one reg flag5毛,Where flag water where flag money做个连线。好,那么对于我们的下边来说的话呢,比如说我们的这个在这写时钟啊,之前我们怎么写的,之前我们都是写这个repeat对吧,就是repeat,然后呢,这写一个50啊,或者写一个80对吧,那好了,那么呃,今天的话呢,我们可不可以这么写,其实我们也可以,比如说我们写个50,但是这个呢,50够不够我也不知道啊,50够不够我也不知道,那咱这今天呢,就先写个50吧,比如clock等于一撇B。
107:14
零延时10CLOCK呢等于一撇B1,然后延时十好然后下边的该写什么该写这个叫做这个复位是吧?复位等于一撇B0,然后呢,我们还有的是flag one对吧?就所有的信号啊都在这个零时刻一定要赋值啊flag one啊flag half等于一撇B0好,那么延时二百零一二百零一,然后呢,RST-N等于一撇B1好那么在这的话呢,下边是不是就该去模拟脉冲了,那么脉冲怎么来模拟呢?是不是就我们说过脉冲怎么来模拟呢?是不是说呃,它的拉高的是一个时钟周期的长度对吧?那么拉高一个收长度怎么拉高呢?啊怎么拉高呢?啊对于我们来说是什么?就在选择一个时间点,比如在这儿啊,我们在。
108:15
前十个200吧,拉高时间点,然后flag one等于一撇B1,然后延时20,然后flag one等于一撇B0,其实呢,这相当于什么?这就相当于是拉高了一个生周期,因为一个生周期就20纳秒,对不对,就拉高了一个生抽期,那么比如说在下边呢,我延时了呃,369,然后呢,Flag one然后的话呢,等于一撇B1,然后呢,再延时20,然后flag one呢,又等于一撇B0,其实这呢也相当于延时的顺周期,对不对,只要说你等于一延时20等于零,这就可以,但是有了一个问题,什么问题呢?比如说。
109:01
我们知道在我们TB当中啊,写信号的时候呢,因为什么要求呢?不能够flagone的信号呢?不能够和谁呢?不能够和时钟上升沿对齐,对不对?那么它和升上沿对齐了吗?你不知道,那你怎么能算呢?比如我们在这里算看一下啊,也就是说等于零延是十,上升沿来了,那就是么?意味着我们是十的时候上升沿,然后十完之后是多少,是30,然后呢是50,然后是70,也就是说所有的基数的十倍都是上乘零,那么这个地方是上乘型吗?怎么办?你只能把369加20加30加200再加201,就所有的过去的所有数都要加起来,看它是不是什么,看它是不是这个这个这个十的奇数倍在这那太费劲了,对不对?所以那怎么办呢,所以呢,我们在里边呢,教给大家一个东西啊什么呢这样来做。比如说延时200之后写一个eight括号passage clock,这句话什么意思呢?就是先延时了200这个什么,这个叫等待一个时钟的上升沿,什么意思呢?就是说延时200之后啊,然后呢,我再等一个时钟上升沿,那好了,等一个时,因为这个时钟不是一直有的吗?我等一个时钟上升沿的话,那是不是也就是说在下边的时刻是不是就和正常线对齐了,那么延时二是不是就错开了?
110:35
啊,这个叫等一时钟上传沿啊,延时200之后等一个时钟成沿延时二,延伸二以后呢,Flag一块钱等于一撇B1,然后呢,再等一个时钟时,然后呢再延12,然后flag one就等于一撇B1啊一撇B0,所以呢,这种方法呢,是我们用的比较多的,就是说用啊eight啊这个postage clock什么意思呢?就是说用这个叫做等一个时钟啊,等一个时钟上升沿,所以你看啊200等一个双单沿,延是二,那肯定跟上链不对齐对不对,因为它是对齐的,延伸二轴就不对齐了,对吧,等于一,然后再等一个,然后延是二等于零,所以这个呢,正好是拉高了一个时用周期对不对,正好拉高了一个生用周期啊好了,那么这样话拉高一个生用周期对不对?那好了,我再把它呢复制一下。
111:35
复制一遍是不是就把这一个生周期,这一个生周期拉就是拉,就相当于投入了,是两块钱对不对,但是你每次洗的话,是不是都要把它干什么,都要把它给复制一遍,对吧。这这是一块两块,这就投入三块,对不对,就是每次投入一块,其实代码都是一样的,那么此时怎么办呢?此时你每次都要这么搞的话,就太费劲了,那怎么办呢?我们来想象一下啊,你说我能不能像这个C语言似的,我把这个东西呢,改成是一个函数,我每次就调用一下函数不就行了吗?注意在我们的vlo当中有个东西叫task,叫任务啊,叫任务我们来这写一下啊,Task,比如说task task,比如我们叫task one,注意这个task是关键字,这个是我们给task起的名字,然后分号,然后end。
112:23
Task好,结束了,那么在这里边我们可以写什么呢?我们写个begin end,好,那么在这里边写什么呢?我们就可以把这一段呢直接粘进去,我们就把这一就直接粘进去就可以了,好,我直接粘进去有什么作用呢?注意我就可以用这个task one,我就可以干什么,我就可以表示这一段了,就这一段我就直接写个task one,这一段也就是个task one就可以了。这比较简单对吧,然后呢,Task one,然后呢,我就在这再写啊,Task one task one task one可以啊没问题啊,这就可以了,就代表什么呢?就代表着输入了一块两块三块一块两块三块两三块嘛。
113:10
对不对,那好了,同理可得,怎么办呢?我们可以把它再复制一遍,往这一放,叫什么呢?叫task half,就是说我们去做一个五毛钱的haf,然后的话呢,我们在这呢,把这个改成呢haf好,那么这个的话呢。那么这个的话呢,干什么,我们现在又做了什么,做了一个五毛钱的一个task,对不对,好了,我们在这。好了啊,这个task代表什么?Task就代表就是说这个其实不代表任何含义,就代表这段代码。就代表这对代码啊,就代表这对代码,也就说我们用这一个啊来代表了这对代码啊,用这一个代表这对代码,因为我会重复去写好多遍,我又懒得写,我就用这样一个任务来代表它,然后每次呢,去这个去什么去调用一下这个任务就可以了啊,调用这个任务就以了啊这就比较简单嘛,对不对,比较简单,然后呢,我们也为了说看一看,我们在这个一块当中啊,就是在这个五毛当中啊,就在这个一块当中啊,我们穿插几个五毛钱,然后的话呢,我们在这个五毛钱当中的话呢,我们穿插几个一块钱,我们看一看整个逻辑还对不对,好,那就我们随便输入了一堆钱数对吧?好了,那么下边我来问个问题啊,对于我们来说的话呢,就是你看我这里边就是延迟二百二百十个生命周期对不对,那么也就意味着说一投入一次钱就要有十个生命周期,那么下边呢,十个生命周期还要再延时一个啊,再延时个就是20,就是就是12个生命周期啊,这个12个,这个也是12个那。
114:51
就一个里边是12个对不对,那好了,那么这儿的话,你写50还够吗?肯定不够了,那你应该写多少呢?其实有的时候我们也不知道什么时候就够了,所以怎么办呢?给大家换个字,找well,写well要几呢?只要不写WELL0就行,WELL1Y2Y8都行,就无限循环,这个就会无限循环啊,就会无限循环产生个时钟啊,那好了,那无限循环的话呢,那么就会出现一个问题,就什么对于电路来说,只要出现了无线循环的输入变量,那么整个电路就会一直仿真不停,它停不下来,因为它会一直循环,那怎么办呢?就在这儿啊,就是这个地方我们输入结束了,对吧?所以呢,我们为了让仿真停止下来,我们干什么?我们加一个Dollar stop,这是个系统任务,跟咱们的Dollar r就随机数那个是一样的,这个有个作用,什么作用就是让仿真停下来,那好了,现在呢,我先不停,我先注释掉。
115:51
啊,我先注释掉,然后的话呢,我来去做个设置,然后我来给大家仿真一下,让大家来看一看啊,就是说如果我要不加的话呢,会出现什么情况。
116:10
好,综合分析一下啊,今天呢,给大家讲什么呢?讲了一个无限循环是吧,Well啊无限循环啊,Well几都行啊,不零就可以,然后这个里边呢,讲了个task啊,就讲了个stop啊,这个先一会儿来说啊,我们现在先来去仿真一下啊,不带这个Dollar stop了,就是说这有了一个无限循环的clock之后啊,会出现什么问题啊。呃,我们之前写repeat的原因就是什么,因为我们明确的知道有几个生命周期就结束了,对吧?今天我们也不知道,因为我瞎写了这么大一堆,对吧,我也不知道什么时候结束对吧?但是我知道这个写完之后,后边就要结束了,对吧?所以在这儿的话呢,你要还要算算这个里边有多少个这个这个时钟,然后填到这儿嘛,那太费劲了啊,写1000也不一定够,写1万也不一定够,因为你也不知道这里边多少啊,那也无无无,这个叫做无限循环吧,那无限循环就会造什么,就会造成这个仿真器会一直仿真啊,我一直在说这个问题,那么下面来看一下什么叫仿真器一直仿真呢?其实对于我们来说,如果时钟一直有,一直有,一直有,其实呢,当我们的这个叫什么,当我们的这个设计啊,当我们的这个设计,如果如果说输入都已经不变了,对吧,比如说我们的FLAG5毛一块都已经不变了,在这你看。
117:26
还在运行,我们我现在手动给它停了啊,我现在手动给他停了,停了,我手动给他停掉好了,那来看是不是在这一段间之内,就是五毛钱一块钱啊,都是零啊,也就是说在这状态就不变了,对吧?那对我们来说没有意义,研究它没有义,那研究谁有意义呢?我们把光标放到最前面放大,其实我研究这一段变化对我来说才有意义,对不对,那后边这些呢,对我来说没有任何意义,对它都不变了,对吧?所以在这儿的话怎么办呢?我们可以直接在这儿说,我到这儿我就研究到这儿啊,后边时终再变化,你也不要研究了,没有意义了,怎么办呢?就把dollarto添上,它有个作用就什么,就是说让这个仿真自动停止,那么下面来看一下。
118:13
呃,保存了是吧,那我们就到这儿library把TB进行一个编译。这个应该是给大家已经讲过了啊,就是说不用关掉O重新打开啊,然后run all。它就会自动跳到这儿。啊,跳到这个界面的时候,告诉你我在这儿停了啊,我们来看一下到外部当中。重新缩放,你看它自动就会停,我我可没点stop,它会自动停啊,它会自动停的啊,它自动就停到这儿了。啊,那么它停到这儿以后呢,我们怎么办呢?我们就可以去分析啊,我们整个设计啊,做的到底是对还是不对啊分析我们做设计的对还是不对。那我们来看一下啊,对于我们这个设计来说的话呢,我们来看啊,这是一块钱对不对,一块两块大家来看,输入到两块的时候,这出现什么,出现了一个毛刺对吧?啊,这出现了一个毛刺,就是输出的时候会有毛刺,为什么?因为输出的时候我们是组合逻辑对吧,所以一会儿先不管这个毛刺,我们只管正确的啊,输入了一块两块,又输入了一个三块,然后出现了出水找零对不对,然后呢,五毛一块。
119:30
两块,然后两块五对吧,所以只出水不找零对不对,所以呢,然后再呢,哎,五毛一块两块五,只出水不找零对吧?但在这儿永远有个什么,有个小毛刺对吧?看到没,永远有个小毛刺对不对,因为是组合逻辑输出对吧?所以在这的话呢,大家看到我们这个逻辑呢,是正确的啊,逻辑正当然大家可以自动去分析一下,那么为了不让输出这个毛刺怎么办呢?也就是说把我们的输出改成什么,改成时序逻辑,那么一般情况下我们建议什么呢?我们建议大家去做输出的时候,最好输出模块,就是特别是什么内部倒无所谓,就是输出到什么呢?输出到外部的信号啊,输出到外部的信号,那么一定要做一件事什么?就是说让它做成持续逻辑输出,这样有什么好处呢?它就会没有毛刺了啊,它就会没有毛刺了,那在这我把。
120:30
这个flag water改成了实际逻辑,那么下边的话呢,Flag money我也改成实际逻辑。那么改成时序逻辑有什么作用呢?哎,注意它把毛刺就去掉了,但是呢,它有一个不好的地方什么呢?就是说它要比输出呢,会晚一个使用周期啊,就是比刚才的会晚一个使用周期。
121:03
注意啊,实际逻辑赋值量要小于等于啊,所以说在这儿我加上这些之后啊,注意一定要记得加复位啊,不加复位的可能是有问题的啊,一定要加复位好了,做完了,做完以后呢,我们放到这儿。然后呢,再来呢,去给它编译一下。好,编译通过以后呢,我们来。去restart run or一下。BT that。让奥一下。好。再来看这个里边呢,就没有了小毛刺了啊,就没有小毛刺了啊,输出都是正确的,大家可以自己去分析啊呃,投入的是一块,然后这个五毛五,然后又投入一块,然后找零什么之类的啊,大家都可以自己去分析啊,大家自己可以分析,那么这个呢,就是什么?这个就是我们今天讲了一个啊,这个自动收货机啊,说白了什么呢?说白了就是说呢,给大家讲了什么,讲了一个叫做状态机,什么状态机,然后呢,状态机设计的时候怎么来设计,然后代码怎么来写啊,然后呢,一定要把这些东西一定要记住,比如状态机的结构,这是组合逻辑啊,利用当前态和外部输入产生次态,这个是状态寄存器啊,就是说把次态给了当前态,就是一个寄存,这个输出呢,就是一个组合逻辑,但我们知道输出的时候如果用组合逻辑的话就有毛刺,对吧,所以干什么后边给它加了寄存器对不对,那加寄存器的话呢,其实寄存器干什么,寄存器可以跟它是连到一起来写,所以我就干什么就。
122:38
就改成了一起来写的话,就改成实际逻辑,那么也就说你不可以在那写,你后边单独加个寄存器不行吗?这个在之前给大家讲过,如果是组合逻辑,后边加寄存器,你可以分开写,你也可以合到一起写,我说了我建议合到一起写对不对,所以说这就是这样的啊,那么呃,这个就是咱们今天要讲那个什么呢?就是状态机啊,加上一个什么呢?加上一个叫做这个自动售货机啊,自动收货机。
123:05
啊,那么简单来说一下,今天啊一共讲了什么内容啊,首先第一个呢,给大家讲了,就是说这个踩到什么输出什么啊,信号的问题啊,就是说计算机的问题,再有下边就是什么,下边那个到底为什么踩的是前面啊,那么踩的为什么是前面呢?因为我们说踩的是Q啊,我们说一直踩的是Q,而上面时候踩到什么数什么踩的是D,下边时候踩的什么用的是Q,因为用的时候用的都是Q,没有人用D啊,用的都是Q的值,对不对啊,Q的值等于多少输出对不对,是这样的。那么第二讲什么讲了一个状态机,什么是状态机啊,它的结构是什么样子的啊,它的结构什么样子的,然后呢,就给大家举了很多例子,对不对?好了,那么第三个呢,用状态机呢,给大家做了什么,做了一个叫做啊,叫做这个自动收货机啊,并且呢,做出了一个设计报告,那么在设计报告当中,希望大家一定要明白就什么,就是如果有设计报告的话,那么代码是非常简单的,所以最难什么最难设计报告,设计报告能不能做出来。
124:04
啊,那么呃,这是我们这个理解,那么在这个当中的话呢,我们装载机呢,其实呢,还有一些呃,其他的一些小的技巧啊,在这我们还没讲,我们可以放到明天呢,继续给大家来讲啊,继续给大家来讲啊,这个呢,希望大家一定要去呃多去呃做一做练习练习,包括画这些图啊呃,我最开始的时候我画这些图也比较费劲啊,那么后面画多了啊,我觉得还是呃蛮轻松的啊,没有那么费劲啊,没有那么费劲。好了,大家看有没有什么问题啊,有问题说一下好吧,然后给大家来解决一下。没有是吧,其他人呢。就是做咱们这个的话呢,呃,一定要去多做啊,多练习,然后呢,呃,现在就是说什么呢?就是现在还有好多人在问问题啊,问问题那么问的很多的问题的话呢,都是一些基础的问题啊,就是有很多人觉得呀,很简单,无所谓,或者说直接按照别人去抄,没有去理解基础啊,然后的话呢,对于后边很多东西就开始不理解,因为做着做着做着就不理解,然后干什么返璞归真去补前面的,越补前面的越不好补,因为它后边的虽然有经验了,但是有的经验是错的。
125:32
啊,有的人是错的,所以就比较费劲,所以希望大家的话呢,还是要把咱们这个正规的啊,设计和学习的这个套路啊搞明白好了,那没问题的话呢,就把这个好好做一做,分析分析,然后呢,咱就明天见好吧。今天就到这儿了。Okay。
我来说两句