内容简介
从现代FPGA设计相关的数字电路基础和Verilog硬件描述语言开始,结合笔者多年的教学和实践经验,本书详细讲述了VerilogHDL及其仿真,业内常用IO规范和各种总线,数字逻辑在数字信号处理、数字通信和控制方向的典型功能单元,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
前言/序言
前 言
笔者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互连协议。
FPGA应用开发和仿真 下载 mobi epub pdf txt 电子书 格式