双层AMBA总线设计及其在SoC芯片设计中的应用
2015-04-16 来源:eechina
一般说来,SoC芯片是由片上芯核、用户设计的IP核以及将这两者集成在一起的总线组成的。片上芯核决定了使用何种片上总线以及芯片的体系结构。ARM系列嵌入式微处理器凭借其高性能、低功耗的特点占据了市场的主要份额,ARM7TDMI因其相对低廉的价格在SoC芯片设计中应用比较广泛。同时,ARM公司开发的AMBA (Advanced Microprocessors Bus Architecture)片上总线架构由于其本身的高性能以及ARM核的广泛应用,成为了一种流行的片上总线结构。除了片上芯核和片上总线,各种由用户设计的或者由供应商提供的IP也集成在SoC芯片上。图1是基于ARM7TDMI、面向消费电子领域的SoC芯片的模块结构图。
由图1可知,ARM7TDMI需要通过总线访问各个Slave;DMA工作时也需要通过总线访问外设进行数据交换;而LCD控制器模块为了实现实时显示更是需要不断地通过总线来访问显存读取数据;系统中其他的Master在工作时也要占用总线。
特别要引起注意的是LCD控制器模块。彩屏显示需要很大的数据量,以一块320×240、16bpp的TFT彩屏为例,其每一帧需要:320×240×16/8=153.6kByte。这么大的数据量不可能通过片上存储器提供,势必要通过存储器接口从外设取得。由于LCD控制器所需要的数据量很大并且需要实时显示,LCD控制器的工作将会占据大量的片上总线带宽,甚至影响整个系统的正常运行。而在目前的消费电子领域,支持彩屏应用几乎是不可缺少的。
解决此问题可以通过采用优化总线切换算法、增加片内Cache、改进总线架构等方法。其中,优化总线切换算法带来的性能改善比较有限,而Cache本身设计的复杂性以及其License高昂费用,使之在很多情况下也不合适。因而,采用双总线架构的AMBA不失为一个较好的选择。
双总线架构AMBA及其实现
在单层总线情况下,所有的Master和Slave都挂在AHB总线上。任何一个Master如果要访问Slave的话,都必须先申请总线,在获得总线所有权后,通过总线互联结构中的MUX进行地址、数据和控制信号的交换,而其他的Master此时必须等待。
双层AMBA总线结构
双层AMBA总线架构则通过使用更为复杂的内部互联结构,能够同时有两组Master和Slave通过AMBA进行数据的交互,极大地提高了总线的带宽。而且任一个Master也都可以访问任一层上的Slave。另外,在采用了双层AMBA总线以后,对于AHB Master和AHB Slave来说是透明的,不需要任何的修改。
图2是本文设计的双层AMBA总线的内部结构图。对于这个双层AMBA总线,设置其能支持16个Master和16个Slave,并且每层各带8个Master和8个Slave。
其中的双层AMBA总线本身由三部分组成:Layer1的总线译码器、预仲裁器和多个数据选择器(MUX);Layer2的总线译码器、预仲裁器和多个数据选择器;整个总线的核心仲裁器(Arbiter)。其中,前二者基本是一致的,而核心仲裁器是整个双层总线架构的核心。其原理是:每层的8个Master先在本层进行一次译码与仲裁,得到的结果送至核心仲裁器,再由核心仲裁器决定状态的切换以及各个MUX如何进行数据流和控制流的选择。
内部部件的设计
结合图2和AMBA协议,以下介绍这个双层AMBA总线的各个组成部件。由于第二层的各个部件的设计和功能和第一层相似,因而只介绍第一层。
* Layer1的译码器
该译码器采用集中式的地址译码机制,有利于提高外围设备的可移植性。译码器接收到当前占用总线的Master所发出的地址信号,生成对应于各个Slave的片选信号,送给核心仲裁器。片选信号的生成是通过与各个Slave的基址比较得到的。
值得注意的是,由于每个Master都可以访问Slave0~Slave15的任一个,所以译码器要能生成至少16个片选信号。
另外,每一层的译码器都应该要有一个缺省片选信号,对应于缺省Slave。这个缺省Slave的响应分两种情况:对于IDLE或BUSY传输,作出OKAY回应;对于NONSEQU ENTIAL或SEQUENTIAL传输,作出ERROR回应。
* Layer1的预仲裁器
仲裁器接收各个Master发出的总线请求信号(HBusReq)和所需的总线切换的判断信号,采用一定的总线仲裁算法,确定出可以占据总线的Master,并生成M to S MUX1的控制信号。与单层的AMBA不同,其生成的HMaster_layer1、BusHgrant_layer1信号送到核心仲裁器,而不是直接送给各个HMaster。另外,接收到的当前Slave响应是从核心仲裁器送出来的。
仲裁器可以采用的总线切换算法有两种:固定优先级算法和循环优先级算法。在AMBA规范中,可以根据实际需要灵活选择总线的切换算法。在这个部件里,采用了固定优先级的算法,即Master0优先级最低,而Master7优先级最高。
* Layer1的多路选择器
在Layer1中共有4个MUX,分别是M to S MUX1、M to S MUX2、S to M MUX1和S to M MUX2。其中,M to S MUX1接收Layer1仲裁器的信号作为片选信号,从8组总线信号中选择一组输出给核心仲裁器、Layer1的M to S MUX2和Layer2的M to S MUX2。对于M to S MUX2,其控制信号是从核心仲裁器得到的,它的作用是从两组总线信号中选择一组送给Layer1中相应的Slave。而S to M MUX1则是接收核心仲裁器输出的片选信号,从Layer1的8组总线响应信号(Hready、Hresp、Hrdata)选择一组送给核心仲裁器、Layer1的S to M MUX2和Layer2的S to M MUX2。由S to M MUX2输出一组总线响应信号给Layer1的所有的Master。
* 核心仲裁器
核心仲裁器的主要作用是:从两层的译码器输出的片选信号出发,得到初始状态;再由Slave的响应信号以及传输状态来决定何时进行状态的切换;同时,根据自己所处的状态,输出相应信号给相关的MUX作为控制信号,输出Hmaster、BusHgrant信号给每层的Master,以及输出相应的Slave响应信号给两层的预仲裁器。
由于存在不同层的Master同时访问同一层的Slave的情况,核心仲裁器也要考虑总线切换算法。又因为在核心仲裁器里至多是两个Master抢占总线,故可以采用简单的循环优先级算法。
核心仲裁器的主要部分是一个状态机,它由七个状态组成:
IDLE:系统复位后进入此状态,完成部分数据的初始赋值;
M1S1M2S2:Layer1的Master和Layer1的Slave通信,Layer2的Master和Layer2的Slave通信,即两层总线并行运行;
M1S2M2S1:Layer1的Master和Layer2的Slave通信,Layer2的Master和Layer1的Slave通信;
M1S1M2S1:Layer1的Master和Layer1的Slave通信,Layer2的Master在等待和Layer1的Slave的通信;
M1S2M2S2:Layer1的Master和Layer2的Slave通信,Layer2的Master在等待和Layer2的Slave的通信;
M2S1M1S1:Layer2的Master和Layer1的Slave通信,Layer1的Master在等待和Layer1的Slave的通信;
M2S2M1S2:Layer2的Master和Layer2的Slave通信,Layer1的Master在等待和Layer2的Slave的通信。
这七个状态之间的切换是由两层译码器给出的片选信号、当前占据总线的Master发出的控制信号以及与此Master通信的Slave的响应信号共同决定的。当涉及到ARM Master的状态切换,需考虑三级流水线特性,给予适当的等待周期。
另外,在核心仲裁器里还有一级输入锁存部分,用于锁存正在等待的Master发出的地址和控制信号。
设计结果以及测试平台的建立
对于以上实现,采用Verilog语言在RTL级进行描述,使用Synopsys的VCS工具进行功能仿真。为了验证以上设计的正确性,针对图1所示的架构,把单层AMBA改为双层的AMBA,并把LCDC Master和LCDC Slave移至第二层。同时在第二层增加了一个简单的MC Slave,并在其外面挂了SRAM、SDRAM的存储器模型,其中的SDRAM用于LCDC Master显存数据的存放,其他的结构保持不变(如图3)。同时,还准备了一套基于ARM汇编语言的测试程序进行系统的配置。在这个测试程序运行以后,共有三个Master:ARM Master、DMA Master和LCDC Master会不断访问总线。
结果表明设计是正确的:ARM Master可以对Layer2的Slave进行配置;在第二层的LCDC Master从同层的MC Slave读数据的同时,第一层的Master正在访问同层的Slave;Layer1的其他Master也能够申请到Layer2的总线以访问Layer2的外存。
另外,为了考察LCD控制器对总线的占用率,在AHB上挂了一个Hmaster Monitor的子模块,用于统计各个Master占据当前总线的时钟周期数。
两种总线方式的比较
从两个方面比较单层AMBA总线与双层AMBA总线的设计。
首先,从降低LCD控制器总线占用率方面看。由表1可以看出,在使用单层AMBA总线的情况下,LCD控制器占用的总线带宽都比较大:对于典型的320×240、16bpp的TFT彩屏,LCD控制器占用了16.3%的总线带宽。使用双层AMBA总线时,除了ARM Master 对两个Slave进行配置要占总线周期以外,LCD控制器将只会占用Layer2的带宽。
其次,从综合的结果看,双层AMBA占用的面积要大一些。在包括APB模块的情况下,单层AMBA综合得到的面积为17000门,而双层AMBA的面积为18500门。两者都支持16个Master和16个Slave。采用TSMC 0.25工艺标准单元库,使用Synopsys的Design Compiler工具进行门级网表的综合。
对于双层AMBA总线的实际的应用,可以把Layer1的MC Slave外接非易失性存储器,而Layer2的MC Slave外接易失性存储器。这样,可以把指令区置于Layer1,而数据区置于Layer2。于是,ARM Master的取指操作就可以在Layer1完成,而LCD控制器对显存数据的读取则在Layer2完成。而这两者恰恰是占总线带宽很大的操作,因而很大程度上减少了各个Master因为总线抢占而等待的时间,提高了总线带宽。
结语
ARM7TDMI在SoC芯片的设计中得到了极大的应用,但由于其自身不带Cache,使之需要频繁访问外存。如果此时片上集成了其他需要很大数据带宽的模块,就会使系统的性能大幅下降。而双层AMBA总线在占用面积略为增加的条件下,能极大地提高总线带宽,并且提供了更为灵活的系统架构。这对于基于ARM7TDMI的SoC芯片以及其他类似架构的SoC芯片来说,有着很重要的意义和实用价值。
进入单片机查看更多内容>>
由图1可知,ARM7TDMI需要通过总线访问各个Slave;DMA工作时也需要通过总线访问外设进行数据交换;而LCD控制器模块为了实现实时显示更是需要不断地通过总线来访问显存读取数据;系统中其他的Master在工作时也要占用总线。
特别要引起注意的是LCD控制器模块。彩屏显示需要很大的数据量,以一块320×240、16bpp的TFT彩屏为例,其每一帧需要:320×240×16/8=153.6kByte。这么大的数据量不可能通过片上存储器提供,势必要通过存储器接口从外设取得。由于LCD控制器所需要的数据量很大并且需要实时显示,LCD控制器的工作将会占据大量的片上总线带宽,甚至影响整个系统的正常运行。而在目前的消费电子领域,支持彩屏应用几乎是不可缺少的。
解决此问题可以通过采用优化总线切换算法、增加片内Cache、改进总线架构等方法。其中,优化总线切换算法带来的性能改善比较有限,而Cache本身设计的复杂性以及其License高昂费用,使之在很多情况下也不合适。因而,采用双总线架构的AMBA不失为一个较好的选择。
双总线架构AMBA及其实现
在单层总线情况下,所有的Master和Slave都挂在AHB总线上。任何一个Master如果要访问Slave的话,都必须先申请总线,在获得总线所有权后,通过总线互联结构中的MUX进行地址、数据和控制信号的交换,而其他的Master此时必须等待。
双层AMBA总线结构
双层AMBA总线架构则通过使用更为复杂的内部互联结构,能够同时有两组Master和Slave通过AMBA进行数据的交互,极大地提高了总线的带宽。而且任一个Master也都可以访问任一层上的Slave。另外,在采用了双层AMBA总线以后,对于AHB Master和AHB Slave来说是透明的,不需要任何的修改。
图2是本文设计的双层AMBA总线的内部结构图。对于这个双层AMBA总线,设置其能支持16个Master和16个Slave,并且每层各带8个Master和8个Slave。
其中的双层AMBA总线本身由三部分组成:Layer1的总线译码器、预仲裁器和多个数据选择器(MUX);Layer2的总线译码器、预仲裁器和多个数据选择器;整个总线的核心仲裁器(Arbiter)。其中,前二者基本是一致的,而核心仲裁器是整个双层总线架构的核心。其原理是:每层的8个Master先在本层进行一次译码与仲裁,得到的结果送至核心仲裁器,再由核心仲裁器决定状态的切换以及各个MUX如何进行数据流和控制流的选择。
内部部件的设计
结合图2和AMBA协议,以下介绍这个双层AMBA总线的各个组成部件。由于第二层的各个部件的设计和功能和第一层相似,因而只介绍第一层。
* Layer1的译码器
该译码器采用集中式的地址译码机制,有利于提高外围设备的可移植性。译码器接收到当前占用总线的Master所发出的地址信号,生成对应于各个Slave的片选信号,送给核心仲裁器。片选信号的生成是通过与各个Slave的基址比较得到的。
值得注意的是,由于每个Master都可以访问Slave0~Slave15的任一个,所以译码器要能生成至少16个片选信号。
另外,每一层的译码器都应该要有一个缺省片选信号,对应于缺省Slave。这个缺省Slave的响应分两种情况:对于IDLE或BUSY传输,作出OKAY回应;对于NONSEQU ENTIAL或SEQUENTIAL传输,作出ERROR回应。
* Layer1的预仲裁器
仲裁器接收各个Master发出的总线请求信号(HBusReq)和所需的总线切换的判断信号,采用一定的总线仲裁算法,确定出可以占据总线的Master,并生成M to S MUX1的控制信号。与单层的AMBA不同,其生成的HMaster_layer1、BusHgrant_layer1信号送到核心仲裁器,而不是直接送给各个HMaster。另外,接收到的当前Slave响应是从核心仲裁器送出来的。
仲裁器可以采用的总线切换算法有两种:固定优先级算法和循环优先级算法。在AMBA规范中,可以根据实际需要灵活选择总线的切换算法。在这个部件里,采用了固定优先级的算法,即Master0优先级最低,而Master7优先级最高。
* Layer1的多路选择器
在Layer1中共有4个MUX,分别是M to S MUX1、M to S MUX2、S to M MUX1和S to M MUX2。其中,M to S MUX1接收Layer1仲裁器的信号作为片选信号,从8组总线信号中选择一组输出给核心仲裁器、Layer1的M to S MUX2和Layer2的M to S MUX2。对于M to S MUX2,其控制信号是从核心仲裁器得到的,它的作用是从两组总线信号中选择一组送给Layer1中相应的Slave。而S to M MUX1则是接收核心仲裁器输出的片选信号,从Layer1的8组总线响应信号(Hready、Hresp、Hrdata)选择一组送给核心仲裁器、Layer1的S to M MUX2和Layer2的S to M MUX2。由S to M MUX2输出一组总线响应信号给Layer1的所有的Master。
* 核心仲裁器
核心仲裁器的主要作用是:从两层的译码器输出的片选信号出发,得到初始状态;再由Slave的响应信号以及传输状态来决定何时进行状态的切换;同时,根据自己所处的状态,输出相应信号给相关的MUX作为控制信号,输出Hmaster、BusHgrant信号给每层的Master,以及输出相应的Slave响应信号给两层的预仲裁器。
由于存在不同层的Master同时访问同一层的Slave的情况,核心仲裁器也要考虑总线切换算法。又因为在核心仲裁器里至多是两个Master抢占总线,故可以采用简单的循环优先级算法。
核心仲裁器的主要部分是一个状态机,它由七个状态组成:
IDLE:系统复位后进入此状态,完成部分数据的初始赋值;
M1S1M2S2:Layer1的Master和Layer1的Slave通信,Layer2的Master和Layer2的Slave通信,即两层总线并行运行;
M1S2M2S1:Layer1的Master和Layer2的Slave通信,Layer2的Master和Layer1的Slave通信;
M1S1M2S1:Layer1的Master和Layer1的Slave通信,Layer2的Master在等待和Layer1的Slave的通信;
M1S2M2S2:Layer1的Master和Layer2的Slave通信,Layer2的Master在等待和Layer2的Slave的通信;
M2S1M1S1:Layer2的Master和Layer1的Slave通信,Layer1的Master在等待和Layer1的Slave的通信;
M2S2M1S2:Layer2的Master和Layer2的Slave通信,Layer1的Master在等待和Layer2的Slave的通信。
这七个状态之间的切换是由两层译码器给出的片选信号、当前占据总线的Master发出的控制信号以及与此Master通信的Slave的响应信号共同决定的。当涉及到ARM Master的状态切换,需考虑三级流水线特性,给予适当的等待周期。
另外,在核心仲裁器里还有一级输入锁存部分,用于锁存正在等待的Master发出的地址和控制信号。
设计结果以及测试平台的建立
对于以上实现,采用Verilog语言在RTL级进行描述,使用Synopsys的VCS工具进行功能仿真。为了验证以上设计的正确性,针对图1所示的架构,把单层AMBA改为双层的AMBA,并把LCDC Master和LCDC Slave移至第二层。同时在第二层增加了一个简单的MC Slave,并在其外面挂了SRAM、SDRAM的存储器模型,其中的SDRAM用于LCDC Master显存数据的存放,其他的结构保持不变(如图3)。同时,还准备了一套基于ARM汇编语言的测试程序进行系统的配置。在这个测试程序运行以后,共有三个Master:ARM Master、DMA Master和LCDC Master会不断访问总线。
结果表明设计是正确的:ARM Master可以对Layer2的Slave进行配置;在第二层的LCDC Master从同层的MC Slave读数据的同时,第一层的Master正在访问同层的Slave;Layer1的其他Master也能够申请到Layer2的总线以访问Layer2的外存。
另外,为了考察LCD控制器对总线的占用率,在AHB上挂了一个Hmaster Monitor的子模块,用于统计各个Master占据当前总线的时钟周期数。
两种总线方式的比较
从两个方面比较单层AMBA总线与双层AMBA总线的设计。
首先,从降低LCD控制器总线占用率方面看。由表1可以看出,在使用单层AMBA总线的情况下,LCD控制器占用的总线带宽都比较大:对于典型的320×240、16bpp的TFT彩屏,LCD控制器占用了16.3%的总线带宽。使用双层AMBA总线时,除了ARM Master 对两个Slave进行配置要占总线周期以外,LCD控制器将只会占用Layer2的带宽。
其次,从综合的结果看,双层AMBA占用的面积要大一些。在包括APB模块的情况下,单层AMBA综合得到的面积为17000门,而双层AMBA的面积为18500门。两者都支持16个Master和16个Slave。采用TSMC 0.25工艺标准单元库,使用Synopsys的Design Compiler工具进行门级网表的综合。
对于双层AMBA总线的实际的应用,可以把Layer1的MC Slave外接非易失性存储器,而Layer2的MC Slave外接易失性存储器。这样,可以把指令区置于Layer1,而数据区置于Layer2。于是,ARM Master的取指操作就可以在Layer1完成,而LCD控制器对显存数据的读取则在Layer2完成。而这两者恰恰是占总线带宽很大的操作,因而很大程度上减少了各个Master因为总线抢占而等待的时间,提高了总线带宽。
结语
ARM7TDMI在SoC芯片的设计中得到了极大的应用,但由于其自身不带Cache,使之需要频繁访问外存。如果此时片上集成了其他需要很大数据带宽的模块,就会使系统的性能大幅下降。而双层AMBA总线在占用面积略为增加的条件下,能极大地提高总线带宽,并且提供了更为灵活的系统架构。这对于基于ARM7TDMI的SoC芯片以及其他类似架构的SoC芯片来说,有着很重要的意义和实用价值。
相关文章