ARMCortex-M0全可编程SoC原理及实现:面向处理器、协议、外设、编程和操作系统百度网盘pdf下载
免费下载
书籍下载
内容介绍
编辑推荐
内容简介
《ARM Cortex-M0 全可编程SoC原理及实现:面向处理器、协议、外设、编程和操作系统》以ARM公司免费开放的CortexM0 DesignStart处理器 IP核为基础,以CortexM0处理器架构、AMBA规范、外设、汇编语言、C语言、CMSIS、驱动程序开发以及RTX操作系统为主线,详细介绍了通过Xilinx Vivado以及Keil μVision5集成开发环境构建CortexM0全可编程嵌入式系统的硬件和软件设计方法。
全书共分18章,主要内容包括: 全可编程SoC设计导论、CortexM0 CPU结构、CortexM0指令集、CortexM0低功耗特性、AHBLite总线结构分析、CortexM0汇编语言编程基础、CortexM0 DesignStart架构、Xilinx Artix7 FPGA结构、CortexM0嵌入式系统设计与实现、7段数码管控制器设计与实现、中断系统设计与实现、定时器设计与实现、UART串口控制器设计与实现、VGA控制器设计与实现、DDR3存储器系统设计与实现、CortexM0 C语言编程基础、CMSIS和驱动程序开发、RTX操作系统原理及应用。
本书可作为讲授ARM CortexM0嵌入式系统课程以及CortexM0可编程SoC系统设计课程的教学参考用书,也可作为学习Xilinx Vivado集成开发环境和Verilog HDL语言的参考用书。
作者简介
何宾,著名的嵌入式技术和EDA技术专家,长期从事电子设计自动化方面的教学和科研工作,与全球多家知名的半导体厂商和EDA工具厂商大学计划保持紧密合作。目前已经出版嵌入式和EDA方面的著作30余部,内容涵盖电路仿真、电路设计、可编程逻辑器件、数字信号处理、单片机、嵌入式系统、片上可编程系统等。典型的代表作有《Xilinx FPGA设计*威指南》《Xilinx FPGA数字设计——从门级到行为级的双重描述》《Xilinx FPGA数字信号处理*威指南——从HDL、模型到C的描述》《Xilinx All Programmable Zynq-7000 嵌入式系统设计与实现》《模拟与数字系统协同设计*威指南——Cypress集成开发环境》《STC单片机原理及应用》《STC单片机C语言程序设计》《Altium Designer 13.0电路设计、仿真与验证*威指南》《Altium Designer 15.0电路仿真、设计、验证与工艺实现*威指南》。
目录
第1章全可编程SoC设计导论
1.1SoC基础知识
1.1.1SoC的概念
1.1.2SoC与MCU及CPU的比较
1.1.3典型的商用SoC器件
1.2SoC设计流程
1.3SoC体系架构
1.4全可编程SoC技术
1.4.1基于软核的全可编程SoC
1.4.2基于硬核的全可编程SoC
1.5全可编程SoC设计流程
第2章CortexM0 CPU结构
2.1ARM处理器类型
2.2CortexM系列处理器概述
2.2.1CortexM系列处理器的特点
2.2.2CortexM系列处理器的性能参数
2.3CortexM0处理器性能和结构
2.3.1CortexM0处理器的性能
2.3.2CortexM0处理器的结构
2.4CortexM0处理器寄存器组
2.4.1通用寄存器
2.4.2堆栈指针
2.4.3程序计数器
2.4.4链接寄存器
2.4.5组合程序状态寄存器
2.4.6中断屏蔽特殊寄存器
2.4.7特殊寄存器
2.5CortexM0存储器空间映射
2.6CortexM0程序镜像原理及生成方法
2.7CortexM0的端及分配
2.8CortexM0处理器异常及处理
2.8.1异常原理
2.8.2异常优先级
2.8.3向量表
2.8.4异常类型
第3章CortexM0指令集
3.1Thumb指令集
3.2CortexM0汇编语言格式
3.3寄存器访问指令: MOVE
3.4存储器访问指令: LOAD
3.5存储器访问指令: STORE
3.6多数据访问指令: LDM和STM
3.7堆栈访问指令: PUSH和POP
3.8算术运算指令
3.8.1加法指令
3.8.2减法指令
3.8.3乘法指令
3.8.4比较指令
3.9逻辑操作指令
3.10移位操作指令
3.10.1右移指令
3.10.2左移指令
3.11反序操作指令
3.12扩展操作指令
3.13程序流控制指令
3.14存储器屏蔽指令
3.15异常相关指令
3.16休眠相关指令
3.17其他指令
3.18数据插入和对齐操作
第4章CortexM0低功耗特性
4.1低功耗要求
4.2CortexM0低功耗特性及优势
4.2.1CortexM0低功耗特性
4.2.2CortexM0低功耗结构
4.3CortexM0休眠模式
4.4唤醒中断控制器
4.5降低功耗的其他方法
第5章AHBLite总线结构分析
5.1总线及分类
5.1.1总线的概念
5.1.2总线分类
5.2ARM AMBA系统总线
5.3AMBA3 AHBLite总线
5.3.1AHBLite概述
5.3.2AHBLite总线操作
5.4AHBLite总线结构
5.4.1全局信号
5.4.2AHBLite主设备接口
5.4.3AHBLite从设备接口
5.4.4地址译码器和多路复用器
5.5AHBLite总线时序
5.5.1无等待基本读传输
5.5.2有等待基本读传输
5.5.3无等待基本写传输
5.5.4有等待基本写传输
5.6硬件实现
第6章CortexM0汇编语言编程基础
6.1Keil MDK开发套件
6.1.1下载MDK开发套件
6.1.2安装MDK开发套件
6.1.3MDK程序处理流程
6.2CortexM0汇编语言程序设计
6.2.1建立新设计工程
6.2.2工程参数设置
6.2.3添加汇编文件
6.2.4汇编语言语法
6.3.lst文件分析
6.4.map文件分析
6.5.hex文件分析
6.6软件仿真和调试
6.6.1查看CortexM0寄存器内容
6.6.2查看CortexM0存储器内容
6.6.3查看监视窗口的内容
6.7汇编语言其他常用语法介绍
6.7.1标识符的命名规则
6.7.2变量
6.7.3常数
6.7.4EQU命令
6.7.5IMPORT/EXTERN命令
6.7.6子程序调用
6.7.7宏定义和使用
第7章CortexM0 DesignStart架构
7.1获取CortexM0 DesignStart
7.2CortexM0 DesignStart顶层符号
7.2.1中断
7.2.2状态输出
7.2.3事件信号
7.3AHBLite接口
7.4将CortexM0 DesignStart集成到系统的方法
第8章XILINX Artix7 FPGA结构
8.1Artix7器件逻辑资源
8.2可配置逻辑块
8.2.1可配置逻辑块概述
8.2.2查找表
8.2.3多路复用器
8.2.4进位逻辑
8.2.5存储元素
8.2.6分布式RAM(只有SLICEM)
8.2.7只读存储器(ROM)
8.2.8移位寄存器(只有SLICEM)
8.3时钟资源和时钟管理单元
8.3.17系列FPGA时钟资源
8.3.27系列内部时钟结构
8.3.37系列FPGA时钟管理模块
8.4块存储器资源
8.5专用的DSP模块
8.6输入/输出块
8.6.1I/O特性概述
8.6.2Artix7中的I/O列和类型
8.6.3I/O电气资源
8.6.4I/O逻辑资源
8.7XADC模块
8.8吉比特收发器
8.9PCIE模块
8.10配置模块
8.11互连资源
第9章CortexM0嵌入式系统设计与实现
9.1设计目标
9.2CortexM0 SoC系统的构建
9.2.1启动Vivado 2016集成开发环境
9.2.2创建新的设计工程
9.2.3添加CortexM0处理器源文件
9.2.4添加系统主时钟IP核
9.3设计文件修改和分析
9.3.1AHB总线地址译码器
9.3.2AHB总线从设备多路复用器
9.3.3AHB片上存储器外设
9.3.4AHB LED外设
9.3.5AHBLITE_SYS顶层文件
9.4程序代码的编写
9.4.1建立新设计工程
9.4.2工程参数设置
9.4.3添加和编译汇编文件
9.4.4分析HEX文件与汇编文件的关系
9.4.5添加HEX文件到当前工程
9.5RTL详细描述和分析
9.6仿真原理和行为级仿真
9.6.1仿真实现的不同功能
9.6.2Vivado所支持的仿真工具
9.6.3行为级仿真实现
9.6.4添加信号并仿真
9.6.5仿真结果分析
9.7设计综合和分析
9.7.1综合过程的关键问题
9.7.2设计综合选项
9.7.3Vivado支持的属性
9.7.4执行设计综合
9.7.5查看综合报告
9.8创建实现约束
9.8.1实现约束的原理
9.8.2I/O规划器功能
9.8.3引脚位置约束的实现
9.9设计实现和分析
9.9.1实现过程原理
9.9.2设计实现选项
9.9.3设计实现
9.9.4查看布局布线后的结果
9.9.5查看实现后的报告
9.9.6功耗分析
9.9.7静态时序分析
9.10实现后时序仿真
9.11生成编程文件
9.12下载比特流文件到FPGA
9.13生成并下载外部存储器文件
第10章7段数码管控制器设计与实现
10.1设计目标
10.2打开前面的设计工程
10.3添加并分析7段数码管控制器源文件
10.3.1添加7段数码管控制器源文件
10.3.2分析7段数码管控制器源文件
10.4修改并分析顶层设计文件
10.5编写程序代码
10.5.1建立新设计工程
10.5.2工程参数设置
10.5.3添加和编译汇编文件
10.5.4添加HEX文件到当前工程
10.6设计综合
10.7添加约束条件
10.8设计实现
10.9下载比特流文件
10.10系统在线调试原理
10.11系统在线调试实现
10.11.1建立新的调试工程
10.11.2添加调试网络
10.11.3在线测试分析
第11章中断系统设计与实现
11.1设计目标
11.2中断控制器原理
11.2.1NVIC特点
11.2.2NVIC映射
11.2.3NVIC寄存器
11.3进入和退出异常句柄的过程
11.3.1进入中断句柄的过程
11.3.2退出中断句柄的过程
11.4打开前面的设计工程
11.5添加并分析按键消抖模块源文件
11.5.1添加按键消抖模块源文件
11.5.2分析按键消抖模块源文件
11.6修改并分析顶层设计文件
11.7编写程序代码
11.7.1建立新设计工程
11.7.2工程参数设置
11.7.3软件初始化中断
11.7.4添加和编译汇编文件
11.7.5添加HEX文件到当前工程
11.8设计综合
11.9添加约束条件
11.10设计实现
11.11下载比特流文件
第12章定时器设计与实现
12.1设计目标
12.2打开前面的设计工程
12.3添加并分析定时器模块源文件
12.3.1定时器模块设计原理
12.3.2添加定时器源文件
12.3.3分析定时器源文件
12.4修改并分析顶层设计文件
12.5编写程序代码
12.5.1建立新设计工程
12.5.2工程参数设置
12.5.3添加和编译汇编文件
12.5.4添加HEX文件到当前工程
12.6设计综合
12.7设计实现
12.8下载比特流文件
第13章UART串口控制器设计与实现
13.1设计目标
13.2串行通信基础
13.2.1串行和并行通信之间的比较
13.2.2串行通信的类型
13.3通用异步收发数据格式和编码
13.3.1数据格式
13.3.2字符编码规则
13.4UART串口控制器的实现原理
13.4.1UART发送器
13.4.2UART接收器
13.4.3发送器/接收器FIFO
13.5打开前面的设计工程
13.6添加并分析UART模块源文件
13.6.1添加UART模块源文件
13.6.2分析UART模块源文件
13.7修改并分析顶层设计文件
13.8编写程序代码
13.8.1建立新设计工程
13.8.2工程参数设置
13.8.3添加和编译汇编文件
13.8.4添加HEX文件到当前工程
13.9设计综合
13.10添加约束条件
13.11设计实现
13.12下载比特流文件
第14章VGA控制器设计与实现
14.1设计目标
14.2VGA工作原理
14.2.1VGA连接器
14.2.2CRT原理
14.2.3VGA接口信号
14.2.4VGA时序
14.3VGA显示硬件实现原理
14.3.1VGA图像缓冲区
14.3.2VGA控制台
14.3.3VGA控制器存储器空间
14.4打开前面的设计工程
14.5添加并分析VGA模块源文件
14.5.1添加VGA模块源文件
14.5.2分析VGA模块源文件
14.6修改其他设计
14.6.1添加并分析顶层设计文件
14.6.2修改时钟生成器输出频率
14.6.3修改波特率时钟
14.7编写程序代码
14.7.1建立新设计工程
14.7.2工程参数设置
14.7.3添加和编译汇编文件
14.7.4添加HEX文件到当前工程
14.8设计综合
14.9添加约束条件
14.10设计实现
14.11下载比特流文件
第15章DDR3存储器系统设计与实现
15.1计算机搭载的存储器设备
15.2存储器类型
15.2.1易失性存储器
15.2.2非易失性存储器
15.3系统设计目标
15.3.1硬件构建目标
15.3.2软件编程目标
15.4DDR3 SDRAM控制器设计原理
15.4.1DDR3 SDRAM存储器结构
15.4.2DDR3 SDRAM控制器结构
15.4.3DDR3 SDRAM的读写访问时序
15.5DDR3 SDRAM控制器系统设计与实现
15.5.1打开前面的设计工程
15.5.2设计DDR3 SDRAM存储器控制器
15.5.3修改系统设计文件
15.5.4编写程序代码
15.5.5设计综合
15.5.6设计实现
15.5.7下载比特流文件
第16章CortexM0 C语言编程基础
16.1C语言处理流程
16.2C语言镜像文件内容和存储
16.2.1C语言镜像文件的内容
16.2.2C语言镜像文件的存储位置
16.3启动代码的分析
16.4C语言中数据的存储空间
16.5C语言数据类型及实现
16.5.1C语言支持的数据类型
16.5.2数据类型修饰符
16.6C语言编程CortexM0
16.6.1定义中断向量表
16.6.2定义堆和堆栈
16.6.3读写外设寄存器
16.6.4汇编调用C函数
16.6.5C语言调用汇编语言
16.6.6C语言嵌入汇编语言
16.7C语言驱动的设计和实现
16.7.1打开前面的设计工程
16.7.2建立新的软件设计工程
16.7.3软件工程参数设置
16.7.4创建并添加汇编文件
16.7.5创建并添加头文件
16.7.6创建并添加C文件
16.7.7添加HEX文件到当前工程
16.7.8设计综合
16.7.9设计实现
16.7.10下载比特流文件
16.8C语言重定向及实现
16.8.1打开前面的设计工程
16.8.2打开前面的软件设计工程
16.8.3修改启动引导文件
16.8.4导入并修改retarget.c文件
16.8.5修改C设计文件
16.8.6添加HEX文件到当前工程
16.8.7设计综合
16.8.8设计实现
16.8.9下载比特流文件
第17章CMSIS和驱动程序开发
17.1引入CMSIS的必要性
17.2CMSIS的优势
17.3CMSIS的框架
17.4使用CMSIS访问不同资源
17.4.1访问NVIC
17.4.2访问特殊寄存器
17.4.3访问特殊指令
17.4.4访问系统
17.5软件驱动程序的设计
17.5.1软件驱动程序的功能
17.5.2AHB外设驱动设计
17.6动态图形交互系统设计
17.6.1动态图形交互硬件平台
17.6.2触摸屏显示控制方法
17.6.3触摸屏触摸控制方法
17.6.4打开前面的设计工程
17.6.5触摸屏控制器模块的设计实现
17.6.6修改顶层设计文件
17.6.7C语言程序的设计和实现
17.6.8设计综合
17.6.9添加约束条件
17.6.10设计实现
17.6.11下载比特流文件
第18章RTX操作系统原理及应用
18.1RTOS的优势
18.2操作系统的概念
18.3操作系统支持特性
18.3.1SysTick定时器
18.3.2堆栈指针
18.3.3SVC
18.3.4PendSV
18.4RTX内核架构的特点
18.5RTX的具体实现过程
18.5.1实现目标
18.5.2打开前面的工程
18.5.3修改工程属性设置
18.5.4修改启动代码
18.5.5导入RTX_Config.c文件
18.5.6修改main.c文件
18.5.7软件调试和测试
18.6RTX内核功能
18.6.1定时器滴答中断
18.6.2系统任务管理器
18.6.3任务管理
18.6.4空闲任务
18.6.5系统资源
18.6.6任务调度策略
18.6.7优先级倒置
18.6.8堆栈管理
18.6.9用户定时器
18.6.10中断函数
精彩书摘
第5章AHBLite总线结构分析
ARM公司提供的高级微控制器总线结构(Advanced Microcontroller Bus Architecture,AMBA)规范是实现ARM处理器和外部设备互连的基础。在基于ARM CortexM0的SoC中,通过AMBA规范中的AHBLite协议,实现ARM CortexM0处理器主设备对多个从设备的无障碍访问。
根据ARM AMBA规范,本章将详细介绍AMBA规范中的AHBLite协议,内容主要包括总线及分类、ARM AMBA系统总线、AMBA3 AHBLite总线、AHBLite总线结构、AHBLite总线时序,以及硬件实现。
通过本章的学习,要求读者掌握AHBLite的结构、接口信号和访问时序关系,这些内容是读者可以顺利学习本章后续内容的基础。
5.1总线及分类
本节介绍总线的概念及分类。
5.1.1总线的概念
传统上,总线是一个通信系统,用于在一个计算机的不同部件之间实现数据传输。硬件和软件两个方面定义了构成总线的要素:
(1) 从硬件上来说,包括物理实现,如电缆或者连线。例如,使用PCI总线电缆连接一个台式计算机内的部件,如图5.1所示。
图5.1PCI插槽和连线
(2) 从软件上来说,包括总线协议,如PCI总线协议。
5.1.2总线分类
在计算机系统中,通常将总线分为两类。
1) 外部总线
外部总线主要用于连接外部设备,例如,将一台计算机与一台打印机进行连接。
2) 内部总线
(1) 内部总线也称为系统总线,用于连接一台计算机的内部部件,例如,将CPU连接到存储器。
(2) 较少的开销,例如,不需要处理电特性,以及配置检测等。
(3) 内部总线的工作速度比外部总线要快。
(4) 在SoC内,将内部总线集成到单个芯片中,因此称它为片上系统总线。
思考与练习51: 说明计算机系统总线的分类,以及它们的作用。
5.2ARM AMBA系统总线
在SoC设计中,高级微控制器总线结构(Advanced Microcontroller Bus Architecture,AMBA)用于片上总线。自从AMBA出现后,其应用领域早已超出了微控制器设备,现在被广泛地应用于各种范围的ASIC和SOC器件,包括用于便携设备的应用处理器。
AMBA协议是一个开放标准的片上互联规范(除AMBA5以外),用于SoC内功能模块的连接和管理。它便于第一时间开发包含大量控制器和外设的多处理器设计。其发展过程如下:
1) 1996年,ARM公司推出了AMBA的第一个版本,包括:
(1) 高级系统总线(Advanced System Bus,ASB);
(2) 高级外设总线(Advanced Peripheral Bus,APB)。
2) 第2个版本为AMBA2,ARM增加了AMBA高性能总线(AMBA Highperformance Bus, AHB),它是一个单个时钟沿的协议。AMBA2用于ARM公司的ARM7和ARM9处理器。
3) 2003年,ARM推出了第三个版本即AMBA3,增加了以下规范:
(1) 高级可扩展接口(Advanced Extensible Interface,AXI)v1.0/AXI3,它用于实现更高性能的互连。
(2) 高级跟踪总线(Advanced Trace Bus,ATB)v1.0,它用于CoreSight片上调试和跟踪解决方案。
此外,还包含下面的协议:
(1) 高级高性能总线简化(Advanced Highperformance Bus Lite,AHBLite)v1.0。
(2) 高级外设总线(Advanced Peripheral Bus,APB)v1.0。
其中:
(1) AHBLite和APB规范用于ARM的CortexM0、M3和M4。
(2) AXI规范,用于ARM的CortexA9、A8、R4和R5的处理器。
4) 2009年,Xilinx同ARM密切合作,共同为基于FPGA的高性能系统和设计定义了AXI4规范。并且在其新一代可编程门阵列芯片上采用了高级可扩展接口AXI4协议。主要包括:
(1) AXI一致性扩展(AXI Coherency Extensions,ACE)。
(2) AXI一致性扩展简化(AXI Coherency Extensions Lite,ACELite)。
(3) 高级可扩展接口4(Advanced eXtensible Interface 4,AXI4)。
(4) 高级可扩展接口4简化(Advanced eXtensible Interface 4 Lite,AXI4Lite)。
(5) 高级可扩展接口4流(Advanced eXtensible Interface 4 Stream,AXI4Stream)v1.0。
(6) 高级跟踪总线(Advanced Trace Bus,ATB)v1.1。
(7) 高级外设总线(Advanced Peripheral Bus,APB)v2.0。
其中的ACE规范用于ARM的CortexA7和A15处理器。
5) 2013年,ARM推出了AMBA5。该协议增加了一致集线器接口(Coherent Hub Interface,CHI)规划,用于ARM CortexA50系列处理器,以高性能、一致性处理“集线器”方式协同工作,这样就能在企业级市场中实现高速可靠的数据传输。
思考与练习52: 说明ARM AMBA的含义,以及所实现的目的。
思考与练习53: 说明在ARM CortexM0中所采用的总线规范。
思考与练习54: 在ARM AMBA中,对于APB、AHB和AXI来说,性能最高的是,性能最低的是。
5.3AMBA3 AHBLite总线
AMBA3中的AHB,被称为高性能总线,主要体现在:
(1) 可以实现高性能的同步设计;
(2) 支持多个总线主设备;
(3) 提供高带宽操作。
而AHBLite是AHB的子集,简化了AHB总线的设计,典型地,只有一个主设备。
5.3.1AHBLite概述
在基于AHBLite总线构成的系统中,通过该总线,处理器实现对所有外设的控制,如图5.2所示。在该系统中,所有外设均提供AHBLite接口,用于和主处理器进行连接。对于AHBLite来说,它包含数据总线、控制总线和额外的控制信号,其中:
(1) 数据总线用于交换数据信息。
(2) 地址总线用于选择一个外设,或者一个外设中的某个寄存器。
(3) 控制信号用于同步和识别交易,如: 准备,写/读以及传输模式信号。
图5.2由AHBLite构成的处理系统
5.3.2AHBLite总线操作
图5.3总线操作过程
处理器访问一个AHBLite外设的操作过程,如图5.3所示。该过程主要包括:
(1) 通过地址总线,处理器给出所要访问AHBLite外设的地址信息。
(2) 通过地址译码器,生成选择一个外设或者寄存器的选择信号。同时,处理器提供用于控制所选AHBLite外设的控制信号,如读/写,传输数据的数量等。
(3) 如果处理器给出的是读取AHBLite外设的控制信号,则等待外设准备好后,读取该外设的数据。
除了上面介绍的基本操作过程外,AHBLite总线可以实现更多复杂的功能,如传输个数和猝发模式等。
思考与练习55: 说明在AHBLite中所包含的总线类型,以及这些总线各自的作用。
思考与练习56: 根据图5.3,详细说明CortexM0处理器和AHBLite外设的信息交互过程。
5.4AHBLite总线结构
基于AHBLite总线所构成的计算机系统架构,如图5.4所示。在该系统中,包括以下功能部件:
图5.4构成AHBLite系统的单元
(1) 主设备。在本书中,主设备是指CortexM0处理器。此外,在包含直接存储器访问(Direct Memory Access,DMA)控制器的系统中,主设备还包括DMA控制器。
(2) 地址译码器。主要用于选择CortexM0所要访问的从设备。
(3) 从设备多路复用器。主要用于从多个从设备中选择所要读取的数据和响应信号。
(4) 多个从设备。它们都包含AHBLite接口,主设备可以通过该接口访问它们。
此外,系统还应该包含时钟和复位模块单元。时钟模块用于为整个SoC系统提供时钟源; 复位模块用于为整个SoC系统提供复位信号。通过时钟和复位信号,使得SoC系统内的各个功能部件有序工作。
5.4.1全局信号
在AHBLite协议中,提供了两个全局信号,如表5.1所示。在该设计中,HCLK的频率与CortexM0处理器的频率相同。在CortexM0系统中,所有的功能部件都包含该全局信号。在基于ARM CortexM0处理器的SoC系统中,时钟模块和复位模块用于提供全局信号。
表5.1AHBLite协议中的全局信号
信号名字和方向描述
HCLK时钟,源指向所有的部件总线时钟用来驱动所有的总线传输。所有信号的时序均以HCK时钟的上升沿为基准
HRESETn复位,由控制器指向所有的部件总线复位信号低有效,用于复位系统和总线
5.4.2AHBLite主设备接口
AHBLite主设备提供地址和控制信息,用于初始化读和写操作。然后,主设备接收来自从设备的响应信息,包括数据、准备信号和响应信号,如图5.5所示。在该设计中,主设备只有CortexM0处理器,它用于提供访问从设备的AHBLite接口信号。
图5.5构成AHBLite主设备接口信号
为了方便对本书后续内容的学习,下面给出AHBLite主设备接口信号的详细信息,如表5.2所示。
表5.2AHBLite主设备接口信号
信号方向描述
HADDR [31∶0]由主设备指向从设备以及译码器32位系统地址总线
HWDATA [31∶0]由主设备指向从设备写数据总线,用于在写操作周期内将数据从主设备发送到从设备
HWRITE由主设备指向从设备用于指示传输的方向。当该信号为高时,表示写传输; 当该信号为低时,表示读传输
HSIZE [2∶0]由主设备指向从设备表示传输的宽度,如字节、半字和字
HBURST [2∶0]由主设备指向从设备猝发类型,表示传输是单个传输还是猝发的一部分
HPROT [3∶0]由主设备指向从设备保护控制信号提供了关于总线访问的额外的信息。它被模块使用,用于实现某个级别的保护
HTRANS [1∶0]由主设备指向从设备表示当前传输的类型,可以是IDLE、BUSY、NONSEQUENTIAL或SEQUENTIAL
HMASTLOCK由主设备指向从设备当该信号为高时,表示当前传输是某个锁定序列的一部分
本书所使用的CortexM0处理器IP核,通过组合表5.2中的信号可以得到四种基本的传输类型,如表5.3所示。
表5.3处理器AHBLite交易类型
交易访问描述
HSTRANS[1∶0]=2'b00空闲处理器不希望执行任何交易
HSTRANS[1∶0]=2'b10
HPROT[0]=1'b0
HSIZE[1∶0]=2'b10
HWRITE=1'b0取指处理器希望执行取指操作。处理器一次从存储器中取出32位的指令,如果有其他要求,则处理器内部缓冲和管理两个16位指令的提取
HSTRANS[1∶0]=2'b10
HPROT[0]=1'b1
HSIZE[1∶0]=2'b00字节处理器希望执行一个由LDRB、LDRBS、STRB指令所产生的8位数据访问操作。加载指令将驱动HWRITE信号为低; 保存指令将驱动HWRITE信号为高
续表
交易访问描述
HSTRANS[1∶0]=2'b10
HPROT[0]=1'b1
HSIZE[1∶0]=2'b01半字处理器希望执行一个由LDRH、LDRHS、STRH指令所产生的16位数据访问操作。加载指令将驱动HWRITE信号为低; 保存指令将驱动HWRITE信号为高
HSTRANS[1∶0]=2'b10
HPROT[0]=1'b1
HSIZE[1∶0]=2'b10字
处理器希望执行一个由LDR、LDM、POP、STR、STM、PUSH指令,或者异常入口的一部分,或者返回所产生的32位数据访问操作。加载指令将驱动HWRITE信号为低; 保存指令将驱动HWRITE信号为高
本书所使用的CortexM0处理器,总是工作在小端模式,所有的交易总是自然对齐。HRDATA和HWDATA活动字节的通道,以及它们在CortexM0处理器里对应的源/目的寄存器,如表5.4所示。
表5.4处理器AHBLite读/写数据字节通道
地 址 阶 段数 据 阶 段
HSIZE[1∶0]HADDR[1∶0]HxDATA
[31∶24]HxDATA
[23∶16]HxDATA
[15∶8]HxDATA
[7∶0]
0000———Rd[7∶0]
0001——Rd[7∶0]—
0010—Rd[7∶0]——
0011Rd[7∶0]———
0100——Rd[15∶8]Rd[7∶0]
0110Rd[15∶8]Rd[7∶0]——
1000Rd[31∶24]Rd[23∶16]Rd[15∶8]Rd[7∶0]
用于CortexM0处理器的存储器属性由ARMv6M架构决定,其地址空间的使用规则是固定的。从HADDR映射出来的HPROT[3∶2]位含义如表5.5所示。
表5.5处理器存储器映射属性
HADDR[31∶0]类型HPROT[3∶2]推荐的用法
32′hF0000000~
32′hFFFFFFFFF设备01无
32′hE0000000~
32′hEFFFFFFFF保留—映射到处理器内部的外设,如NVIC
32′hA0000000~
32′hDFFFFFFFF设备01外设
32′h80000000~
32'′h9FFFFFFFF正常(写通过)10片外RAM
32′h60000000~
32′h7FFFFFFFF正常(写回和写分配)11片外RAM
续表
HADDR[31∶0]类型HPROT[3∶2]推荐的用法
32′h40000000~
32′h5FFFFFFFF设备01外设
32′h20000000~
32′h3FFFFFFFF正常(写回和写分配)11片上RAM
32′h00000000~
32′h1FFFFFFFF正常(写通过)10程序代码
5.4.3AHBLite从设备接口
为了响应系统主设备所建立的传输,从设备也需要提供对应的AHBLite接口,如图5.6所示。通过本身所提供的AHBLite接口,从设备与主设备实现数据传输。
在从设备接口上,有一个HSELx信号,由地址译码器的输出信号HSELx给出,用于在一个时刻选择所要访问的一个从设备。
图5.6构成AHBLite从设备接口信号
为了方便本书后续内容的学习,下面给出AHBLite从设备接口信号的详细信息,如表5.6所示。
表5.6AHBLite从设备接口信号
信号方向描述
HRDATA [31∶0]由从设备指向多路选择器在读传输时,读数据总线将所选中从设备的数据发送到从设备多路选择器,然后由从设备多路选择器将数据传给主设备
HREADYOUT由从设备指向多路选择器当该信号为高时,完成总线上的传输过程; 该信号驱动为低时,扩展一个传输
HRESP由从设备指向多路选择器传输响应,当通过多路复用器时,为主设备提供额外的传输状态信息。当该信号为低时,表示传输状态为OKAY; 当该位为高时,表示传输状态是ERROR
5.4.4地址译码器和多路复用器
基于AHBLite所构建的CortexM0 SoC系统还提供了地址译码器和多路复用器。从结构上来说:
(1) 地址译码器为一对多设备,由一个主设备指向多个从设备;
(2) 多路复用器为多对一设备,由多个从设备指向一个主设备。
注: 在本书中,主设备只有ARM CortexM0处理器。
1. 地址译码器的功能
在系统中,地址译码器的输入为地址信号,输出为选择信号,如图5.7所示,它实现的功能主要包括:
(1) 根据主设备在地址总线上所提供的访问地址空间信息,生成选择一个从设备的选择信号。
(2) 同时,选择信号也连接到从设备多路选择器,用于从多个从设备中选择所对应的从设备返回信息。
图5.7地址译码器和从设备多路复用器
2. 多路复用器的功能
在系统中,来自不同从设备的响应信号,包括: HRDATA、HREADY和HRESP连接到多路复用器的输入,如图5.7所示。根据地址译码器所生成的选择信号,多路复用器将选择的从设备响应信号送给主设备。
3. 接口信号
译码器和多路选择器信号的详细信息,如表5.7所示。
表5.7译码器和多路选择器信号
信号方向描述
HRDATA [31∶0]由多路复用器指向主设备来自多路复用器到主设备的读数据
HREADY由多路复用器指向主设备和从设备来自多路复用器到主设备的准备信号。当该位为高时,该信号表示到主设备和先前完成传输的所有从设备
续表
信号方向描述
HRESP由多路复用器指向主设备来自多路复用器到主设备的传输响应信号
HSELx由译码器指向从设备每个AHBLite从设备有自己的从设备选择信号HSELx,该信号表示当前传输所对应的从设备。当一开始就选中该从设备时,它也必须监视HREADY的状态,以确保在响应当前传输前,已经完成前面的总线传输
思考与练习57: 说明在基于AHBLite所构建的SoC系统中所包含的主要功能部件。
思考与练习58: 说明在基于AHBLite所构建的SoC系统中地址译码器的功能。
思考与练习59: 说明在基于AHBLite所构建的SoC系统中多路复用器的功能。
思考与练习510: 根据图5.7,分析基于AHBLite的架构。
5.5AHBLite总线时序
一个AHBLite传输包括两个阶段:
1) 地址阶段
只持续一个HCLK周期,除非被前面的总线传输进行了扩展。
2) 数据阶段
可能要求几个HCLK周期。使用HREADY信号来控制完成传输所需要的周期数。
在AHBLite中,引入了流水线传输的机制,包括:
(1) 当前操作的数据访问可以与下一个操作的地址访问重叠。
(2) 使能高性能的操作,同时仍然为从设备提供充分的时间,为传输提供响应信息。
注: 在后续的介绍中,只实现基本的总线操作,即
(1) HBURST[2∶0]=3'b000,表示没有猝发交易;
(2) HMASTLOCK=1'b0,表示不产生带锁定的交易;
(3) HTRANS[1∶0]=2'b00或者2'b10,表示发起的交易为非顺序的传输。
5.5.1无等待基本读传输
无等待的基本读传输时序,如图5.8所示,包括:
……
前言/序言
前言
在当今社会中,嵌入式系统的应用越来越广泛,例如以智能手机为代表的嵌入式系统应用已经融入人们的日常生活中。英国ARM公司作为全球知名的嵌入式处理器IP核供应商,其所提供的CortexM、CortexR和CortexA三大系列处理器IP核以及基于这些IP核所构建的生态系统,已经成为当今嵌入式系统设计和应用的基础。
由于保护知识产权的需要,一直以来ARM公司对其处理器设计技术进行严格保密,这使得掌握Cortex处理器架构并熟练高效应用Cortex处理器变得异常困难。此外,ARM Cortex处理器架构和指令集也比较复杂。这些因素都使得一个嵌入式系统设计人员很难从处理器架构、接口、外设、编程语言和操作系统等方面全面彻底掌握嵌入式系统设计知识。
近年来,国内很多高校都相继开设了嵌入式系统相关的课程。但是,由于前面所提到的诸多因素,在市面上已经出版的ARM嵌入式系统教材并没有全面系统地从处理器架构、AMBA规范、接口、外设、编程语言和操作系统等方面全方位系统地对设计嵌入式系统所需要的知识进行解读,这给ARM嵌入式系统技术在国内教育界的普及推广造成很大困难。目前,国内嵌入式系统课程的教学大都局限在APP开发,API函数调用的层面,与工业界对培养高素质嵌入式人才的要求有相当大的差距。
去年,ARM公司做了一件让中国教育界非常高兴的事情,它提供了免费开放的CortexM0 DesignStart内核等效RTL级设计代码,可用于中国高校的嵌入式系统课程教学。通过ARM大学计划经理陈玮先生的帮助,本书作者得到了这个免费开放的CortexM0 DesignStart内核RTL级等效设计代码。通过这个免费开放的CortexM0 DesignStart IP核以及Xilinx的Vivado 2016.1集成开发环境,作者在Xilinx最新的7系列FPGA内构建了CortexM0嵌入式系统硬件,同时,通过Keil μVision5集成开发环境为该嵌入式系统硬件开发了软件应用程序。
与传统采用专用CortexM处理器介绍嵌入式系统设计的教学模式相比,采用在FPGA内构建CortexM0嵌入式系统的方法可以为嵌入式系统课程的教学带来以下好处:
(1) 当采用开放的CortexM0内核构建嵌入式系统时,教师和学生可以清楚地理解CortexM0的运行机制,包括处理器架构、指令集、存储器空间映射和中断机制。
(2) 通过对AHBLite规范的详细介绍和说明,教师和学生可以清楚地知道在一个芯片内将CortexM0嵌入式处理器与外设模块和存储器系统连接的方法。
(3) 通过使用Verilog HDL对实现特定功能外设的寄存器传输级RTL描述,教师和学生可以清楚地理解软件寄存器与硬件逻辑行为之间的关系,也就是将软件命令转换成硬件逻辑行为的方法。
(4) 通过为所定制的CortexM0嵌入式系统硬件编写软件应用,教师和学生可以彻底理解和掌握软件和硬件协同设计、协同仿真和协同调试的方法。
(5) 基于开放的CortexM0 DesignStart IP核,教师和学生可以从硬件底层逐步完成嵌入式系统的构建,以深入理解和全面掌握嵌入式系统的设计流程。
正是由于这种方法在未来嵌入式系统课程教学中有着无可比拟的巨大优势,使得作者可以从处理器架构、指令集、AHBLite规范、汇编语言、C语言、外设、CMSIS和驱动,以及操作系统等几个方面,全方位地对嵌入式系统的构建方法进行介绍,以期解决目前国内高校嵌入式系统课程教学所面临的困境,并且为学习更高层次的嵌入式系统设计和应用抛砖引玉。
本书的最大特色就是将嵌入式系统的设计理论和实践深度融合,通过典型且完整的设计案例多角度全方位地解读嵌入式系统的设计方法。为了方便老师的教学和学生的自学,本书提供了教学课件和设计实例的完整代码,以及公开的视频教学资源,这些资源的获取方式详见书中的学习说明。
本书的编写得到了ARM大学计划经理陈玮先生的大力支持和帮助,他为本书申请了免费开放的CortexM0 DesignStart IP核设计资源以及教学资源。此外,Xilinx公司的FAE对作者设计案例时遇到的问题进行了耐心细致的回答。作者的研究生李宝隆编写了本书第1章的内容,张艳辉编写了本书第2章的内容,作者的本科生汤宗美编写并整理了本书的配套教学课件,王中正对本书的部分设计案例进行了验证。此外,在本书编写期间,平凉职业技术学院的惠小军和唐海天老师进行了相关内容的学习,并帮助作者编写了第17章和第18章的内容。他们的支持和帮助是作者高质量按时完成该书的重要保证,在此一并向他们表示感谢。
在本书出版的过程中,也得到了清华大学出版社各位编辑的帮助和指导,在此也表示深深的谢意。由于编者水平有限,编写时间仓促,书中难免有疏漏之处,敬请读者批评指正。
作者
2017年1月于北京