1.2 片上系统DemoSoC
1.2.1 嵌入式控制器简介
本书将片上系统中最常见的模块组织起来构成一个完整的SoC,该SoC被命名为DemoSoC,是一个嵌入式控制器。后文将以DemoSoC为例讲述片上系统的设计思想和设计方法学。
嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统及用户的应用程序4部分组成,用于实现对其他设备的控制、监视或管理等功能。
不管是在手机、电视、工业控制设备、网络设备还是在家用微波炉中,都可以看到嵌入式控制技术的影子,嵌入式控制技术已经成功地应用在各种领域中,并且越来越广泛地进入到人们的生活中。
嵌入式控制器是各种嵌入式系统的“心脏”,从8位单片机到32位多核,嵌入式控制器正变得越来越丰富强大。嵌入式控制器也称作嵌入式微控制器,英文简称Embedded Controller,全称为Embedded Microcontroller Unit,因此,嵌入式控制器实际上就是常说的单片机。
嵌入式控制器是一个完整的片上系统,根据特定应用所对应的功能需求的不同而有所不同。本书将以32位嵌入式控制器为例,讲述片上系统的设计思想和设计方法学。
1.2.2 片上系统DemoSoC的架构
片上系统DemoSoC的整体架构如图1-1所示。
图1-1 DemoSoC整体架构
在DemoSoC中,各个模块通过一个高速的系统总线和一个低速的外设总线相连接,这是SoC的核心特征之一;在DemoSoC中还包括一个32位处理器,控制所有外设协调工作,这是SoC的核心特征之二。DemoSoC各个子模块描述如下:
1.32位开源处理器核OR1200,处理器核是整个SoC的核心控制单元
除CPU核外,该处理器内部还集成了定时器(用于操作系统“心跳”中断)、中断控制器、节电控制模块(电源管理模块)。该处理器是哈佛架构,指令和数据分开,分别通过指令总线接口单元(Bus Interface Unit)和数据总线接口单元连接到片上总线,这两个总线接口单元都是总线组设备。
2.NandFlash控制器
连接到NandFlash,实现到NandFlash的访问。大容量闪存(掉电后数据可保存,加电后可读取和修改)集成电路包括NorFlash和NandFlash两大类。NorFlash的写过程复杂,但是读取过程简单,可以当做静态RAM来读取,因此可以用做启动ROM,其缺点是存储容量受限。而NandFlash的存储容量非常大,是U盘的核心器件,其写入和读取过程复杂度相当,因此一般不能直接用做启动ROM,必须辅助以其他手段才能用于启动ROM。后文将详细讲述。
3.外部存储器控制EMC模块,其内部包括SDRAM控制器和OnChipROM控制器
OnChipROM用于存储处理器启动后执行的最初代码,完成整个系统最基本的初始化工作。RAM是动态大容量随机存取存储器,其特点是掉电后数据消失。SRAM与SDRAM的区别是SDRAM的单个存储单元比SRAM面积小,因此SDRAM的容量大,读写速度较快,这是高性能计算机系统所需要的。SDRAM的缺点也是控制相对复杂。SDRAM与NandFlash相互配合,构成了现代高性能嵌入式系统的存储系统。嵌入式系统与PC相比较,SDRAM是内存,而NandFlash则等价于硬盘。
4.IIS音频控制器
IIS是Inter-IC Sound的简写,该接口是数字音频到音频编解码器之间的接口,用于在它们之间传送立体声音频。类似于IIS,AC97同样是另外一种音频接口标准。AC97在个人计算机系统中应用较多,而IIS更多的见诸于嵌入式系统。高等级的音频有时采用SPDIF接口。
5.12Mbps USB Device+Host控制器
12Mbps USB接口最初在USB 1.1中定义为全速,而USB 2.0在USB 1.1的基础上定义了480Mbps的高速。在一些文献中也称12Mbps是USB 2.0,这有偷换概念之嫌疑。本书中不再区分USB 1.1与USB 2.0,而直接称为12Mbps USB Device+Host控制器。顾名思义,该模块包括USB从设备和主设备两个部分。在嵌入式系统中,USB从设备一般用于取代串口实现更高速度的嵌入式设备与PC之间的连接,用于设备调试;而USB主设备接口则用于连接一些性能不高的USB外设,包括U盘和其他设备。在DemoSoC中,480Mbps的高速USB设备(包括主设备和从设备)可连接到PCI Host接口。
6.总线桥和DMA
在嵌入式系统中,总线桥和DMA虽然不直接连接外部,但也是必不可少的。总线桥的作用是将高速总线和低速总线区分开。在一般的高性能嵌入式系统中,高速总线的速度一般是低速总线的2倍、4倍、8倍可调节,而CPU的时钟频率是高速总线的1倍、2倍、4倍可调节。这样设计的目的是节省电源。总线桥的第一个核心设计目的是节电,第二个目的是减少高速总线的容性负载,第三个目的是实现高速总线和低速总线的速率解耦,目的三是目的一的代价。总线在一个片上系统中是逻辑最简单、调试最困难的部件之一。DMA用于在设备之间搬运数据,从而将处理器解放出来处理更重要的任务。一般DMA放置于总线桥中,这是因为总线桥是最方便访问两个总线的位置,只有放在总线桥中,DMA才能最高效,这将在后文中详细讲述。
7.LCD控制器
根据是否自带显存,LCD可以分为RGB接口LCD和智能LCD。RGB接口LCD不带显存,必须依赖总线主设备上的存储器作为显存,因此,RGB接口LCD控制器模块是一个总线主设备,当显存刷新失败时将产生中断等待处理器进行处理。智能LCD自带显存,处理器只根据显示的需要对显存的特定像素寄存器和其他控制器进行简单的操作即可。考虑到显存的价格因素,智能LCD更多在低端嵌入式设备中采用,屏幕尺寸一般较小。
8.手机键盘控制器
手机键盘是4×6的小型扫描键盘。手机键盘控制器的设计要点在于键盘的防抖。
9.IIC接口模块
在DemoSoC中,IIC接口用于连接实时时钟控制器。实时时钟是许多便携式嵌入式系统必备的模块。实时时钟控制器通过IIC接口与嵌入式控制器相连接。IIC是Inter-IC Communication的缩写,其特点是管脚数只有两个。IIC已经成为许多嵌入式控制器的必备模块。
10.定时器和PWM
定时器为系统提供定时功能,如协议的超时,串口速率的自动检测等。PWM是脉冲宽度调制的缩写,典型的应用之一为控制LCD背光的亮度。PWM脉冲一般基于定时器产生。
11.JTAG模块
JTAG接口模块的用途为在线调试、跟踪、寄存器访问。一方面JTAG模块可以取代处理器访问总线上的设备;另一方面,它可以与处理器的开发接口相连接,实现端点、单步、跟踪等调试功能,这些是处理器调试所必需的。
12.SPI接口模块
SPI接口的作用为对LCD内部控制器芯片、基带芯片等进行初始化。
13.UART模块
实现RS232串口,多用于开发过程的调试,有时也用于数据输入,如全球定位系统(GPS)模块的输出就是通过串口。
14.PS/2接口模块
连接键盘和鼠标。
15.PCI Host模块
PCI Host模块实现PCI总线到片内总线的桥接功能,实现PCI主设备逻辑,通过PCI Host模块,DemoSoC可以连接到其他具有PCI接口的设备,如RTL8139C 10/100Mbps自适应以太网、ISP1561480Mbps USB从设备等。
16.GPIO模块
GPIO模块是通用输入输出接口,可以连接键盘等慢速设备。
17.复位和时钟模块
理想的复位逻辑是异步产生,同步取消,因而必须对输入的复位信号进行处理,包括去抖动等。时钟模块将主时钟进行合成后产生不同频率的时钟信号供不同的外设使用。
1.2.3 片上系统DemoSoC的存储器映射
在一个片上系统中,所有的主和从设备都连接到总线上。所有从设备被映射到相互不重叠的地址空间供主设备访问,从设备地址空间的设计称作片上系统的存储器映射。
除了处理器,其他的主设备首先也是一个从设备,因为它们都有配置寄存器供处理器控制其工作方式和状态。
几乎每一个外设都包括配置寄存器,即使是存储器接口,当支持多种不同类型的存储器时也要进行配置。以SDRAM存储器控制器为例,也需要配置寄存器控制器SDRAM的工作方式和状态。假设一个SDRAM的地址空间为16MB,即使SDRAM控制器的配置寄存器只有一个,为了地址译码的简化或将全部SDRAM的空间利用起来,也需要另外一个16MB的空间供这一个寄存器使用。当类似的设备较多时,地址空间的浪费就会显著增加。另外一种设备是主设备,如RGB接口的LCD控制器,主设备的控制寄存器并不多,但是需要一个单独的从设备接口访问这些寄存器,从而增加了逻辑设计难度和总线负载。
一种设计选择是将所有的从设备的寄存器集中起来构成一个单独的从设备,而从设备本身只完成必须的工作,不包括控制寄存器。比如将SDRAM控制器的寄存器、LCD控制器的寄存器放在一起构成一个专用寄存器模块,而SDRAM控制器空间只包含存储器访问,LCD控制器只留下主设备接口。这样设计的好处是节省了地址空间,减少了从设备的个数;缺点是专用寄存器模块需要与多个模块相连接,模块的独立性被破坏,后端设计更加复杂。
另外一种选择是类似DemoSoC的设计,每一个模块的相关控制寄存器和模块本身放在一起,虽然从设备的个数较多,地址空间显得浪费,但是模块的独立性和可移植性好。
下面讲述DemoSoC的地址空间映射。
处理器在系统加电复位后,总是执行地址0或地址0附近的代码,因此地址0或地址0附近的代码必须是在系统复位后就已经存在,通常地址0起始的空间存放的是片内或片外的OnChipROM。OnChipROM的职责有两个,一个是完成将程序代码从不可启动Flash存储器,如NandFlash读出并送到主存储器如SDRAM中,然后让处理器从SDRAM重新启动;另一个是能够通过网口、USB口将代码从主计算机下载到Flash存储器中。当然设计者也可以通过JTAG将代码从主计算机下载到Flash存储器中,但是下载速度较慢,对于一些用户来讲可能难以接受。
在DemoSoC中,在系统复位后,OnChipROM位于第一个4×8KB,SDRAM位于0x20000000~3FFFFFFF,处理器的复位向量的初始地址为0x00000100,即OpenRISC 1200在启动后执行的第一行代码来源于0x00000100。此时运行的代码的任务为将程序代码从NandFlash移到SDRAM中,OnChipROM的最后一行代码为向0x3FFFFFF0写入1,该寄存器操作会触发处理器复位逻辑重新启动处理器和地址译码逻辑,此后,地址译码器将OnChipROM从系统中删除,将SDRAM映射到0x00000000~1FFFFFFF,注意SDRAM实际上只有16MB。
因此,OnChipROM和SDRAM的地址在系统启动时是变化,系统自动重新进行了映射。考虑到地址重新映射的方便,这里将SDRAM控制器和OnChipROM用一个EMC模块包封起来。当在FPGA运行DemoSoC时,考虑到SDRAM的速度问题,若不进行地址重新映射,可以将OnChipROM用FPGA中可以使用下载文件初始化的RAM代替,此时代码空间只有32KB。
除了OnChipROM和SDRAM,所有其他外设的地址是固定的。外设地址空间的定义取决于设计者的偏好,一般是将地址高位的若干比特用于区分不同的设备。
1.2.4 总线优先级
总线优先级分为以下几种。
● LCDC最高优先级
● DMA次高优先级
● Ethernet第三优先级
● 处理器最低优先级
一般地,初学者可能认为处理器的优先级应该是最高的,但是实际上恰恰相反。在调试模式下,JTAG单独拥有总线,其他主设备不能访问总线。LCDC的优先级高是因为屏幕是用户与系统的重要接口,LCD工作是否正常直接影响到用户体验。高LCDC优先级保证LCD屏幕能够得到及时刷新。这里的LCD是需要将SDRAM作为显存RGB接口LCD,而智能LCD自带显存,是一个从设备。
DMA第三优先级高是因为DMA常常对应一些实时业务,如音乐播放。
Ethernet的业务类型是尽力而为,丢包只需重传,因此被设为第三优先级。
处理器的优先级最低,是因为处理器是主控设备,软件完全可以通过对外设的控制实现对总线的“高优先级”占有。
1.2.5 片上系统的代码更新与调试
在一般嵌入式系统中,常见两种启动方式,一是正常启动,二是调试启动。
1.正常启动过程。
如前所述,处理器在系统加电复位后,总是执行地址0或地址0附近的代码,因此地址0或地址0附近的代码必须是在系统复位后就已经存在,通常地址0起始的空间存放的是片内OnChipROM或片外的BootROM(此处不妨称为ROM)。在DemoSoC中,在系统复位后,OnChipROM位于第一个32KB,SDRAM位于0x20000000~3FFFFFFF,处理器的复位向量的初始地址为0x00000100。此时所运行的代码的任务为将程序代码从NandFlash移到SDRAM中,NandFlash的数据按照块方式存储,作为一个大容量非易失性存储器,NandFlash并不能保证随着时间的推移每一个存储块的内容都是永远正确的,但是能保证NandFlash的第一个块总是正确的。通常,NandFlash每一个块由64个页组成,每个页通常2KB。在DemoSoC的设计中,页0不用,页1~63存储管理信息。由软件的设计者给出程序代码的长度(PRM_LENGTH_ADD地址所存储的内容)和第一个块所在NandFlash中的位置(BLOCK_INFO_ADDR所存储的内容)信息。BLOCK_INFO_ADDR+4i中存储的是程序的第i个block的起始地址。OnChipROM的最后一行代码为向0xFFFFFFF0写入1,该寄存器操作会触发处理器复位逻辑重新启动处理器和地址译码逻辑,此后,地址译码器将ROM从系统中删除,将SDRAM映射到0x00000000~1FFFFFFF。
当用户在系统正常启动后,可通过以太网口或USB口更新NandFlash,然后手动让系统重新复位,从而完成代码更新。
2.调试启动过程
系统加电后,正常启动,OnChipROM被屏蔽,SDRAM被映射到地址0起始的空间。用户通过JTAG接口即可控制整个处理器的状态。调试启动的过程如下:
(1)通过JTAG更新SDRAM的内容;
(2)通过JTAG写REG32(0x3FFFFFF0)=1,该操作导致处理器被复位。
此后系统自动启动,直接执行SDRAM的内容。