首页>参考读物>电子电工>电子工程

FPGA应用开发和仿真
作者 : 王贞炎 编著
出版日期 : 2018-05-08
ISBN : 978-7-111-58278-6
定价 : 79.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 393
开本 : 16
原书名 :
原出版社:
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

现代FPGA设计相关的数字电路基础和Verilog硬件描述语言开始,结合笔者多年的教学和实践经验,详细讲述了Verilog HDL及其仿真,业内常用IO规范和各种总线,数字逻辑在数字信号处理、数字通信和控制方向的典型功能单元,FPGA的常规结构,静态时序分析等。

图书特色

图书前言

笔者2004年开始学习FPGA,并被其强大的灵活性所吸引,从此一切成本不敏感的项目能用FPGA的,则不会考虑其他方案。从简单的逻辑控制、MCU替代到高速的信号处理、网络与通信应用,没有什么是一片FPGA(或含有处理器核)不能驾驭的,“一片不行,那就两片!”在成本不敏感的领域,如科研、产品或芯片原型研发和验证中,FPGA扮演了极其重要的角色,因为在这些领域往往包含大量特殊的、创新的定制逻辑和功能,或者具备极高的数据传输带宽,并非MCU、MPU(DSP是MPU的一种)或应用处理器所能胜任。
即使是MCU或MPU能够胜任的工作,若使用FPGA来完成,你可以肆意挥洒自己的创意,构建符合自己习惯的逻辑接口和功能,创造符合特殊要求的功能模块和处理器外设,而不必像使用通用MCU或MPU那样,需要学习为了功能通用而设置的纷繁复杂的接口、控制寄存器或API函数。当然,一切的前提是项目成本不敏感,并且你具备深厚的FPGA开发功力——这比MCU或MPU开发要难很多。
但终端产品领域是FPGA尚无法触及的,主要限制是成本、功耗和开发难度。在成本和功耗上,FPGA灵活的本质决定了它无法与MCU或MPU抗衡,同时终端产品往往出货量也很大,因而在高带宽或特殊定制逻辑方面,也可以由ASIC胜任——ASIC在量大时成本极低。
而开发难度大则源于多个方面。在理论方面,想要学好FPGA,甚至说想要入门FPGA,都必须掌握扎实的数字逻辑基础知识。在语言方面,用于FPGA开发的硬件描述语言(HDL)描述的数字逻辑电路是并行的,与人类思维的串行性(即一步一步的思考)不符,而MCU等开发使用的程序语言则符合人类思维的串行性,相对易于入门和掌握。依笔者浅见,“程序”一词含有“依序执行的过程”之意,与可综合的硬件描述语言的并行性不符,因而本书尽量避免使用“程序”一词指代可综合的硬件描述语言代码。
开发困难还源于FPGA技术近年来的快速发展和FPGA相关教育的滞后。
笔者自六年前开始面向华中科技大学启明学院电工电子科技创新中心(以下简称“创新中心”)的学生开设与FPGA应用相关的选修课,并为他们设计开发板,无论课程内容还是开发板,每年都可能会变动以跟进新的技术发展。
创新中心的学生主要来自全校各电类相关院系,并经过严格的考核选入,都是理论成绩和实践能力兼优并对电子技术有着浓厚兴趣的学生。即便如此,笔者依然感受到FPGA应用教学的困难,特别是在引导和帮助他们使用FPGA实现具备一定难度和深度的功能的时候,或者在实现一个完备的电子电路系统,比如将FPGA用作大学生电子设计竞赛作品主控或者各类研究、双创项目的主要实现平台的时候。
笔者以为,FPGA应用教学的困难直接反映了数字电路应用教学的困难,这与传统数字电路课程设置不无关系。在电子技术子领域日趋细分、国内大学电类专业日趋细分的当代,侧重数字电路应用的专业(如通信、电气、自动化等)仍然在深入学习SR锁存器的电路构成,深入学习如何用74系列IC设计异步时序逻辑电路。笔者并不认为这些不重要,但以为这些应该是侧重数字电路理论的专业(如电子、电信等)才需要深入学习的内容,毕竟侧重数字电路应用的专业的学生以后一般不需要设计IC;不需要在数字逻辑电路中做晶体管级的优化;也不需要为少数关键路径而动用异步逻辑、锁存器逻辑。相应地,在侧重数字电路应用的专业中,现代数字电路应用中的同步时序逻辑内容并没有提升到应有的地位,与之相关的时钟概念和知识、常用的时序逻辑功能单元、基础的时序分析概念和知识也是比较缺失的。
在本书中,笔者提炼和扩展了传统数字电路课程中与FPGA应用相关的部分,形成了本书的第1章,便于读者快速强化FPGA应用设计所需的数字电路基础知识,尚未学习数字电路课程的低年级读者也可以通过学习第1章来入门数字电路基础。
第2章则是SystemVerilog(IEEE 1800—2012)简明语法讲解,主要侧重可综合(即可以在FPGA中实现)的语法,最新的IEEE 1800—2012标准较早期版本引入了不少“漂亮”的语法元素,让笔者急切地想与读者分享,后果是少数理应可综合的语法在目前主流开发工具中尚不支持,或许它们还需要一点时间来跟进,遇到这些特例,书中均会给出解决方法。
第3章是使用ModelSim进行Verilog功能仿真的简单教程。
第4章是Verilog的基本应用,这一章主要介绍各种数字逻辑基本功能单元的描述,并着重介绍了时钟、使能的概念和跨时钟域处理。从这一章起,我们正式开始了FPGA应用设计之旅。
第5章介绍IO规范,首先通识性地介绍了IO连接的常识和常见电平规范,而后以四种常见外部逻辑接口规范为例,介绍了通用接口逻辑的设计和实现。希望读者能在学习过程中领会到此类设计的一般思路和处理方法。
第6章介绍片上系统的内部互连。片上系统(SoC)结合了通用处理器和FPGA逻辑的优势,实现了软硬件协同设计,是当下FPGA应用技术的热门。而要充分利用SoC的优势,发挥软硬件协同的潜力,处理器系统与FPGA逻辑的高速互连至关重要。此章从一种简单的互连接口入手,逐步过渡到目前应用最为广泛的AXI互连协议。
第7章介绍Verilog在数字信号处理中的基本应用,主要介绍了一些基础数字信号处理算法的实现,包括频率合成、FIR和IIR滤波器、采样率变换、傅里叶变换和常见于数字控制系统的PID控制器。
第8章介绍Verilog在数字通信中的基本应用,主要介绍了基带编解码、各类基础调制解调的实现。
这些章节的依赖关系如下图所示。

