科技>电子技术>单片机与嵌入式系统
基于NiosII的嵌入式SoPC系统设计与Verilog开发实例

基于NiosII的嵌入式SoPC系统设计与Verilog开发实例"

作者:金明录门宏志
ISBN:9787121257735
定价:¥99.0
字数:1062千字
页数:664
出版时间:2015-05
开本:16(185*260)
版次:01-01
装帧:
出版社:电子工业出版社
简介

本书利用Altera FPGA开发板和Nios II软核处理器,揭示了基于FPGA的嵌入式系统特有的硬件可编程性,采用“做中学”的模式,介绍了基于Verilog的嵌入式SoPC设计的基本概念和技术。本书通过许多实例说明软、硬件的设计和开发过程,并给出了完整的代码和丰富的实验题目。

前言

译 者 序 嵌入式系统是一个面向应用、技术密集、资金密集、高度分散、不可垄断的产业,随着各个领域应用需求越来越多样化,嵌入式设计技术和芯片技术也经历着一次又一次的革新。随着嵌入式处理器、专用数字器件和DSP算法以IP核的形式嵌入到FPGA中,以单片FPGA完成以往整个嵌入式系统数字部分的设计已经越来越普及,这就是所谓的可编程片上系统(System on a Programmable Chip,SoPC)设计。可以说SoPC是一种特殊的嵌入式系统:首先它是片上系统(SoC),即由单个芯片完成整个系统的主要逻辑功能;其次,它是可编程系统,具有灵活的设计方式,可裁减、可扩充、可升级,并具备软硬件在系统可编程的功能。随着可编程逻辑器件的发展和普及,嵌入式SoPC设计已经渗透到军事、网络通信、工业控制和消费电子等领域的每个角落,作为一名电子工程师,如果缺乏这方面的知识,很难想象其“生存”空间。 这些年,国内外高校积极把SoPC设计技术引入到课程中,相继出版了不少这方面的教材和专著,其中Pong P. Chu博士的Embedded SoPC Design with Nios II Processor and Verilog Examples一书,以特有的魅力在本科生和研究生的数字系统和嵌入式系统设计课程中作为教材而被广泛采用。 然而真正掌握嵌入式SoPC设计却不是一件轻而易举的事情,而是一个漫长而曲折的学习旅程,Pong P. Chu博士正是为了给出这一正确的学习路径,并帮助读者通过简单的几步就能充分开发利用这一新方法的潜能而撰写了本书。 Altera公司持续推出了高性价比的可编程逻辑器件,在嵌入式产品设计中能够实现更多的功能并发挥着越来越重要的作用,在国内与100多所高校合作的EDA/SoPC联合实验室构筑了良好的设计和开发平台,建立了良好的实验教学和研究环境。Nios II是Altera公司专门为SoPC设计的一种软核CPU,它的可配置特性给嵌入式系统设计带来了很大的灵活性,可以说它为嵌入式系统的设计提供了一种全新的思路。 本书利用Altera FPGA开发板(DE1、DE2)和Nios II软核处理器,采用“做中学”的教学模式,通过基于Nios II软核处理器和Verilog的嵌入式SoPC设计例子,说明了软硬件设计和开发过程。难能可贵的是,这些例子都有很强的实际工程项目背景,都能在开发板上实现和验证。 本书的写作思路清晰,内容完备,自始至终强调硬件设计和集成,主要内容可以分为逐步递进的四个部分: 第1部分介绍了硬件描述语言和自定义硬件的综合; 第2部分介绍了Nios II处理器,并回顾了嵌入式软件开发流程; 第3部分说明了几个复杂的I/O外设的设计和软硬件开发,包括PS2键盘和鼠标、图形视频控制器、音频编解码器及SD卡; 第4部分给出了集成硬件加速器的几个案列分析,包括自定义GCD电路、Mandelbrot集合分形电路和基于DDFS的音频合成器。 本书引入的概念非常清晰,并且巧妙地利用前面的设计,通过处理器的C语言代码和Verilog硬件加速器的协同设计,帮助读者对Nios II嵌入式开发有更为全面系统的理解。书中使用和注册第三方IP核的一些实例,也给出了在IP核世界中有趣的生存之道。此外,对FPGA市场和可用IP核的概述以及对多处理器片上系统的点评也十分精彩,即使没有Verilog基础,读者也可以很好地完成从基本的Verilog编程到Nios II的学习。 作为建议,利用本书的扩展补充部分学习实时操作系统(RTOS)是十分有益的。这意味着要使用以太网和TCP/IP堆栈,这样可以纵观一个较为完整的嵌入式开发过程。 本书由大连理工大学电信学部的金明录教授和门宏志博士翻译。Altera公司中国区大学计划经理陈卫中先生在选题之初给与了积极的支持,在此表示感谢。另外,感谢电子工业出版社的张小乐、马岚等编辑在组织出版和编辑工作中所给予的支持。 限于译者水平,书中难免有错误与不妥之处,敬请广大读者批评指正。 译 者 2015年2月 前 言 一个SoC(片上系统)是将处理器、存储器模块、I/O外设以及自定义硬件加速器集成在一起的单一集成电路。随着FPGA(现场可编程门阵列)容量的不断增加,这种设计方法可以在一个FPGA芯片中实现,一般称为SoPC(可编程片上系统)。在传统的嵌入式系统中,硬件由固定规格的处理器和现成的外设构成,而软件则是由用户编程实现所需功能。基于SoPC的设计提供了一种新的选择。由于FPGA器件的可编程性,定制的硬件也可以合并到嵌入式系统中。可以裁剪处理器,只选择需要的I/O外设,创建定制的I/O接口,为计算密集型任务开发专用的硬件加速器。 当前HDL(硬件描述语言)综合与FPGA器件的发展,以及软核处理器的可用性使得设计者可以快速开发并仿真用户的硬件和软件,在原型设备上实现整个系统,验证物理实现的运行操作。现在可以使用PC和便宜的FPGA原型开发板构造复杂的嵌入式系统。本书采用“做中学”的方法,通过一系列实例说明软、硬件的设计和开发过程。为此本书采用的是Altera的FPGA开发板和它的Nios II软核处理器。 本书分为四个主要部分。第一部分涵盖了HDL和用户硬件的综合。第二部分综述了嵌入式软件开发的概况,重点是底层I/O的访问和驱动。第三部分阐述了几个复杂I/O外设的软、硬件设计与开发,包括PS2键盘和鼠标、图形视频控制器、音频编解码器及SD(安全数码)卡。第四部分介绍了几个硬件加速器的集成实例研究,包括自定义 GCD(最大公约数)电路、Mandelbrot集合分形电路和基于DDFS(直接数字频率合成)方法的音频合成器。所有的软硬件实例都是可综合和可编译的,也可以在开发板上进行物理测试。 本书重点和读者对象 重点 嵌入式系统受到广泛研究,有很多书介绍这个主题,涵盖的内容主要集中在软件开发上,而且通常都是针对某一特定的处理器。SoPC平台新的“硬件可编程性”为嵌入式系统开发提供了新的选择。本书主要以这个方面和相关的设计主题为重点,包括基于软核处理器和IP(知识产权)核的系统设计、软硬件的划分与整合及自定义I/O外设与硬件加速器的开发。 读者和预备知识 本书面对的读者是学习高级数字设计、嵌入式系统或者软硬件协同设计课程的学生,也包括想要学习基于FPGA、HDL和SoPC开发的实践工程师。读者需要具备数字系统的基本知识,学习过电子工程或计算机工程专业的必修课程,以及掌握C语言的实用知识。尽管计算机结构、微处理器和操作系统的知识不是必需的,但掌握这些内容是很有用的。 学习环境 FPGA开发板 本书准备使用Altera的DE1板(也叫做Cyclone II FPGA入门开发套件)和DE2板。所有的HDL代码和C代码以及相关的讨论内容都可以直接用于这两个板子。本书中讨论的大部分外设都满足通用的工业标准,并且只要开发板上含有Altera公司的FPGA芯片、合适的模拟接口电路和连接器,相应的代码就可以使用。 PC配件 设计例子包含一些PC外设的接口设备。需要PS2键盘、PS2鼠标、VGA兼容显示器、耳机或扬声器及SD卡作为I/O外设。这些配件容易得到,可以从原有的PC上获得。 软件 基于Nios II的系统需要一些Altera软件包:Quartus II网页版用于综合HDL语言,SOPC Builder用于配置和创建基于Nios II的系统,Nios EDS(嵌入式设计套件)是集成的软件开发平台;ModelSim-Altera入门版用于执行HDL语言仿真。这些软件开发包都可以从Altera的网站上下载。 代码和教程 本书的HDL代码和C语言代码可以从本书辅助专用网站下载。代码和教程是使用Altera的Quartus II网页版V10 sp1和Altera 的Nios II EDS V10 sp1开发和测试的。软件包可以在有管理权限的Windows 7的32位操作系统下运行。由于版本和操作系统的不同,进程中可能出现微小差别。 本书的结构 本书包括四个部分和一个序言部分。首先纵观全局: 第1章概述嵌入式系统,并介绍SoPC的概念和开发流程。 第1部分介绍基本的HDL结构和综合过程,阐述自定义数字电路构建。这一部分包含七章: 第2章介绍HDL程序的架构、HDL语言的基本语法和逻辑运算符。给出基于这些语言结构的门级组合电路的描述。 第3章概述FPGA器件、开发板和开发流程。通过Altera公司的Quartus II综合软件教程阐述开发的步骤。 第4章介绍HDL的关系和算术运算符,以及程序结构。它们对应着中规模器件,例如比较器、加法器和多路转换器。这些语言结构用于构建模块级组合电路。 第5章介绍存储单元的描述和常规时序电路的构建,如计数器和移位寄存器,在这些电路中状态转移显示出一种固定模式,同时本章讨论了Altera 的Cyclone II器件内部存储模块的使用和语言描述。 第6章讨论一个有限状态机(FSM)的构建,它是一种时序电路,其状态转移没有简单的固定模式。 第7章介绍含数据通路的有限状态机(FSMD)的构建。FSMD用于实现寄存器传输(RT),在这种方法中,通过寄存器间数据的传输和管理来描述系统操作。 第8章讨论几个与语言结构和编码技术相关的高级主题,并介绍更复杂的测试平台的开发。即使不学习这一章的内容,也不会影响下面章节的学习。 第2部分介绍基于Nios II的系统的构建以及嵌入式软件的开发。用一个简单的flashing-LED设计实例阐述了相关的主要概念,这一部分包括五章: 第9章概述Nios II软核处理器,详细讨论了它的关键组件。 第10章介绍基于Nios II的系统的构建和访问底层I/O外设的基本代码编写技巧。Altera的SOPC Builder 和Nios II EDS教程分别说明了其软硬件设计。 第11章讨论SOPC Builder中几个IP核(即预先设计好的I/O外设)的结构和使用,包含了ad hoc I/O驱动软件程序的开发。 第12章概述Altera HAL(硬件抽象层)运行环境,并介绍它的使用方法。 第13章讨论中断结构,包括Nios II中断控制器的使用和软中断服务程序开发。 第3部分应用第一部分和第二部分的技术,在开发板上设计一排外设模块。每个模块都包含自定义硬件和基本的软驱动。这些被看作是基本的IP核,可以嵌入到一个更大的设计项目中。第三部分包含七章: 第14章介绍使用PIO IP核作为I/O接口。这个方案可以应用于简单的I/O外设,可以避免创建新SoPC组件的开销。 第15章概述Altera的Avalon接口,其作用相当于Nios II处理器的总线结构,用于连接存储器以及I/O模块,并阐述了创建用户自定义IP核的步骤。 第16章介绍外部SRAM(静态RAM)、SDRAM(同步动态RAM)器件的接口与基本测试方法和步骤。 第17章介绍PS2接口的设计。PS2接口的硬件部分包括PS2控制器,用于产生和处理PS2时钟和数据信号。软件部分由两套驱动组成:一个用于PS2键盘,从键盘上读取和解码扫描码;一个用于PS2鼠标,获取和处理来自于鼠标的点击和移动信息。 第18章介绍图形视频控制器的设计与实现。硬件部分包括视频同步信号的产生和构建,以及基于SRAM的自定义视频存储模块接口。软件部分包括很多基本驱动程序,有用于绘制像素的基本驱动程序,还有用于显示与处理位图图片和文本的驱动程序等。 第19章讨论音频编解码芯片接口的设计。硬件部分包括用于编解码配置的I2C总线控制器和用于传输和接收数字化的音频数据流的串行总线控制器。软件部分包括设置编解码参数的程序和产生并记录音频数据的程序。 第20章介绍SD卡接口设计。硬件部分是利用SPI总线控制器完成的,软件部分则包括卡初始化程序和基本的文件读写操作程序。 第4部分给出了硬件加速器的三个实例,利用自定义的硬件执行计算密集型任务。这部分包含三章: 第21章介绍基于二进制欧几里得算法的自定义GCD(最大公约数)加速器的设计。将它的性能与软件实现方法的性能做了比较。 第22章介绍Mandelbrot集合分形加速器的集成与构造,这种加速器可以选择这个集合的任何部分,并在VGA屏幕上显示。 第23章讨论直接数字频率合成与调制电路的实现。这一电路用于包络可调的音频合成器。 辅助专用网站 本书辅助专用网站(http: //academic.csuohio.edu/chu_p/rtl)提供了附加信息,包括: 勘误表; 代码清单和相关文件; Altera软件链接; 相关参考材料的链接; 附加的设计思想。 勘误表 这是一本独自创作的书,这意味着作者编著了本书各个方面的内容,包括注释、表格、代码清单、索引和格式。因为错误常常发生,所以本书辅助专用网站上提供了一个不断更新的勘误表和上传错误的地方。 P. P. Chu 美国俄亥俄州克利夫兰市 2012年1月

目录

目 录 第1章 嵌入式系统概述 1 1.1 引言 1 1.1.1 嵌入式系统定义 1 1.1.2 示例系统 1 1.2 系统设计需求 2 1.3 嵌入式SoPC系统 3 1.4 本书结构 6 1.5 文献注释 6 第1部分 基本数字电路开发 第2章 门级组合电路 8 2.1 引言 8 2.2 总则 8 2.3 基本词法元素和数据类型 9 2.4 数据类型 10 2.4.1 四值系统 10 2.4.2 数据类型组 10 2.4.3 数字的表示方法 11 2.4.4 运算符 12 2.5 程序框架 12 2.5.1 端口声明 12 2.5.2 程序主体 13 2.5.3 信号声明 13 2.5.4 另一个实例 14 2.6 结构描述 14 2.7 测试平台 17 2.8 文献注释 19 2.9 推荐实验 19 2.9.1 门级greater-than电路代码 19 2.9.2 门级二进制译码器代码 19 第3章 FPGA和EDA软件概述 20 3.1 FPGA 20 3.1.1 通用FPGA器件概述 20 3.1.2 Altera Cyclone II系列器件 概述 21 3.2 Altera DE1和DE2开发板概述 23 3.3 开发流程 25 3.4 Quartus II概述 26 3.5 Quartus II简易教程 27 3.5.1 创建设计工程 29 3.5.2 建立测试平台进行RTL仿真 33 3.5.3 编译工程 33 3.5.4 时序分析 34 3.5.5 编程FPGA器件 34 3.6 ModelSim HDL仿真器的简易 教程 36 3.7 文献注释 39 3.8 推荐实验 40 3.8.1 门级greater-than电路 40 3.8.2 门级二进制译码器 40 第4章 RTL组合电路 41 4.1 运算符 41 4.1.1 算术运算符 42 4.1.2 移位运算符 42 4.1.3 关系运算符和等式运算符 43 4.1.4 位运算符、缩减运算符和 逻辑运算符 43 4.1.5 拼接运算符和复制运算符 44 4.1.6 条件运算符 44 4.1.7 运算符优先级 45 4.1.8 表达式位长调整 45 4.1.9 z和x的综合 46 4.2 组合逻辑电路的always语句块 47 4.2.1 基本语法和行为 48 4.2.2 进程赋值语句 48 4.2.3 变量数据类型 49 4.2.4 简单实例 49 4.3 if语句 50 4.3.1 语法 50 4.3.2 实例 51 4.4 case语句 52 4.4.1 语法 52 4.4.2 实例 53 4.4.3 casez和casex语句 54 4.4.4 全case语句和并行case语句 55 4.5 条件控制结构的路由结构 56 4.5.1 优先级路由网络 56 4.5.2 多路选择网络 57 4.6 always块的一般编码原则 58 4.6.1 组合逻辑电路代码的常见 错误 58 4.6.2 指南 61 4.7 参数和常数 61 4.7.1 常数 61 4.7.2 参数 62 4.7.3 Verilog-1995中参数的使用 64 4.8 设计实例 65 4.8.1 十六进制数的七段LED 译码器 65 4.8.2 符号幅值加法器 67 4.8.3 桶形移位器 68 4.8.4 简易浮点数加法器 70 4.9 文献注释 73 4.10 推荐实验 73 4.10.1 多功能桶形移位器 73 4.10.2 双优先级编码器 74 4.10.3 BCD码增量器 74 4.10.4 浮点数greater-than电路 74 4.10.5 浮点数和有符号整数间的 转换电路 74 4.10.6 加强的浮点数加法器 75 第5章 常规时序电路 76 5.1 引言 76 5.1.1 D触发器和寄存器 76 5.1.2 同步系统 77 5.1.3 代码开发 77 5.2 触发器和寄存器的HDL代码 77 5.2.1 D触发器 78 5.2.2 寄存器 80 5.2.3 寄存器文件 81 5.2.4 SRAM 83 5.3 简单的设计实例 84 5.3.1 移位寄存器 84 5.3.2 二进制计数器及其变形 86 5.4 时序电路的测试平台 89 5.5 时序分析 92 5.5.1 时序参数 92 5.5.2 Quartus II中的时序考虑 93 5.6 案例研究 94 5.6.1 秒表 94 5.6.2 FIFO 缓存器 98 5.7 Cyclone II器件的嵌入式存储器 模块 102 5.7.1 DE1开发板上的存储器 选项概述 102 5.7.2 嵌入式M4K模块概述 102 5.7.3 添加嵌入式存储器模块的 方法 103 5.7.4 导出同步单口RAM的HDL 模块 105 5.7.5 导出同步简单双口RAM的 HDL模块 106 5.7.6 导出同步真双口RAM的 HDL模块 108 5.7.7 导出同步ROM的HDL 模块 109 5.7.8 指定RAM初始值的HDL 模块 110 5.7.9 FIFO缓存器的再仿真 112 5.8 文献注释 113 5.9 推荐实验 113 5.9.1 可编程方波发生器 113 5.9.2 脉宽调制电路 113 5.9.3 旋转方块电路 113 5.9.4 心跳电路 114 5.9.5 旋转的LED标语电路 114 5.9.6 增强型秒表 114 5.9.7 数据宽度可变的FIFO 114 5.9.8 堆栈 115 5.9.9 基于ROM的符号幅值加 法器 115 5.9.10 基于ROM的温度转换 115 第6章 FSM 116 6.1 简介 116 6.1.1 Mealy和Moore输出 116 6.1.2 FSM的表示方法 116 6.2 FSM代码开发 118 6.3 设计实例 120 6.3.1 上升沿检测器 120 6.3.2 去抖电路 125 6.3.3 测试电路 128 6.4 文献注释 130 6.5 推荐实验 130 6.5.1 双边沿检测器 130 6.5.2 另一种去抖电路 130 6.5.3 停车场占用情况计数器 131 第7章 FSMD 132 7.1 引言 132 7.1.1 单一RT操作 132 7.1.2 ASMD图 133 7.1.3 含寄存器的选择框 134 7.2 FSMD代码开发 135 7.2.1 基于RT方法的去抖电路 135 7.2.2 含显示描述数据通路组件 的代码 136 7.2.3 含隐式描述数据通路组件 的代码 139 7.2.4 比较 141 7.3 设计实例 142 7.3.1 斐波那契数电路 142 7.3.2 除法电路 145 7.3.3 二进制—BCD码转换电路 148 7.3.4 周期计数器 151 7.3.5 精确的低频计数器 154 7.4 文献注释 157 7.5 推荐实验 157 7.5.1 另一种去抖电路 157 7.5.2 BCD—二进制码转换电路 158 7.5.3 含BCD I/O的斐波那契数 生成电路:设计方法1 158 7.5.4 含BCD I/O的斐波那契数 生成电路:设计方法2 158 7.5.5 自动进位制的低频计数器 158 7.5.6 反应计时器 159 7.5.7 Babbage差分机模拟电路 160 第8章 Verilog精选主题 161 8.1 阻塞赋值语句和非阻塞赋值 语句 161 8.1.1 概述 161 8.1.2 组合电路 163 8.1.3 存储器单元 164 8.1.4 混合阻塞和非阻塞两种赋值 语句的时序电路 165 8.2 时序电路的另一种编码方式 167 8.2.1 二进制计数器 167 8.2.2 FSM 170 8.2.3 FSMD 171 8.2.4 总结 173 8.3 有符号数据类型的使用 173 8.3.1 概述 173 8.3.2 Verilog-1995中的有符号数 174 8.3.3 Verilog-2001中的有符号数 175 8.4 综合中函数的使用 175 8.4.1 概述 175 8.4.2 例子 176 8.5 附加的测试平台开发结构 178 8.5.1 always块和initial块 178 8.5.2 进程语句 178 8.5.3 时序控制 180 8.5.4 延时控制 180 8.5.5 事件控制 181 8.5.6 wait语句 181 8.5.7 timescale指令 181 8.5.8 系统函数和系统任务 182 8.5.9 用户自定义的函数和任务 186 8.5.10 完备的测试平台的实例 187 8.6 文献注释 193 8.7 推荐实验 193 8.7.1 使用阻塞赋值语句和非阻 塞赋值语句的移位寄存器 193 8.7.2 BCD计数器的另一种编码 风格 194 8.7.3 FIFO缓存器的另一种编码 方式 194 8.7.4 斐波那契数生成电路的另一 种编码方式 194 8.7.5 双模式比较器 194 8.7.6 增强型二进制计数器的 监测器 194 8.7.7 FIFO缓存器的测试平台 194 第2部分 基本Nios II软件开发 第9章 Nios II处理器概述 196 9.1 引言 196 9.2 寄存器文件和ALU 198 9.2.1 寄存器文件 198 9.2.2 ALU 198 9.3 存储器和I/O结构 198 9.3.1 Nios II的存储器接口 198 9.3.2 存储器层次结构概述 198 9.3.3 虚拟存储器 199 9.3.4 存储器保护 199 9.3.5 高速缓冲存储器 199 9.3.6 紧密耦合存储器 200 9.3.7 I/O结构 200 9.3.8 互连结构 200 9.4 异常和中断处理 201 9.5 JTAG调试模块 201 9.6 文献注释 201 9.7 推荐实验 201 9.7.1 Nios II和MIPS的比较 201 第10章 Nios II系统的引用和底层 访问 202 10.1 开发流程的再介绍 202 10.1.1 硬件开发 202 10.1.2 软件开发 202 10.1.3 闪烁LED系统 204 10.2 Nios II硬件生成教程 204 10.2.1 在Quartus II中创建一个 硬件工程 204 10.2.2 创建Nios II系统,生成 HDL代码 204 10.2.3 创建顶层HDL文件用于 实例化Nios II系统 209 10.2.4 编译和下载程序 210 10.3 Nios II SBT GUI教程 210 10.3.1 创建BSP库 210 10.3.2 使用BSP编辑器配置BSP 211 10.3.3 创建用户应用目录并添加 应用程序文件 212 10.3.4 生成和运行软件 212 10.3.5 检查代码大小 213 10.4 针对软硬件一致性的系统 id核 213 10.5 底层I/O直接访问 214 10.5.1 C语言指针的复习 215 10.5.2 I/O寄存器的C指针 215 10.6 鲁棒的底层I/O访问 216 10.6.1 system.h 216 10.6.2 alt_types.h 217 10.6.3 io.h 217 10.7 一些关于底层I/O操作的C语 言技巧 218 10.7.1 位处理 218 10.7.2 打包和拆包 219 10.8 软件开发 219 10.8.1 基本的嵌入式程序框架 219 10.8.2 主程序和任务程序 220 10.9 文献注释 221 10.10 推荐实验 221 10.10.1 追赶LED电路 221 10.10.2 碰撞LED电路 222 10.10.3 脉宽调制电路 222 10.10.4 旋转方块电路 222 10.10.5 心跳电路 222 10.11 完整程序清单 222 第11章 预先设计的Nios II I/O外设 224 11.1 概述 224 11.2 PIO核 224 11.2.1 配置 225 11.2.2 寄存器映射 227 11.2.3 用户可见寄存器 227 11.3 JTAG UART 核 228 11.3.1 配置 228 11.3.2 寄存器映射 229 11.4 内部定时器核 229 11.4.1 配置 229 11.4.2 寄存器映射 230 11.5 增强型闪烁LED Nios II系统 231 11.5.1 SOPC设计 232 11.5.2 顶层HDL文件 235 11.6 增强型闪烁LED系统软件 开发 236 11.6.1 设备驱动介绍 236 11.6.2 增强型闪烁LED系统程序 结构 236 11.6.3 主程序 237 11.6.4 函数命名习惯 237 11.7 设备驱动程序 238 11.7.1 PIO外设驱动 238 11.7.2 JATA UART 240 11.7.3 定时器 241 11.8 任务程序 242 11.8.1 函数flashsys_init_v1( ) 242 11.8.2 函数sw_get_command_v1( ) 242 11.8.3 函数jtaguart_disp_msg_v1( ) 243 11.8.4 函数sseg_disp_msg_v1( ) 243 11.8.5 函数led_flash_v1( ) 244 11.9 软件构建和测试 245 11.10 文献注释 245 11.11 推荐实验 245 11.11.1 闪烁LED系统的 “Uptime”特性 245 11.11.2 不同定时器模式的计数 246 11.11.3 JTAG UART输入 246 11.11.4 增强型冲撞LED电路 246 11.11.5 旋转LED标语电路 246 11.11.6 改进的秒表 246 11.11.7 停车场占用情况计数器 246 11.11.8 带按钮开关控制的反应 时间定时器 247 11.11.9 带键盘控制的反应时间 定时器 247 11.11.10 串行端口通信 247 11.12 完整程序清单 247 第12章 预先设计的Nios II I/O驱动和 HAL API 256 12.1 HAL概述 256 12.1.1 桌面式嵌入式系统和 准系统嵌入式系统 256 12.1.2 HAL范式 257 12.1.3 设备类别 258 12.1.4 遵从HAL的设备驱动 258 12.1.5 _regs.h文件 259 12.1.6 基于HAL的初始化序列 260 12.2 BSP 260 12.2.1 概述 260 12.2.2 BSP文件结构 261 12.2.3 BSP配置 262 12.3 基于HAL的闪烁LED程序 263 12.3.1 使用通用I/O设备的 函数 264 12.3.2 使用非通用I/O设备的 函数 266 12.3.3 初始化程序和主程序 266 12.3.4 软件构建和测试 267 12.4 设备驱动程序考虑 268 12.4.1 I/O访问法 268 12.4.2 比较 269 12.4.3 本书中的驱动程序 271 12.5 文献注释 271 12.6 推荐实验 271 12.6.1 闪烁LED系统的 “Uptime”特性 271 12.6.2 改进的碰撞LED电路 271 12.6.3 停车场使用情况计数器 271 12.6.4 带键盘控制的反应定时器 271 12.6.5 数字闹钟 271 12.7 完整程序清单 272 第13章 中断及中断服务程序 275 13.1 HAL框架中的中断处理 275 13.1.1 概述 275 13.1.2 Nios II处理器的中断 控制器 276 13.1.3 顶层异常处理程序 276 13.1.4 中断服务程序 277 13.2 基于中断的闪烁LED程序 277 13.2.1 定时器核的中断 278 13.2.2 定时器核的驱动 278 13.2.3 中断服务程序(版本1) 279 13.2.4 中断服务程序(版本2) 281 13.3 中断和调度 282 13.3.1 调度 282 13.3.2 性能 283 13.4 文献注释 284 13.5 推荐实验 285 13.5.1 含按钮开关ISR程序的 闪烁LED系统 285 13.5.2 ISR驱动的闪烁LED 系统 285 13.5.3 闪烁LED系统中的 “Uptime”特性 285 13.5.4 带键盘控制的反应时间 定时器 285 13.5.5 数字闹钟 285 13.6 完整程序清单 285 第3部分 用户I/O外设开发 第14章 带PIO核的用户I/O外设 292 14.1 引言 292 14.2 集成除法电路到Nios II 系统 292 14.2.1 PIO模块 292 14.2.2 集成 293 14.3 测试 293 14.4 推荐实验 296 14.4.1 除法核的ISR 296 14.4.2 8位数据的除法核 296 14.4.3 64位数据的除法核 296 14.4.4 斐波那契数电路 297 14.4.5 周期计数器 297 第15章 Avalon互连与SOPC组件 298 15.1 引言 298 15.2 Avalon MM接口 300 15.2.1 Avalon MM从设备接口 信号 300 15.2.2 Avalon MM从设备接口 性质 301 15.2.3 Avalon MM从设备时序 301 15.3 Avalon接口的系统互连结构 304 15.4 SOPC I/O组件封装电路 305 15.4.1 接口I/O缓存器 306 15.4.2 内存对齐 308 15.4.3 Avalon MM主设备的 输出译码 308 15.4.4 Avalon MM主设备的 输入多路选择 310 15.4.5 实际考虑 311 15.5 SOPC组件构建指南 311 15.5.1 Avalon接口 312 15.5.2 寄存器映射 312 15.5.3 封装的除法电路 313 15.5.4 SOPC组件创建 315 15.5.5 SOPC组件实例化 320 15.6 测试 320 15.7 文献注释 323 15.8 推荐实验 323 15.8.1 除法核的ISR 323 15.8.2 除法核的另一种缓存 方案 323 15.8.3 8位数据的除法核 323 15.8.4 64位数据的除法核 323 15.8.5 斐波那契数电路 323 15.8.6 周期计数器 323 第16章 SRAM和SDRAM控制器 324 16.1 DE1开发板存储器资源 324 16.2 时序和时钟管理的概述 324 16.2.1 时钟分配网络 324 16.2.2 片外访问的时序问题 325 16.2.3 PLL 326 16.3 SRAM概述 327 16.3.1 SRAM单元 327 16.3.2 基本结构 327 16.3.3 时序 328 16.3.4 IS61LV25616AL SRAM 芯片 329 16.4 SRAM控制器IP核 330 16.4.1 Avalon接口 331 16.4.2 控制器电路 332 16.4.3 SOPC组件的创建 333 16.5 DRAM概述 334 16.5.1 DRAM单元 334 16.5.2 基本的DRAM结构 335 16.5.3 DRAM时序 336 16.6 SDRAM概述 337 16.6.1 基本的SDRAM结构 337 16.6.2 SDRAM时序 338 16.6.3 ICSI IS42S16400 SDRAM 芯片 340 16.7 SDRAM控制器和PLL 340 16.7.1 基本的SDRAM控制器 340 16.7.2 SDRAM控制器IP核 341 16.7.3 SOPC PLL IP核 342 16.8 测试系统 344 16.8.1 测试硬件配置 344 16.8.2 测试软件 346 16.9 文献注释 349 16.10 推荐实验 349 16.10.1 没有I/O寄存器的 SRAM控制器 349 16.10.2 SRAM控制器速度测试 349 16.10.3 带Avalon MM三态接 口的SRAM控制器 349 16.10.4 SDRAM控制器时钟 偏斜测试 349 16.10.5 存储器性能比较 350 16.10.6 锁存器的影响 350 16.10.7 从零构建SDRAM 控制器 350 16.11 完整程序清单 350 第17章 PS2键盘和鼠标 352 17.1 引言 352 17.2 PS2接收子系统 352 17.2.1 PS2设备到主机的通信 协议 352 17.2.2 设计和代码 353 17.3 PS2传送子系统 356 17.3.1 主机到PS2设备的通信 协议 356 17.3.2 设计和代码 357 17.4 完整的PS2系统 361 17.5 PS2控制器IP核开发 363 17.5.1 Avalon接口 363 17.5.2 寄存器映射 363 17.5.3 封装的PS2系统 364 17.5.4 SOPC组件创建 365 17.6 PS2驱动 365 17.6.1 寄存器映射 366 17.6.2 写操作程序 366 17.6.3 读操作程序 366 17.7 键盘驱动 367 17.7.1 扫描码概述 367 17.7.2 与主机的交互 368 17.7.3 驱动程序 369 17.8 鼠标驱动 373 17.8.1 PS2鼠标协议概述 373 17.8.2 与主机的交互 373 17.8.3 驱动程序 374 17.9 测试 376 17.10 书中用户IP核的使用 379 17.10.1 文件组织结构 379 17.10.2 SOPC库集成 379 17.10.3 综合的Nios II测试系统 380 17.11 文献注释 385 17.12 推荐实验 385 17.12.1 带看门狗定时器的PS2 接收子系统 385 17.12.2 软件接收FIFO 385 17.12.3 软件PS2控制器 385 17.12.4 键盘控制的LED闪烁 电路 385 17.12.5 增强型键盘驱动程序I 386 17.12.6 增强型键盘驱动程序II 386 17.12.7 遥控模式鼠标驱动 386 17.12.8 滚轮鼠标驱动 386 17.13 完整程序清单 386 第18章 VGA控制器 399 18.1 引言 399 18.1.1 CRT显示器的基本操作 399 18.1.2 DE1板上的VGA端口 400 18.1.3 视频控制器 400 18.2 VGA同步 402 18.2.1 水平同步 402 18.2.2 垂直同步 403 18.2.3 VGA同步信号时序计算 403 18.2.4 HDL实现 404 18.3 基于SRAM的视频RAM 控制器 406 18.3.1 视频存储器概述 406 18.3.2 DE1开发板的存储器 问题 407 18.3.3 Ad Hoc SRAM控制器 407 18.3.4 HDL代码 411 18.4 调色板电路 414 18.5 视频控制器IP核的开发 415 18.5.1 完整的视频控制器 415 18.5.2 Avalon 接口 416 18.5.3 寄存器映射 416 18.5.4 封装的视频控制器 416 18.5.5 SOPC组件创建 418 18.6 视频驱动 418 18.6.1 视频内存访问程序 418 18.6.2 几何模型程序 419 18.6.3 位图处理函数 421 18.6.4 位映射文本程序 423 18.7 鼠标处理程序 426 18.8 测试程序 427 18.8.1 图形绘制程序 429 18.8.2 通用绘图程序 430 18.8.3 竖条交换程序 432 18.8.4 鼠标演示程序 433 18.8.5 位映射文本程序 434 18.9 位图文件处理 434 18.9.1 BMP格式概述 435 18.9.2 BMP文件的生成 435 18.9.3 基于子画面的设计 436 18.9.4 BMP文件访问 437 18.9.5 基于主机的文件系统 437 18.9.6 位图文件获取程序 437 18.10 文献注释 441 18.11 推荐实验 442 18.11.1 基于PLL的VGA控 制器 442 18.11.2 使用16位内存配置的 VGA控制器 442 18.11.3 三位色彩深度的VGA 控制器 442 18.11.4 一位颜色深度的VGA 控制器 442 18.11.5 带双缓存的VGA控 制器 442 18.11.6 分辨率为320 × 240的 VGA控制器 442 18.11.7 含垂直模式操作的VGA 控制器 442 18.11.8 几何模型函数 442 18.11.9 位图处理函数 443 18.11.10 模拟“神奇画板”玩具 443 18.11.11 调色板查找表电路 443 18.11.12 虚拟LED闪烁系统 控制板 443 18.11.13 虚拟模拟挂钟 443 18.12 推荐工程 443 18.12.1 可配置的VGA控制器 443 18.12.2 使用系统SDRAM的 VGA控制器 444 18.12.3 绘图程序 444 18.12.4 视频游戏 444 18.13 完整程序清单 444 第19章 音频编解码控制器 469 19.1 引言 469 19.1.1 编解码器概述 469 19.1.2 WM8731芯片简介 469 19.1.3 WM8731芯片寄存器 470 19.2 I2C控制器 473 19.2.1 I2C接口概述 473 19.2.2 HDL实现 474 19.3 编解码器数据访问控制器 481 19.3.1 数字音频接口概述 481 19.3.2 HDL实现 481 19.4 音频编解码控制器IP核 开发 484 19.4.1 完整的音频编解码控 制器 484 19.4.2 Avalon接口 486 19.4.3 寄存器映射 486 19.4.4 封装的音频编解码控 制器 487 19.4.5 SOPC组件创建 489 19.5 编解码驱动 489 19.5.1 I2C命令程序 490 19.5.2 数据源选择程序 490 19.5.3 芯片初始化程序 491 19.5.4 音频数据访问程序 491 19.6 测试程序 492 19.7 音频文件处理 496 19.7.1 WAV格式概述 496 19.7.2 音频格式转换程序 497 19.7.3 音频数据读取程序 497 19.8 文献注释 499 19.9 推荐实验 500 19.9.1 软件I2C控制器 500 19.9.2 使用主设备时钟模式设计 硬件数据访问控制器 500 19.9.3 使用从设备时钟模式的 软件数据访问控制器 500 19.9.4 使用主设备时钟模式的 软件数据访问控制器 500 19.9.5 可配置的数据访问控 制器 500 19.9.6 语音录音机 500 19.9.7 实时正弦波发生器 501 19.9.8 实时音频波形显示 501 19.9.9 回音效果 501 19.10 推荐工程 501 19.10.1 完整的I2C控制器 501 19.10.2 数字均衡器 501 19.10.3 数字音频示波器 502 19.11 完整程序清单 502 第20章 SD卡控制器 514 20.1 SD卡概述 514 20.2 SPI控制器 514 20.2.1 SPI接口概述 514 20.2.2 HDL实现 515 20.3 SPI控制器IP核开发 518 20.3.1 Avalon接口 518 20.3.2 寄存器映射 518 20.3.3 封装的SPI控制器 519 20.3.4 SOPC组件创建 520 20.4 SD卡协议 520 20.4.1 SD卡的命令和响应格式 520 20.4.2 初始化和辨识过程 522 20.4.3 数据读和写过程 523 20.5 SPI与SD卡驱动程序 524 20.5.1 SPI驱动程序 524 20.5.2 SD卡驱动程序 525 20.6 文件访问 531 20.6.1 FAT16结构概述 531 20.6.2 只读FAT16文件访问 驱动程序 535 20.7 测试程序 543 20.8 SD卡的数据传输性能 547 20.9 文献注释 548 20.10 推荐实验 548 20.10.1 SD卡的数据传输性能 测试 548 20.10.2 鲁棒性强的SD卡驱动 程序 548 20.10.3 SD卡存取的专用处 理器 548 20.10.4 基于硬件的SD卡的读写 操作 548 20.10.5 SD卡信息读取 549 20.10.6 MMC卡支持 549 20.10.7 多扇区读写操作 549 20.10.8 带CRC校验的SD卡 驱动程序 549 20.10.9 数字音乐播放器 549 20.10.10 数字相框 549 20.10.11 附加的FAT功能 549 20.11 推荐工程 550 20.11.1 HAL API文件访问集成 549 20.12 完整程序清单 550 第4部分 硬件加速器实例研究 第21章 GCD加速器 572 21.1 引言 572 21.2 软件实现 573 21.3 硬件实现 573 21.3.1 ASMD图 573 21.3.2 HDL实现 574 21.4 时间测量 576 21.4.1 HAL时间戳驱动 576 21.4.2 定制的硬件计数器 577 21.5 GCD加速器IP核开发 577 21.5.1 Avalon接口 577 21.5.2 寄存器映射 577 21.5.3 封装的GCD加速器 578 21.6 测试程序 580 21.6.1 GCD程序 580 21.6.2 主程序 581 21.7 性能比较 582 21.8 文献注释 583 21.9 推荐实验 583 21.9.1 使用其他处理器配置 的性能 583 21.9.2 最小规模的GCD加速器 583 21.9.3 带后补零电路的GCD 加速器 583 21.9.4 64位数据的GCD加 速器 583 21.9.5 128位数据的GCD加 速器 583 21.9.6 欧拉算法的GCD 583 21.10 完整程序清单 583 第22章 Mandelbrot集合分形加速器 587 22.1 引言 587 22.1.1 Mandelbrot集合的概述 587 22.1.2 Mandelbrot集合点的 确定 588 22.1.3 配色方案 589 22.1.4 分形图像的生成 589 22.2 定点运算 590 22.3 函数calc_frac_point( )的软件 实现 591 22.4 函数calc_frac_point( )的硬件 实现 592 22.4.1 ASMD图 592 22.4.2 HDL实现 592 22.5 Mandelbrot集合分形加速器 IP核开发 594 22.5.1 Avalon接口 594 22.5.2 寄存器映射 595 22.5.3 封装的Mandelbrot集合 分形加速器 595 22.6 测试程序 596 22.6.1 分形图形用户接口 596 22.6.2 分形硬件加速器引擎控制 程序 598 22.6.3 分形绘图程序 598 22.6.4 文本区显示程序 599 22.6.5 鼠标处理程序 601 22.6.6 主程序 603 22.7 讨论 603 22.8 文献注释 604 22.9 推荐实验 604 22.9.1 含一个乘法器的硬件 加速器 604 22.9.2 逃逸条件修改的硬件 加速器 604 22.9.3 使用Q4.12格式的硬件 加速器 604 22.9.4 多个分形引擎的硬件 加速器 604 22.9.5 “Burning-ship”分形 605 22.9.6 改进的测试程序 605 22.10 推荐工程 605 22.10.1 浮点硬件加速器 605 22.10.2 通用画分形图平台 605 22.11 完整程序清单 605 第23章 直接数字频率合成 616 23.1 引言 616 23.2 设计和实现 616 23.2.1 数字波形的直接合成 616 23.2.2 未调制的模拟波形的直接 合成 617 23.2.3 调制的模拟波形的直接 合成 618 23.2.4 HDL实现 618 23.3 DDFS IP核开发 621 23.3.1 Avalon接口 621 23.3.2 寄存器映射 621 23.3.3 封装的DDFS电路 622 23.3.4 编解码器的DAC集成 623 23.4 DDFS驱动 623 23.4.1 配置程序 624 23.4.2 初始化程序 625 23.5 测试 625 23.5.1 音符的概括和合成 625 23.5.2 测试程序 626 23.6 文献注释 630 23.7 推荐实验 630 23.7.1 正交相位载波生成 630 23.7.2 缩减的相位—幅度查找表 631 23.7.3 合成音乐播放器 631 23.7.4 键盘钢琴 631 23.7.5 键盘记录仪 631 23.7.6 硬件包络发生器 631 23.7.7 谐波叠加合成器 631 23.7.8 采样合成器 631 23.8 推荐工程 632 23.8.1 声音发生器 632 23.8.2 函数发生器 632 23.8.3 完整的电子合成器 632 23.9 完整程序清单 632 参考文献 640

作者简介

编辑推荐

作者寄语

电子资料

www.luweidong.cn

下一个