SoC是系统级的芯片。
CPU的基本基本结构
cpu主要分为 控制单元、算术逻辑单元ALU、存储单元。ALU做算术运算(加减乘)和逻辑运算(移位)。
控制单元首先从存储器取出各种指令,放在指令寄存器IR里,之后做指令译码来分析要做什么操作。
ALU做算术运算(加减乘等)和逻辑运算(移位等),ALU是接收控制单元的command来运算的。
冯诺伊曼将程序指令和数据一起存储,常见的是计算机 CPU、GPU;
哈佛结构将程序指令和数据分开存储,常见的 ARM、DSP 等微处理器。
哈佛结构具有较高的执行效率,程序指令和数据指令分开,可以预先读取下一条指令,可以同时取指令并取操作数,取指令和执行能够完全重叠运行。
cache
在传统的CPU计算机架构里面,cache架构目前分为两大架构诺依曼架构跟哈维架构。在诺依曼架构里面,一个cache同时用于指令与数据,是统一的一个Cache。在哈维架构里面,指令与数据总线是分开的,所以同时出现两个Cache。
Cache是存在于主存与CPU之间的一级存储器, 由静态存储芯片(SRAM)组成,容量比较小但速度比主存高得多, 接近于CPU的速度。 Cache的功能是用来存放那些近期需要运行的指令与数据。目的是提高CPU对存储器的访问速度。
当CPU试图从主存中load/store数据的时候, CPU会首先从cache中查找对应地址的数据是否缓存在cache 中。如果其数据缓存在cache中,直接从cache中拿到数据并返回给CPU。
AMBA总线协议
AMBA总线的全称为高级微处理器总线架构,是ARM架构下SoC设计的一种总线架构。 AMBA包括AHB(Advanced High-perfomance Bus,高级高性能总线),ASB(Advanced System Bus,高级系统总线),APB(Advanced Peripheral Bus,高级外设总线)。
AHB的强大之处在于可以将高速ARM微控制器(High-performance ARM processor)、高带宽的片上RAM(High-bandwidth on-chip RAM)、高带宽的外部存储器接口(High-bandwidth Memory Interface)、DMA总线master等各种拥有AHB接口的控制器连接起来构成一个完整的SoC系统。
AHB总线里有:一个仲裁器(Arbiter)用于仲裁多个主设备(Master)同时访问总线的情况;三个多路选择器(地址选择,写数据选择,读数据选择)用于选通master和slave之间的data和addr。
AHB的ADDR没有分读和写的ADDR:AHB是半双工的,读和写不能同时进行,因此性能上比AXI一般来讲是要弱的。
APB,Advanced Peripheral Bus,高级外设总线,主要应用在低带宽的外设上,如UART,I2C,中断控制、定时器、GPIO等。对性能要求不高,主要是低功耗。
APB的架构不像AHB那样是多主设备的架构,APB只有唯一的主设备APB桥(与AXI或AHB相连),因此不需要仲裁一些BUSREQ,GRANT,接口信号很简单。下图是一个典型的慢速APB Slave需要的接口。
AHB:
高性能(High performance)
并发操作(Pipelined operation)
支持多个总线主设备(Multiple bus masters)
支持突发传输(Burst transfers)
支持分段传输(Split transactions)
单个时钟边沿操作
APB:
低功耗(Low power),尤其在非外设总线活动时APB的接口零功耗
锁存的地址和控制(Latched address and control)
接口简单(Simple interface),控制逻辑简单,只有4个控制信号
适用许多外设(Suitable for many peripherals)
两个时钟周期传输
无需等待周期和回应信号
AXI:
AXI(Advanced eXtensible Interface)总线是AMBA总线架构中,最新并且性能最好的一个总线标准。
AXI的设计目标是可以在高时钟频率下运行,并在延滞时间长的状况下仍可达成高数据吞吐率。
AXI总线将读/写请求与读/写结果相互分离、将数据写入和数据读出的信号相分离,可以同时进行写入和读出动作,从而最大限度地提高总线的数据吞吐率。
相反AHB是半双工的,读和写不能同时进行,因此性能上比AXI一般来讲是要弱的。
握手协议:
AXI总线的master和slave的端口分为5个双向流量控制的通道,所谓双向流量控制是指发送端用valid表示数据是有效的,接收端用ready表示可以接受数据;
只有在vaild和ready同时为1时,数据才成功被传送。vaild/ready机制可以使发送接收双方都有能力控制传输速率。
突发传输
是指在同一行中对相邻的存储单元连续进行数据传输的方式,连续传输的周期就是突发长度(Burst Length,一般为4或8)。
在进行突发传输时,只需指定起始列地址与突发长度,内存就会依次地自动对后面相应数量的存储单元进行读/写操作,而不再需要控制器提供列地址。这样,除了第一笔数据的传输需要若干个周期,其后每个数据只需一个周期即可获得。