本书侧重Verilog在FPGA中的应用基础,对于特定FPGA芯片、特定开发工具、特定外部连接和具体系统案例,请关注即将出版的本书的姊妹篇。
本书特别注重理论与工程实现的结合,以实现为主,以相关理论的结论为指导,读者应着重理解理论与实现的对应关系,注意培养将理论转换为工程实现的能力。
本书中的代码均为可综合代码,均是从笔者多年教学和工程实践中实际应用过的代码中提炼而来的,具备极高的实践参考价值,并大量采用参数化设计方法,大量采用生成块和常量表达式/函数,具备极高的可重用性。书中不可综合的代码只有:明确说明为测试平台;明确说明有些开发工具尚不支持的某些新语法,但一般会给出修改方法。
本书是笔者多年FPGA开发和教学经验的总结,弥补了多年来面向创新中心学生讲授FPGA应用课程时的教材缺失——虽然优秀教材有很多,但并没有特别吻合笔者思路和学生要求的。希望本书能对正在学习FPGA应用技术的本、专科学生给予有力的帮助,也希望能给正在使用FPGA进行项目开发的在校研究生、在业工程师一点借鉴和提示。
书中涉及少数较新的英文术语,因未见到广泛统一或权威的翻译,笔者尝试对其进行了翻译并在文中保留了英文,便于读者对照理解。
笔者水平有限,书中难免有偏颇谬误之处,欢迎广大读者批评指正!
最后,感谢创新中心尹仕、肖看老师和电气与电子工程学院实验教学中心的同事们!感谢我的父母、女友!感谢创新中心605实验室的同学们!由于他们的支持和帮助,本书才得以顺利完成。特别感谢姜鑫同学通读了书稿,并协助我完成了部分审校工作;特别感谢我的女友帮助绘制了书中电路图的国标版本,特别感谢出版社的编辑们进一步修订了这些电路图。

上架指导

FPGA开发

封底文字

全书Verilog模块均从实际教学和工程应用中提炼而来,参考价值高,可重用性好。本书前四章首先讲述FPGA应用设计相关的数字电路基础知识,然后介绍SystemVerilog语法和常用测试平台语法,接着讲解常用基本数字逻辑功能的Verilog描述和仿真。后续章节更是层层递进,自成一体,第5章和第6章分别讲解常用外部总线功能和SoC内部互连功能的实现,第7章和第8章分别讨论数字信号处理应用和数字通信应用。本书可作为电子工程师的技术参考书,也适合作为高校学生学习FPGA应用开发的教材和参考书。

图书目录

