原标题:叩持电子(IC修真院)-ASIC数字IC设计讲解(2)

提醒:【视频版课程】关注叩持电子官方知乎观看!

大家好,我是IC修真院的Andy老师,接下来跟同学们一起来分享一下protocol协议。

协议是一个比较广泛的概念,像TCP/IP我想同学们都非常的熟悉,那在我们ASIC设计当中,大家想象这样一个问题:从流的结构上讲,无非就是一个数据流,一个控制流的作用或者是命令,来辅助控制数据的。

那我们有时候做ASIC,无非就是把一些数据从一种形式转换成另一种形式,从一个地方搬到另一个地方。多模块也都是干这个事情的,一个数受限,那就把串的转成并的,并的之后转成串的。

大家可以想象一下手机,你把天线发起来的这个数据RF下来,接收下来,是音频,视频,那发射出去的时候,也是这样子,那一定按照一定的标准,这就是协议,协议就是你做事情的一种方式。

我们就拿复位来讲,reset存在于任何一个电路,我们做这个SOC,做ASIC。都离不开reset。那reset的作用,就是说复位使这个电路恢复到一种初始的状态,或者一种确定的状态。

同学们注意了,这里说的是使我们的电路恢复到一个确定的状态去。有的同学问我们里边用到flip flop。他有一个带复位端,有的不带复位端,带复位端的flip flop他有确定的数值也有确定的状态,那不带复位端的那确实是因为他没有接触reset的直接影响,没有一个确定的数值状态。那如果说,在我们的设计当中,能够保证即使它的状态不确定,他也不会影响后续电路的功能,那就可以不加reset。那随着clock的拉高。他的前期的data,慢慢地流进来,就会使它有一个确定的状态,这是对应的实际应用当中。

那在我们的仿真当中就要注意了,一定要给,如果没有了reset,他的执行是一个X,那到时候会影响你后面的电路功能,整个都变混乱了。复位的协议上是这样子,我们可能有low 电平有效,就是说,这个信号为低的时候,是起作用的,同学都写过了verilog,那我就一般把这个的reset加一个n,都是高有效,如果你不加n,那么reset可以是异步的,什么是异步不取决于我的clock,想什么时候来就来,想什么时候走就走,异步的,或者说是同步的,必须要有clock,在clock的约束之下才能起作用保证我reset的长度,就足够长的时间。那还有一种我这就兼而有之,异步复位同步释放,这也是目前ASIC设计当中用到的所有工作方式,大家想一想,他们也是类似于是一种约定协议。

那异步复位只要是复位信号有效,就对这个系统进行复位,跟这个时钟有关,但不依赖时钟,这就是他的一个很大的优点,想象一下,万一哪个clock有点问题了,默认的PLL没有输出了,如果是用同步的话,那就有问题了。同步是在时钟有效沿进行复位。那么,如果是异步复位,那跟clock没有关系。只要一来就把你整个系统给reset掉了。那异步复位的时候呢,并不是说他就完美无缺了,那你对relist的时候,如果是刚好在哪个clock时钟沿附近,那就容易出问题,所以它里边有recover和remove的要求.

同步我刚才也提了一下,他依赖于我们clock的上升沿,那同步复位的有没有好处呢?有好处的,因为你想你所有的事件非常全,依赖于这个clock,上面有点毛刺都没有关系。可能都给滤掉了reset上,综合出来可能加入的那个工作频率就能比较高一些。但是他对reset的市场是有要求的,可以想象一下,如果reset的generation非常短,那识别不到就会出现问题了。

现在我们用的比较多的,就是所谓的把两种优点结合起来,异步复位,同步释放.

比如说,用两极的flip flop来实现。就像上图展示出来的,把第一极的flip flop这个地端接到电源上去。

有的同学会看到有的里面是这样的写的,这个地方写了个1,它是一个道理,接到VCC上去的时候,如果说是reset一来,当然reset是从别的do main过来的,跟这个clock肯定不是一个do main,过了以后这两个reset马上起作用,进而使得这两个reset到这边的也马上起作用,那一旦释放以后,这个一会先打进来,过一拍稳定的之后,到后面去,跟clock的沿,因为这是一个data,这个是接到我们的地端,这样子过来达到了同步释放的目的,这就所谓的reset synchronizer,那就是说从这个控制流上来讲,也是一种协议。

另外还有一些信息交换的,比如说握手信号,简单的从控制流的这个角度来讲一下,我们现在做ASIC发明一种protocol,但大家用的最多的还是一些比较成熟的接口的标准,以及些时序。

比如说IP互联,现在大部分嵌入式处理当中,会经常用到ARM的CPU。尽管你不用它,里面可能也会有用的这些AHB,APB的总线时序。

