本书由至芯科技在各大高校的授课内容整理而来,是为初学者量身定制的FPGA入门教材,从基础的软件安装、工具使用、语法解释、设计方法、常用IP,到最后的设计技巧及大量的进阶实验,内容环环相扣,为读者建立了一个比较清晰的学习脉络。设计思路及方法为本书重点强调的内容,它作为一条主线贯穿始终,希望读者学习时注意体会。只有掌握了正确的学习和设计方法,读者才可能在数字逻辑设计的领域越走越远。本书没有收录过多烦琐的理论,一切从实战出发,按照一套相对高效的设计方法直接切入一个个小的项目,深入浅出。希望以此可以培养广大读者的设计能力,我们不但要知道某个逻辑可以这样写,更重要的还必须清楚为什么这样写,这样写有什么优势或劣势,还有没有优化空间等。与本书配套的视频已保存在网络云中,读者可在下载后参考学习。本书内容由浅入深,适合广大可编程逻辑器件的初学者作为入门和进阶的教材,也适合作为电子信息、计算机等专业本科生、研究生,以及具有一定电子专业知识背景的电子工程师的参考用书。
本书是由至芯科技推出的FPGA基础入门实验教程。授课内容深入浅出,从最基础的语法到进阶的端口驱动开发,所有的设计都紧紧地围绕着“设计方法”这样的一条主线进行。
本书主要由至芯科技工程师王建飞(笔名为梦翼师兄)和雷斌执笔完成,内容全部取材于至芯科技在各大高校的具体授课内容,设计流程规范、精练。每个项目都给出了具体的设计目的、设计原理、设计思路、系统架构图、各模块端口意义注解及具体模块的代码等。内容详细,可以有效地帮助初学者快速入门FPGA硬件逻辑设计。
本书具有以下特点。
(1)教学题材和教学方法全部来自至芯科技在各大高校的实训内容,设计方法规范,授课题材实战价值高。
(2)教学内容全部以实战形式进行,在动手实现实际项目的过程中掌握常用的语法、设计方法、通用接口及FPGA设计过程中常用到的设计技巧。
(3)本书由至芯科技工程师梦翼师兄编写,在内容编写过程中融入了大量工程实战经验,各代码模块实战价值高,可移植性强,大部分功能模块可以直接应用于其他设计,从而有效缩短二次开发周期。
(4)本书配有梦翼师兄录制的配套高清教学视频,手把手教学,帮助读者提高学习效率。
梦翼师兄根据多年的项目研发和教学经验,将项目设计研发中需要用到的一些开发技巧和学习方法通过项目实战的方式尽可能地体现到每一个实例中。通过本书的学习,读者不但可以掌握常用的FPGA接口和外设驱动方式。更重要的是,通过理解和练习,读者可以建立起一套完整、规范的开发设计流程和方法,助力之后的公司项目开发。
另外,读者可以跟着梦翼师兄录制的配套教学视频进行学习,通过视频,可以看到梦翼师兄如何对一个项目进行构思,以及如何进行基础模块代码的编写。
在此特别感谢黑龙江信息技术职业学院刘春玲老师为本书的编写提出的大量建设性建议以及对内容的编排所做的大量工作。同时,参与编写本书的还有黑龙江信息技术职业学院的李茁老师、安康学院的崔智军老师以及至芯科技的寇飞强、郝旭帅、陈飞龙三位工程师。非常感谢安康学院崔智军老师对本书前4章内容的编写。由于编者水平有限和时间限制,书中难免存在不妥之处,敬请广大读者予以指正和帮助。
第1章 没有金刚钻,不揽瓷器活 1
1.1 Quartus II 15.0――温婉简约编译器 1
1.1.1 写在前面的话 1
1.1.2 Altera Quartus II 15.0安装 1
1.2 ModelSim 10.3d――独具慧眼仿真工 7
1.3 级联调试――标准设计势必行 7
第2章 工欲善其事,必先利其器 31
2.1 工程规范――我的地盘,你说了算 31
2.2 初识流水灯――很傻很天真 31
2.2.1 项目需求 31
2.2.2 相关技术介绍 31
2.2.3 硬件设计 32
2.2.4 顶层架构设计 32
2.2.5 端口描述 33
2.2.6 代码解释 33
2.3 测试文件――一切都似曾相识 39
第3章 谆谆教诲莫相忘,字字珠玑记心头 41
3.1 赋值语句――你是我的最爱 41
3.1.1 写在前面的话 41
3.1.2 非阻塞赋值语句 41
3.1.3 阻塞赋值语句 43
3.2 关系运算符――心中永远的痛 45
3.2.1 写在前面的话 45
3.2.2 关系运算符的种类 45
3.2.3 关系运算符的使用意义 45
3.2.4 关系运算符与算数运算符优先级 45
3.3 if-else 与 case――永远的欢喜冤家 45
3.3.1 写在前面的话 45
3.3.2 if-else 条件分支语句 46
3.3.3 case分支控制语句 50
3.3.4 case语句和if-else语句的区别 52
3.4 缩减运算符――就这样变没了 52
3.4.1 写在前面的话 52
3.4.2 工程实例 52
3.5 移位运算符――性子总是这么直 54
3.5.1 写在前面的话 54
3.5.2 移位运算符实例 55
3.6 位拼运算符――聪慧灵秀惹人妒 57
3.6.1 写在前面的话 57
3.6.2 代码实例 57
第4章 会当凌绝顶,设计Top-Down 59
4.1 层次化设计方法――心中永远的女神 59
4.1.1 写在前面的话 59
4.1.2 层次化设计框图示例 59
4.1.3 层次化设计实例 60
4.2 层次化设计技巧――巧夺天工砖瓦匠 65
4.2.1 写在前面的话 65
4.2.2 电平触发 65
4.2.3 尖峰脉冲 66
第5章 内涵丰富本领多,谁与争锋IP核 68
5.1 锁相环――速度,你说了算 68
5.1.1 写在前面的话 68
5.1.2 项目需求 68
5.1.3 操作步骤 68
5.1.4 顶层架构设计 73
5.1.5 端口功能 73
5.1.6 代码解释 73
5.1.7 仿真结果分析 75
5.2 ROM――只有你最慷慨 75
5.2.1 写在前面的话 75
5.2.2 项目需求 75
5.2.3 操作步骤 75
5.2.4 顶层架构设计 80
5.2.5 模块功能介绍 80
5.2.6 模块端口和内部连线描述 80
5.2.7 代码解释 80
5.2.8 仿真分析 83
5.3 RAM――有入有出,公平合理 84
5.3.1 写在前面的话 84
5.3.2 项目需求 84
5.3.3 操作步骤 84
5.3.4 顶层架构设计 86
5.3.5 模块功能介绍 86
5.3.6 模块端口和内部连线描述 87
5.3.7 代码解释 87
5.2.8 仿真分析 90
5.4 FIFO――重中之重缓存器 91
5.4.1 写在前面的话 91
5.4.2 项目需求 91
5.4.3 操作步骤 91
5.4.4 顶层架构设计 94
5.4.5 模块功能介绍 95
5.4.6 模块端口和内部连线描述 95
5.4.7 代码解释 95
5.4.8 仿真分析 100
5.5 移位寄存器――你是我的骄傲 101
5.5.1 写在前面的话 101
5.5.2 功能要求 102
5.5.3 操作步骤 103
5.5.4 顶层架构设计 105
5.5.5 模块功能介绍 105
5.5.6 模块端口和内部连线描述 105
5.5.7 代码解释 106
5.5.8 仿真分析 110
第6章 基础项目我在行,信手拈来显聪慧 111
6.1 二选一之战――我只是个新兵 111
6.1.1 写在前面的话 111
6.1.2 项目需求 111
6.1.3 系统架构 111
6.1.4 模块功能介绍 111
6.1.5 顶层模块端口描述 111
6.1.6 代码解释 112
6.1.7 仿真分析 113
6.1.8 二选一数据寄存 114
6.2 三态门之战――机关算尽太聪明 116
6.2.1 写在前面的话 116
6.2.2 项目需求 116
6.2.3 系统架构 117
6.2.4 模块功能介绍 117
6.2.5 顶层模块端口描述 117
6.2.6 代码解释 117
6.2.7 仿真分析 119
6.3 串并转换――你无处不在 120
6.3.1 写在前面的话 120
6.3.2 需求分析 120
6.3.3 顶层框架设计 120
6.3.4 顶层模块端口介绍 121
6.3.5 代码实现 121
6.4 generate语句――呵呵,你就会偷懒 125
6.4.1 写在前面的话 125
6.4.2 基本概念 126
6.4.3 generate_for语句 126
6.2.4 generate_if语句 132
6.4.5 generate_case语句 133
6.5 边沿检测――如此高大上 135
6.5.1 写在前面的话 135
6.5.2 电路原理分析 135
6.5.3 顶层框架结构 136
6.5.4 顶层模块端口介绍 136
6.5.5 代码实现 136
6.5.6 仿真波形分析 138
6.6 按键消抖―且看老夫手段 139
6.6.1 写在前面的话 139
6.6.2 基于尖峰脉冲的按键消抖 139
6.6.3 项目需求 139
6.6.4 误区排除 139
6.6.5 设计思路 140
6.6.6 系统框架 140
6.6.7 顶层端口描述 141
6.6.8 代码解释 141
6.6.9 仿真分析 144
第7章 没有标准的方法,但见可行的技巧 146
7.1 异步复位同步释放――高端神秘你最帅 146
7.1.1 写在前面的话 146
7.1.2 基本概念 146
7.1.3 代码举例 146
7.1.4 异步复位同步释放电路 148
7.2 任意分频之战――一切都如此简单 155
7.2.1 写在前面的话 155
7.2.2 实现原理 156
7.2.3 系统框架 156
7.2.4 顶层模块端口描述 156
7.2.5 代码分析 156
7.2.6 仿真分析 159
7.3 二进制数转BCD――终极进化 160
7.3.1 写在前面的话 160
7.3.2 基本概念 160
7.3.3 逐步移位法原理 160
7.3.4 设计任务 161
7.3.5 顶层框图设计 161
7.3.6 代码实现 163
7.3.7 仿真分析 165
7.4 BCD转二进制――返璞归真 166
7.4.1 写在前面的话 166
7.4.2 基本概念 166
7.4.3 移位算法原理 166
7.4.4 顶层框架图 166
7.4.5 顶层模块端口介绍 167
7.4.6 代码实现 167
7.4.7 仿真分析 169
7.5 流水线设计之战――效率决定成败 170
7.5.1 写在前面的话 170
7.5.2 流水线的基本概念 170
7.5.3 流水线改造实例 171
7.6 Signaltap 之战――奸细,哪里逃 177
7.6.1 写在前面的话 177
7.6.2 背景知识 178
7.6.3 典型的SignalTap II调试流程 180
7.6.4 SignalTap II调试具体操作步骤 180
7.6.5 具体步骤 181
第8章 进阶首选我当前,乘胜追击势必行 204
8.1 字符状态机之战――进来的,都要审查 204
8.1.1 写在前面的话 204
8.1.2 项目需求 204
8.1.3 解决方案 204
8.1.4 系统架构 204
8.1.5 模块功能介绍 204
8.1.6 顶层模块端口描述 205
8.1.7 代码解释 205
8.1.8 仿真分析 210
8.2 数码管之战――好像胜利的曙光 210
8.2.1 写在前面的话 210
8.2.2 项目需求 210
8.2.3 原理分析 210
8.2.4 单个数码管显示 212
8.2.5 6个数码管显示 215
8.3 PS2之战――键盘原来是这样 221
8.3.1 写在前面的话 221
8.3.2 项目需求 221
8.3.3 原理分析 222
8.3.4 系统架构 223
8.3.5 模块功能介绍 223
8.3.6 顶层模块端口描述 223
8.3.7 用Signaltap II分析波形 223
8.3.8 代码解释 225
8.3.9 仿真分析 232
8.4 矩阵键盘之战――严密的资源整合 233
8.4.1 写在前面的话 233
8.4.2 项目需求 233
8.4.3 矩阵键盘的原理 233
8.4.4 架构设计 235
8.4.5 模块功能介绍 235
8.4.6 顶层模块端口描述 235
8.4.7 代码解释 235
8.4.8 仿真分析 241
8.5 IIC之战――配置离不开你 241
8.5.1 写在前面的话 241
8.5.2 项目需求 242
8.5.3 IIC的原理分析 242
8.5.4 架构设计 246
8.5.5 模块功能介绍 246
8.5.6 顶层模块端口描述 246
8.5.7 代码解释 246
8.5.8 仿真分析 263
8.6 串口通信之战――通信终于畅通了 264
8.6.1 写在前面的话 264
8.6.2 项目需求 265
8.6.3 UART的原理分析 265
8.6.4 系统架构 266
8.6.5 模块功能介绍 268
8.6.6 模块端口和内部连线描述 268
8.6.7 代码解释 268
8.5.8 仿真分析 276
8.7 VGA之战――我型我酷炫 276
8.7.1 写在前面的话 276
8.7.2 什么是VGA 277
8.7.3 VGA接口 277
8.7.4 VGA显示原理 278
8.7.5 顶层框架 280
8.7.6 顶层模块端口描述 280
8.7.7 代码实现 280
8.7.8 仿真分析 285
8.8 12864液晶之战――心灵的窗口 285
8.8.1 写在前面的话 285
8.8.2 基本概念 285
8.8.3 硬件电路结构 286
8.8.4 官方代码解析 287
8.8.5 项目需求 293
8.8.6 系统架构 293
8.8.7 代码解释 294
8.8.8 仿真分析 305
8.9 DDS――形随心动 305
8.9.1 写在前面的话 305
8.9.2 项目需求 305
8.9.3 项目分析 305
8.9.4 系统架构 306
8.9.5 模块功能介绍 306
8.9.6 顶层端口和内部连线描述 306
8.9.7 波形数据的由来 307
8.9.8 波形发生器(不可调频和调相) 308
8.9.9 波形发生器(不可调频,但可以调相) 312
8.9.10 波形发生器(可以调频,可以调相) 315
8.9.11 最终设计 318
8.10 蜂鸣器之战――奏响凯旋的乐章 322
8.10.1 写在前面的话 322
8.10.2 什么是蜂鸣器 322
8.10.3 设计任务 323
8.10.4 顶层端口介绍 325
8.10.5 代码解释 325
8.10.6 仿真分析 331