前言
第1章 数字电路基础1
 1.1 模拟电路与数字电路1
 1.2 二进制相关知识3
  1.2.1 二进制和其他进制3
  1.2.2 进制间的相互转换4
  1.2.3 二进制的四则运算5
 1.3 二进制在电路中的表达6
  1.3.1 有限字长和补码6
  1.3.2 负数、有符号数和无符号数6
 1.4 门电路和基本逻辑运算10
  1.4.1 非门、与门和或门11
  1.4.2 与非门和或非门12
  1.4.3 异或门和同或门12
  1.4.4 三种表达形式的转换13
  1.4.5 基本门的电路实现14
  1.4.6 三态输出和漏极开路输出15
  1.4.7 波形图17
  1.4.8 门电路的一些非典型应用18
 1.5 逻辑代数22
  1.5.1 基本定律22
  1.5.2 表达式的代数化简法23
  1.5.3 卡诺图化简法23
 1.6 基本组合逻辑24
  1.6.1 编码器和译码器24
  1.6.2 未定义的输入状态26
  1.6.3 数据选择器27
  1.6.4 延迟和竞争冒险27
  1.6.5 加法器28
  1.6.6 乘法器31
  1.6.7 数值比较器32
 1.7 锁存器32
  1.7.1 SR锁存器32
  1.7.2 D锁存器33
 1.8 触发器34
  1.8.1 D触发器、时钟和使能34
  1.8.2 D触发器的异步和同步复位36
  1.8.3 D触发器的建立时间、保持时间和传输延迟37
  1.8.4 其他触发器38
 1.9 时序逻辑40
  1.9.1 移位寄存器和串-并互换40
  1.9.2 延迟链42
  1.9.3 分频器43
  1.9.4 计数器44
  1.9.5 同步时序逻辑46
  1.9.6 累加器48
 1.10 存储器49
  1.10.1 存储器容量和类型49
  1.10.2 SRAM50
  1.10.3 双端口SRAM54
  1.10.4 同步SRAM54
 1.11 小数55
  1.11.1 定点小数及其范围和误差55
  1.11.2 定点小数的运算56
  1.11.3 浮点小数58
第2章 Verilog HDL和SystemVerilog60
 2.1 硬件描述语言简介60
 2.2 设计方法和流程62
 2.3 标识符和关键字63
 2.4 值、数和字面量63
  2.4.1 整型常数64
  2.4.2 浮点常数65
  2.4.3 时间常数和字符串常数65
 2.5 线网66
 2.6 变量67
 2.7 参数和常量68
 2.8 类型和位宽转换70
 2.9 操作符和表达式71
  2.9.1 位选取操作符74
  2.9.2 位拼接和流运算符74
  2.9.3 按位逻辑运算符76
  2.9.4 缩减运算符76
  2.9.5 移位77
  2.9.6 自增赋值和自减赋值77
  2.9.7 条件判断相关运算符78
  2.9.8 条件运算符79
  2.9.9 let语句79
 2.10 结构和联合80
 2.11 数组82
 2.12 赋值、过程和块83
  2.12.1 赋值的延迟84
  2.12.2 赋值的强度85
  2.12.3 流程控制语句86
  2.12.4 always过程88
  2.12.5 阻塞和非阻塞赋值91
 2.13 模块93
 2.14 接口97
 2.15 生成块100
 2.16 任务和函数101
 2.17 包102
 2.18 系统任务和函数103
  2.18.1 显示相关104
  2.18.2 文件相关105
  2.18.3 存储器相关106
  2.18.4 仿真相关107
  2.18.5 错误和信息107
  2.18.6 类型转换和数学函数107
 2.19 编译指令108
第3章 ModelSim和仿真111
 3.1 仿真和测试的相关概念111
 3.2 测试代码编写112
  3.2.1 时钟的产生112
  3.2.2 复位的产生114
  3.2.3 一般输入的产生115
 3.3 ModelSim软件仿真流程118
  3.3.1 主界面简介118
  3.3.2 创建工程119
  3.3.3 向工程中添加文件121
  3.3.4 开始仿真122
  3.3.5 带有信号和波形的例子124
 3.4 波形和格式127