来看图,相信很多同学们都看过,这是从ARM的官方网站截下来的,就是它的AHB的一个AMBA总线里面的AHB的一个框架图。那从性能上来讲,它提供了类似于是三类,一个高性能的AXI。可扩展的这个interface。他就性能更高。像ddr,他这个速率的比较高,AHB显然是不合适的,可能这个效率比不上AXI,那一般传播数据!如果不是有特别的slop的需求。这个AHB的接口,基本上是定的。

如果说仅仅是控制一些比较简单的交换,一点点的控制信息,访问一些寄存器,一些比较低速设备上使用的时候,AHB那有可能现在有点大材小用了。那我们可能那就会选择这个APB。就是针对这个的periphera的。关于这个APB呢,讲这个实验用例的时候,就是接下来的实验,同学们要做的实验当中,我们推荐用APB去做一个LCD1602的一个控制接口。因为这个都是公开的,可以去找一下看一下,右边这个图给出来的就是说,这个接口怎么来连。里边,比如说AHB里边,我有很多的Master。要往这边的很多slave发送数据,那我一定会有一个arbiter,arbiter就是仲裁,发请求。根据一定的算法,授权方式允许谁,因为就这么一条路。我是让你来发啊,还是让他来发呀,大家去申请。那你一旦占用了别人就没法占用了。你发完以后别人再发送。这是arbiter的作用,建立,master跟slave内部之间的这个连接。decoder的的作用很简单,就是一个纯combination的东西,他会把你这数据、地址,都就是谁去选择谁。这是我们的比较典型的这么一个接口。

那这个图呢,也是在这个RAM官方网站上里边截取出来的,如果说我们是一个比较典型的这么一个结构的话。他是分级的,主要是这个思想非常重要就是说,你不要把一些非常慢速的东西,一起挂到一个高速的东西来了。因为你的速度非常低,刚才我讲到了你的arbiter一旦给你了以后,这个总线,你就在那HOLD住了。你像一个蜗牛一样,在那龟速爬行,那别人搁那等着很着急了,那这个思想就说,我尽可能的把一些高速的high performance。这么一些IP,归到一块儿去。像CPU,DMA放在一块儿去,那把低速的放到另一个地方去。像UART啊,timer呀,一些input,output啊,这些都是一些比较低速的放到另一个地方去,没关系的,慢慢干就完了,然后通过一个bridge桥接起来,那对APB这边来讲,bridge是它唯一的一个master。那这个呢,相当于是从AHB到APB的一个转换。APB接下来呢,会稍微详细地给大家讲一讲,因为我们接下来要用它,就是我会在APB这个上面的稍微那个展开一下讲一讲,那APB呢,相对来说也比较简单,就是说大家理解这个含义,它实际上是一种思想,这里面是非常重要的,那这也就意味着如果说我们自己来做一个产品,做一个东西的时候,我们也要规划好,尽量的把高速的,低速的,超高速的分开,不要把它那个都弄到一块儿去。这样对你的这个整个的性能是有损害的。因为它一旦arbiter给到你这个低速的上面去,它一直在那hold了,那你的那些高速的一些很紧急的事务那就那没法完成了。

那APB总线。APB呢,刚才上面的例子怎么看呢,就是说低带宽。相当于是每一个周期都可以出个data 。那APB不是这样子。他是个非流水的结构。那他都是跟这个clock的上升沿相关的。必须要先发送地址,最快的情况下,下一个周期data,那可能需要再继续延长等待。那AHB跟APB,它可以连接起来的,就是所谓的那个刚才前面看到的这个bridge,就是我们的design当中呢,有这个AHB,APB的bridge,那这个呢实际上,现在这个bridge的有非常成熟的这个design。经过充分的验证。这属于我把它叫做比较经典的电路,推荐同学们呢,如果是有能力有时间的话,好好地看一看,掌握一下。

那这张图呢,show出来的是非常全的,给出了全部的这个。APB对应的信号,以及它的一个简单的一个描述。那肯定会有clock。Pclock,那我们注意了,就是说在我们一个非常复杂的这个ASIC设计当中呢,一般是这样子,就是说我们这边有时钟源,比如说,我们这边有PLL。它产生出高速的clock出来,那这个高速的clock,可能会知道给直接给到一些比较高速的模块来使用。举个例子讲,不写MCU了啊,我这个地方写一个CPU。这个频率可以跟他用同频吗?或者是在同一个地方,我把频率降一下,我经过调低这个频率。

