1.1 SOPC及其技术 1
1.1.1 基于FPGA嵌入IP硬核的SOPC系统 1
1.1.2 基于FPGA嵌入IP软核的SOPC系统 1
第1章 概述 1
1.1.3 基于HardCopy技术的SOPC系统 2
1.2 Nios Ⅱ软核处理器 3
1.2.1 Nios Ⅱ软核处理器简介 3
1.2.2 可配置嵌入式软核处理器的优势 5
1.3.1 Cyclone系列 9
1.3 Altera支持SOPC的FPGA简介 9
1.3.2 Cyclone Ⅱ系列 11
1.3.3 Stratix系列 12
1.3.4 Stratix Ⅱ系列 14
第2章 SOPC开发流程及开发平台简介 16
2.1 SOPC开发流程 16
2.1.1 硬件开发 18
2.1.2 软件开发 18
2.1.3 SOPC基本开发流程简介 19
2.2 简单SOPC实例开发任务及步骤 21
2.3 分析系统需求 22
2.4 使用Quartus Ⅱ建立工程 23
2.4.1 打开Quartus Ⅱ软件并建立工程 23
2.4.2 建立顶层模块 26
2.5 使用SOPC Builder创建Nios Ⅱ系统 27
2.5.1 SOPC Builder简介 27
2.5.2 启动SOPC Builder 29
2.5.4 添加Nios Ⅱ处理器内核 31
2.5.3 指定目标FPGA和时钟设置 31
2.5.5 添加片内存储器 33
2.5.6 添加PIO 35
2.5.7 添加系统ID外设 35
2.5.8 指定基地址和中断请求优先级 36
2.5.9 设置Nios Ⅱ复位和异常地址 36
2.5.10 生成Nios Ⅱ系统 37
2.6 集成Nios Ⅱ系统到Quartus Ⅱ工程 39
2.6.1 添加Nios Ⅱ系统模块到Quartus Ⅱ顶层模块 39
2.6.2 添加引脚和其他基本单元 40
2.6.3 选择器件型号 41
2.6.4 分配FPGA引脚 42
2.6.5 器件和引脚的其他设置 43
2.7 设置编译选项并编译硬件系统 44
2.7.1 设置编译选项 44
2.7.2 编译硬件系统 44
2.7.3 查看编译报告 44
2.8 下载硬件设计到目标FPGA 46
2.9.1 创建一个新的C/C++应用工程 47
2.9 使用Nios Ⅱ IDE建立用户程序 47
2.9.2 设置C/C++应用工程系统属性 52
2.9.3 编译连接工程 53
2.10 调试/运行程序 53
2.10.1 在目标硬件上运行程序 54
2.10.2 在目标板上调试程序 54
第3章 Nios Ⅱ体系结构 57
3.1 Nios Ⅱ处理器结构 57
3.2.1 Nios Ⅱ的通用寄存器 58
3.2 Nios Ⅱ的寄存器文件 58
3.2.2 Nios Ⅱ的控制寄存器 60
3.3 算术逻辑单元(ALU) 61
3.3.1 未实现的指令 61
3.3.2 用户指令 61
3.3.3 浮点指令 61
3.4 复位信号 62
3.5 Nios Ⅱ处理器运行模式 62
3.6.2 中断控制器 63
3.6.1 异常控制器 63
3.6 异常和中断控制器 63
3.7 Nios Ⅱ的异常处理 64
3.7.1 异常类型 64
3.7.2 异常硬件处理流程 64
3.7.3 异常判别及优先级 64
3.7.4 异常的嵌套 65
3.7.5 异常返回 66
3.7.6 异常响应时间 66
3.8 存储器及I/O结构 66
3.8.1 指令与数据总线 67
3.8.2 高速缓存 68
3.8.3 紧耦合存储器 69
3.8.4 地址映射 70
3.9 存储器和外设访问 70
3.9.1 寻址方式 70
3.9.2 高速缓存访问 71
3.10 Nios Ⅱ处理器性能 71
4.1.1 PIO寄存器描述 73
4.1 并行输入/输出内核 73
第4章 Nios Ⅱ外围设备 73
4.1.2 PIO内核配置选项 75
4.1.3 软件编程 77
4.2 SDRAM控制器内核 77
4.2.1 SDRAM控制器内核概述 77
4.2.2 SDRAM内核配置选项 79
4.2.3 软件编程 81
4.2.4 SDRAM应用 81
4.3 CFI控制器内核 82
4.3.1 CFI控制器内核综述 83
4.3.2 CFI控制器内核设置 83
4.3.3 软件编程 85
4.4 EPCS控制器内核 85
4.4.1 EPCS控制器内核综述 85
4.4.2 软件编程 86
4.5 定时器内核 87
4.5.1 定时器内核综述 87
4.5.2 定时器寄存器描述 88
4.5.3 定时器内核配置选项 90
4.5.4 软件编程 92
4.6 UART内核 93
4.6.1 UART内核综述 93
4.6.2 UART内核的寄存器描述 95
4.6.3 UART内核配置选项 99
4.6.4 软件编程 101
4.7 JTAG_UART内核 104
4.7.1 JTAG_UART的寄存器描述 105
4.7.2 JTAG_UART内核配置选项 106
4.7.3 软件编程 108
4.8 SPI内核 110
4.8.1 SPI内核综述 110
4.8.2 SPI内核的寄存器描述 112
4.8.3 SPI内核配置选项 115
4.8.4 软件编程 117
4.9 DMA内核 118
4.9.1 DMA控制器内核综述 118
4.9.2 DMA寄存器描述 119
4.9.3 DMA控制器配置选项 122
4.9.4 软件编程 123
4.10 带Avalon接口的互斥内核 125
4.10.1 互斥内核描述 125
4.10.2 互斥内核配置选项 126
4.10.3 软件编程 126
4.11 带Avalon接口的邮箱内核 129
4.11.1 邮箱内核描述 129
4.11.2 邮箱内核配置选项 129
4.11.3 软件编程 130
4.12 System ID内核 132
4.12.1 System ID寄存器描述 133
4.12.2 软件编程 133
第5章 FPGA配置和Flash编程 134
5.1 FPGA配置 134
5.1.1 FPGA配置方式 134
5.1.2 FPGA配置过程 136
5.2 Cyclone及Cyclone Ⅱ FPGA配置 138
5.2.1 主动串行配置 140
5.2.2 主动串行配置(AS)的配置时间估算 143
5.2.3 JTAG配置 143
5.3 配置芯片 145
5.4 配置的软件设置 146
5.4.1 配置方式及配置芯片选择 146
5.4.2 复用配置引脚处理 147
5.5 配置文件 148
5.5.1 配置文件的格式 148
5.5.2 配置文件设置和转换 149
5.5.3 配置文件的压缩 150
5.6 配置可靠性及电路设计注意事项 152
5.6.1 配置的可靠性 152
5.6.2 电路设计注意事项 153
5.7 下载配置文件到FPGA 153
5.8 下载配置文件到EPCS 155
5.8.1 AS接口的EPCS直接编程 155
5.8.2 JTAG接口的EPCS间接编程 157
5.8.3 SOF文件转换为JIC文件 158
5.8.4 JIC文件转换为JAM文件 161
5.8.5 JIC和JAM文件的内容 163
5.8.6 使用JIC文件和Quartus Ⅱ Programmer对EPCS编程 163
5.8.7 使用JAM文件和Quartus Ⅱ Programmer对EPCS编程 163
5.9 IDE Flash Programmer介绍 164
5.9.1 IDE Flash Programmer编程工作过程 165
5.9.2 Flash编程设计 165
5.9.3 目标板Flash编程设计 165
5.9.5 Flash文件 166
5.9.4 Flash编程内容的类型 166
5.10 用户程序引导 167
5.10.1 从CFI Flash引导 167
5.10.2 从串行配置器件EPCS引导 167
5.10.3 引导复制程序 168
5.10.4 用户程序ELF文件连接设置 169
5.10.5 用户程序引导小结 171
5.11 使用IDE Flash Programmer编程 172
5.12 创建目标板Flash编程设计 176
6.1 Nios Ⅱ IDE简介 184
第6章 Nios Ⅱ应用程序及其外设HAL驱动开发 184
6.2 设置工程系统库属性和编译选项 186
6.2.1 C/C++ Build设置 187
6.2.2 C/C++ Indexer设置 188
6.2.3 System Library设置 188
6.3 调试/运行程序 190
6.3.1 调试器目标连接设置 191
6.3.2 调试器设置 192
6.4 下载程序到Flash 194
6.5 硬件抽象层(HAL)系统库 194
6.3.3 运行程序 194
6.5.1 HAL的构成 195
6.5.2 HAL的通用设备模型 196
6.6 使用HAL开发应用程序 197
6.6.1 Nios Ⅱ IDE工程结构 197
6.6.2 与目标系统相关的system.h系统描述文件 198
6.6.3 数据宽度及HAL类型定义 200
6.6.4 HAL对系统启动的支持 200
6.6.5 HAL与异常处理 201
6.6.6 提高处理性能的措施 203
6.7 设备驱动概述 204
6.7.1 设备的寄存器抽象 205
6.7.2 处理器外围设备的分类 205
6.7.3 标准I/O访问方法 206
6.7.4 标准I/O函数到具体驱动程序的映射 206
6.7.5 驱动程序与设备交互的方法——轮询和中断 208
6.7.6 调用设备驱动的方式 208
6.8.1 创建一个描述设备寄存器的头文件 209
6.8 开发HAL下的设备驱动 209
6.8.2 为各类设备创建驱动程序 210
6.8.3 把设备驱动集成到HAL中 218
6.9 μC/OS-Ⅱ 221
6.9.1 μC/OS-Ⅱ简介 222
6.9.2 设备驱动的线程安全 222
6.9.3 Newlib C标准库的线程安全 223
6.9.4 HAL系统时钟与μC/OS-Ⅱ系统时钟 224
6.9.6 使用Nios Ⅱ IDE开发μC/OS-Ⅱ应用程序 225
6.9.5 μC/OS-Ⅱ代码编译和初始化 225
6.9.7 μC/OS-Ⅱ基本常识 230
6.10 Nios Ⅱ C语言至硬件加速编译器(C2H)简介 231
第7章 Avalon接口规范 233
7.1 Avalon总线简介 233
7.2 术语和概念 235
7.2.1 Avalon交换结构 235
7.2.2 Avalon外设 237
7.2.3 Avalon信号 238
7.2.4 Avalon端口 238
7.2.8 PTF文件与SOPC Builder 239
7.2.7 周期 239
7.2.5 主从端口对 239
7.2.6 传输 239
7.3 Avalon信号 240
7.3.1 信号命名规则 241
7.3.2 信号类型的完全列表 241
7.3.3 信号极性 244
7.3.4 信号序列和时序 244
7.3.5 传输属性 245
7.4.1 从端口基本信号 246
7.4 从端口传输 246
7.4.2 从端口基本读传输 247
7.4.3 带传输属性的从端口读传输 248
7.4.4 从端口基本写传输 252
7.4.5 带传输属性的从端口写传输 252
7.5 主端口传输 255
7.5.1 主端口信号 256
7.5.2 主端口基本读传输 257
7.5.3 主端口基本写传输 258
7.5.4 主端口传输的等待周期、建立时间及保持时间属性 259
7.5.5 主端口传输的流水线、突发及三态属性 260
7.6 流水线传输属性 260
7.6.1 具有固定延迟的从端口流水线读传输 260
7.6.2 具有可变延迟的从端口流水线读传输 261
7.6.3 主端口流水线读传输 263
7.7 流控制属性 264
7.7.1 具有流控制的从端口传输 265
7.7.2 具有流控制的主端口传输 267
7.8 三态传输属性 269
7.8.1 三态从端口传输 270
7.8.2 三态主端口传输 276
7.9 突发传输属性 277
7.9.1 主端口突发传输 277
7.9.2 从端口突发传输 280
7.10 非传输相关的信号 283
7.10.1 中断请求信号 283
7.10.2 复位控制信号 285
7.11.1 静态地址对齐 286
7.11 地址对齐 286
7.11.2 动态地址对齐 287
7.11.3 为Avalon端口选择地址对齐参数 288
7.11.4 不同地址对齐方式的连线及编程操作 289
第8章 Nios Ⅱ系统深入设计 291
8.1 定制基于Avalon的用户外设 291
8.1.1 定制用户外设简介 291
8.1.2 PWM设计说明 293
8.1.3 将PWM设计封装为SOPC Builder元件 296
8.1.4 使用并验证新创建的PWM元件 300
8.1.5 手工修改创建的元件 302
8.2 定制Nios Ⅱ用户指令 302
8.2.1 Nios Ⅱ定制指令综述 303
8.2.2 定制指令实现方式 307
8.2.3 定制指令设计示例 308
8.2.4 定制指令的使用方法 312
第9章 NiosⅡ汇编程序设计及混合语言程序开发 317
9.1 历史回顾 317
9.2.1 数据传输指令 318
9.2 Nios Ⅱ的指令集 318
9.2.2 寄存器间数据拷贝指令 319
9.2.3 算术逻辑运算指令 319
9.2.4 比较指令 320
9.2.5 移位指令 321
9.2.6 跳转、分支和子程序调用指令 321
9.2.7 断点及异常指令 322
9.2.8 用户指令 322
9.2.9 未实现的指令 323
9.2.10 空操作 323
9.3 Nios Ⅱ汇编程序设计 323
9.3.1 利用Nios Ⅱ汇编语言实现“Hello World!” 323
9.3.2 在C语言中内嵌汇编 334
9.4 使用混合语言进行程序开发 341
附录1 SmartSOPC多功能教学实验开发平台 344
附录2 LA系列高性能逻辑分析仪 349
参考文献 354