第4章 Verilog基本应用130
 4.1 代码风格130
 4.2 常用组合逻辑单元的描述132
  4.2.1 编码器和译码器132
  4.2.2 数据选择器133
 4.3 常用时序逻辑单元的描述133
  4.3.1 移位寄存器133
  4.3.2 延迟链134
  4.3.3 计数器134
  4.3.4 累加器136
 4.4 时钟域和使能137
 4.5 跨时钟域问题138
  4.5.1 域外慢速跳沿138
  4.5.2 域间状态传递140
  4.5.3 域间事件传递142
  4.5.4 域间数据传递144
 4.6 存储器及其初始化144
  4.6.1 各种模式的存储器描述145
  4.6.2 存储器的初始化148
 4.7 用存储器实现延迟链151
 4.8 单时钟FIFO152
 4.9 双时钟FIFO156
 4.10 用户按键和数码LED157
  4.10.1 用户按键处理157
  4.10.2 数码LED159
 4.11 PWM和死区161
  4.11.1 单端PWM161
  4.11.2 差分PWM162
  4.11.3 死区165
 4.12 正交增量编码器接口166
 4.13 有限状态机170
  4.13.1 秒表例子171
  4.13.2 数字示波器触发采样例子175
第5章 IO规范与外部总线182
 5.1 单端信号和地182
 5.2 传输线与端接184
 5.3 差分信号185
 5.4 高速串行接口188
 5.5 UART189
  5.5.1 UART规范介绍189
  5.5.2 发送器的设计190
  5.5.3 接收器的设计193
  5.5.4 UART收发仿真195
 5.6 SPI197
  5.6.1 SPI规范介绍197
  5.6.2 通用SPI主机设计199
  5.6.3 通用SPI从机设计202
  5.6.4 通用SPI主从机仿真205
 5.7 I2C207
  5.7.1 I2C规范介绍207
  5.7.2 通用I2C主机设计211
  5.7.3 通用I2C从机设计219
  5.7.4 通用I2C主从机仿真224
 5.8 I2S227
  5.8.1 I2S接口介绍227
  5.8.2 I2S收发器设计和仿真229
第6章 片上系统的内部互连232
 6.1 简单存储器映射接口232
  6.1.1 从接口233
  6.1.2 与主机互连238
  6.1.3 主接口与仿真241
 6.2 流水线与流式数据245
 6.3 等待、延迟和握手248
  6.3.1 等待和延迟248
  6.3.2 握手248
 6.4 AXI4-Lite接口250
  6.4.1 AXI4-Lite接口介绍250
  6.4.2 从机范例252
  6.4.3 主机范例255
  6.4.4 主从机仿真256
 6.5 AXI4接口257
 6.6 AXI4-Stream接口263
  6.6.1 AXI4-Stream接口介绍263
  6.6.2 范例和仿真263
第7章 数字信号处理应用268
 7.1 基础知识简介268
  7.1.1 信号、系统和传输函数268
  7.1.2 基本元件的传输函数270
  7.1.3 采样率和采样定律270
  7.1.4 离散量化信号的信噪比272
 7.2 数值计算273
  7.2.1 乘法273
  7.2.2 除法275
  7.2.3 平方根277
  7.2.4 定点小数279
 7.3 数字频率合成281
  7.3.1 DDS282
  7.3.2 坐标旋转机285
 7.4 FIR滤波器290
 7.5 IIR滤波器293
 7.6 采样率变换297
  7.6.1 升采样297
  7.6.2 降采样298
  7.6.3 插零和抽取器299
  7.6.4 CIC滤波器300
  7.6.5 采样率变换范例304
 7.7 快速傅里叶变换308
  7.7.1 多周期实现311
  7.7.2 流水线实现319
 7.8 PID控制器324
第8章 数字通信应用329
 8.1 线性反馈移位寄存器329
 8.2 循环冗余校验331
 8.3 基带编解码333
 8.4 基带通道的范例和仿真336
 8.5 混频和相干解调339
 8.6 AM和ASK340
  8.6.1 调制340
  8.6.2 解调341
  8.6.3 调制解调仿真344
 8.7 PM和PSK346
  8.7.1 调制346
  8.7.2 解调348
  8.7.3 调制解调仿真349
 8.8 FM和FSK351
  8.8.1 调制351
  8.8.2 解调353
  8.8.3 调制解调仿真354
 8.9 QPSK和QAM356
  8.9.1 QAM调制357
  8.9.2 QAM解调360
  8.9.3 位同步和判决361
  8.9.4 调制解调仿真363
 8.10 载波同步和数字锁相环366
  8.10.1 数字锁相环恢复载波367
  8.10.2 QAM载波恢复仿真369
附录A SystemVerilog关键字373
附录B 全书模块依赖关系377

教学资源推荐
作者: 冯垛生
作者: (美)Thomas L. Floyd 著
作者: 冯全源 胡香荣 康萍 等编著
参考读物推荐
作者: [美]迈克尔·萨林(Mikael Sahrling) 著
作者: 李庆华 著
作者: 赵景波 阿伦 李杰臣 等编著
作者: [英]唐纳德 S.雷伊(Donald S.Reay)著