比如说这个地方还有别的master,它可能也工作在一个类似的跟它数量级相当的一个频率上面。那下来以后,到一些稍微低速的一些模块上面,这个频率是不是就有点儿高了,那么可不可以把这个频率跟这个地方再降低一下。把它这个clock作为你的bus clock来使用,我把这个clock进一步的再降低,所以说,我们里边经常会看到有这个AHB的CLOCK,这个APB的CLOCK,大家看到它那个CLOCK实际上频率是不一样的,可能会有一个比例就是为了满足这个性能,不同的公司做法不太一致,会有一个比例在里面,clock是不可少的。ADDRESS必不可少的。PCRIGHTLEFT就是你有这个bridge产生的一个信号。

使信号这个时候的data就可以开始了,它是用来表征。你是写呀,还是读啊,大家看下这里边并没有Pwrite。所以说这一个信号表示了两个含义。如果它为一,那就是写,如果为零,那就是读。那你要写的时候,肯定有这个Pdata,他这个地方没有写位宽,这个肯定不是一位的,跟address一个道理,都不是一位的,clock reselt这个地方呢,可能是APB吧.

表示能不能接收或者发送数据。如果唯一的话就是ready的,那这个地方就要注意呢,就说,尽管他有一个Pwrite data,它有一个Pread data这两个呀,在某一个时刻呢,只有一个是起作用。大家想象一次就是你要么现在是读,要么现在是写,因为他连他不但不支持?并不是说,TA 能够同时读写的,这个呢希望同学们的要记住。

这个呢是说我们APB的这个对应的状态机的图,如果你没有任何的transfer,遇到IDLE start,那如果说现在那边,发现了这边呢,有这个transfer了,它就会进入这个setup start,它会把这个PSEL选中的哪一个,地址是知道的,把它拉起来。并且呢,他在这停留一个周期,拉起来拿起来以后呢,那如果说是那边的ready了,但是没有transfer,那就回去呗。这是这个APB这边,对应的这么一个简单的状态,记得一个图。

那这个呢,是简单的这个APB。写跟读,如果说他没有为了state的一个时序图,那为什么要讲这个呢。因为还是那句话因为我们接下来要希望同学们做的这个课程设计啊,里面也用的这个。所以说咱们稍微一起来看一下。就是说,比如说我在这个cycle,我把这个address打出来,我现在就是写变为高,他一定是从这个launch出来的,如果这边ready的话,那就把这个DATA给取走了下一个cycle,因为我要读,一定是从内部这边发出来的。他会把ready拉高。PABLE为高发出来,下一个把它的DATA capture就OK了,所以说,看一下这个没有位的cycle,没有位的STATE,所以说,你看,经过两个周期这个就完成了这个transfer。那如果说是内部这边没有,如果说16这边没点位令前面都是一样的,大家看一下好,这都是一样的,都是一样,那说这边,他比方说,有一些什么啊,内部呢比较忙,它没有把PREADY拉低,这个hold住,那这就意味着你两个cycle无论如何,你是完不成了哎。他如果说,它这个cycle,他的ready起来了,那这个时候呢,把这个DATA capture走,紧接着那这个赛吧就可以把这些信号点色彩。这是WRITE,那READ也是类似的,READ因为完全是一个四类。五这边呢,拽不出来的,前面也是一样,就是说OK。

但是呢,你这个没有ready,你就等啊。就在X这个一直有跟他等啊,等等到人家这个ready起来了,它会同时他也转不了这个端口上面那你在这个spec。这就是有这个WAITSTATE取决于你PREADY这个什么时候拉高。这是所谓的这个APB的,因为我们的实验中用到这个,我们把这个给大家讲一下那AHB比刚才也提到了就是说你的APB,这边一定是有一个bridge,把这个东西发过来,但是,这不是意味着说我的design当中,我如果说我这个design,同学们要理解这个意思啊,就是说并不是意味着你的design在里边呢,一定要有这个。在我们的实验当中呢,比如说我们的上位机是MCU的话,一个控制机的话,我们只需要提供这个APB的端口就可以了。就是说你这个地方从这个地方看到的,你每一个模块对应的。你都是APB的信号,那这个READY是这样子。如果说我们能够保证人家slive,比如说,我现在一个往里写,我就不去读,我就是光往里写,我只是借用它这个APB的这个INTERFACE。但是,这种情况下你就认为这个PREADY一直是高的,你就不停地往里写,就是任何时候,人家说,我任何时候都是ready的,你来往里写吧,这也是可以的。

那这是AHB,也是我们这个用的非常之多的,Master通过这个地址和控制发起你这个读写操作。但是,我们知道,因为有arbiter的存在,它要确保每次啊,只有一个,每次确保只有一个Master允许达成这个数据的传输。也就是说,你这么多Master,某一时刻只有一个是处于有效的,你能够使用这个总线的,因为大家看一下这有一个mux,这一个,马克思那这个mux ADDRESS上来讲13个都过来的,他说完,仲裁以后,它允许比如说就是你。那这边相应的。就是说你这个东西你要写的哪里去了,这是通过地址译码,select出来。那还有decoder,这个比较简单,他就是一个纯condinatioal的一个译码,相对于前面,我们讲过的这个APB的这个时序,那AHB的时序理论上来讲要复杂得多得多得多,因为它有比如手电筒的操作。这个也是从安保的里边截取出来的。

那我们这个地方呢,看了就说是最简单的一个transfer,比如说也是没waitstate的,那他一般是包含两个周期。首先一定是任何的传输开始的时候,都是一个Address的phase。发完就完了,只持续一个cycle。比如说这个地方,Hclock一来,那前面,同学们注意了啊,就是我们APB里面我们使用的是Pclock,就是大家约定俗成的,你都是用的Pclock。那么在AHB里边呢,一般这个地方呢,就是写成一个hclock。那么在这个launch出来,address。address发出来,控制信息控制信号很多,这个地方,不要因为这是专门有一个控制的总线,不是这样的,它里面有很多信号,这些信号呢,随着你这个都是带着这个address phase的时候,把他一起的起来的。如果你是Write data的话。你也不是在这个地方就把Write data发起,而是在下一个。那如果说这个周期结束以后,这个只持续一个就意味着你真的一定要来之下,紧接着的下一个cycle,如果说这边是ID的话四类。

我这边的话,如果你是写的话,那这个时候,你就可以把这个data放到你的上面进去,大家注意了这个地方,你看这个地方的address control已经不是原来的了,这就是拍不烂,就是说在这个DATA phase的时候,我一方面要把前面ADDRESS phase对应的那个data,要发出来,同时要把我紧接着又进行操作的ADDRESS以及control signal同时发出来。那这样子的话,就会提高效率,但是一定是先开始的,一定是一个address phase。紧接着,是data phase,你不能在这个地方,把你的ADDRESS跟data一起present。那read data呢,也是一个道理,就说前面我一定是在这个时候,我才开始去capture这个data,这是没有位的cycle。

如果说是内部这个时候没有ready,他延长的是我的data phase,我的ADDRESS phase跟前面还是一模一样的。我只持续一个cycle,同学们呢,务必要牢牢的记住,就是我的address phase,还只持续一个cycle。我把地址发出来,相关的控制信号发出来。发出来以后,到下一个cycle,这个时候看有没有ready。

如果说这里头没有ready。他的ADDRESS也不会再发了。你没有ready了,我把这个给我的address呢,和我的这个control signal 来repeat一下。只是说,这个时候如果说你要write data,你这个data,不能撤销,一直hold住,到什么时间呢?

一直hold住到他这个Hready。这个slave把它DATA取走了,我这个Hdata,他现在才原因。他延长的是我们的DATA PHACE那,跟read data来讲,也是一个道理,你没有ready,Master一直等着啊,因为slave压根就不发data给他呀,他什么时候发呀,这个Hready因为是从slave来的,他准备好了以后,,同时把data弄出来,那Master,他能看出撤走。在进行这个数据的传输,实现这种AHB,那这样呢,实际上就说从那个效率上来讲,就说就有点儿浪费了,因为你这个一直不结束,你就没法进行下一次,刚才讲过了,就是说,大家看起来这个接口。

如果这个结束不了,一直会HOLD住整个bus,别人是没法因为arbiter就保证给你用,因为没有结束slave比较慢,只有等着transaction结束了以后,才能看下一个。

那相应的这个地方,一定要注意,原来发出来的address,以及control signal。在Hready没有ready的情况下,一定要Hold住,不能说,我发了,发过了,那是不行的,协议不允许的,就是时候说没有Hready,你这个一定要保持住。

比如说举个例子来讲,比方说B,你hold,不能说就只发一个cycle,这是不允许的,这是AHB的困难,那AXI的就更复杂了,它会分为address,data,control,把它分成几组,效率上来讲更高,那AHB实际上也是蛮复杂的,这个地方呢,因为接下来的实验没有用到AHB,我们用的是APB,所以多讲了两句,然后AHB这个地方,给大家讲了一个最简单的,那有兴趣的同学可以自己到RAM官方网站登录学习一下,如果说手头现在有对应的code,那可以去跑一跑,看好不好?那这是我们这节课的内容。

这节课主要是简单的熟悉一些protocol,reset,以及重点关注AMBA的APB。

未完-待续......

~END~

喜欢请点赞!欢迎在下方留言讨论!

相关文章