第一篇 FPGA设计基础与ISE开发基本流程第一章 FPGA设计基础 1
1.1 FPGA的基本概念 1
1.2 可编程逻辑技术发展简介 2
1.2.1 可编程技术发展演变过程 2
1.2.2 FPGA技术 5
1.3 FPGA器件编程技术 6
1.3.1 熔丝互连编程技术 6
1.3.2 基于反熔丝的编程技术 8
1.3.3 基于SRAM的可编程技术 10
1.3.4 基于FLASH或E2PROM的可编程技术 11
1.4 通用FPGA的构成结构 11
1.4.1 现代FPGA的基本逻辑单元 12
1.4.2 Xilinx Spartan-3 FPGA的基本结构 14
1.5 Xilinx FPGA的开发流程 20
1.6 FPGA技术的未来发展 23
本章小结 25
思考与练习 25
第二章 ISE12.1开发环境与S3开发板 26
2.1 ISE12.1软件综述 26
2.1.1 ISE12.1套件分类 26
2.1.2 ISE12.1功能介绍 27
2.1.3 ISE12.1用户界面和菜单操作 27
2.2 S3开发板简介 28
2.3 ISE开发流程 29
2.3.1 创建工程和设计输入 30
2.3.2 创建TestBench并进行RTL仿真 33
2.3.3 添加约束 36
2.3.4 综合与实现 37
2.3.5 生成配置文件并对FPGA进行配置 38
2.4 第三方开发工具 40
2.4.1 ModelSim介绍 40
2.4.2 在ModelSim中编译Xilinx的器件库 41
2.4.3 ModelSim功能仿真举例 42
2.4.4 Synplify Pro介绍 47
2.4.5 关联ISE和SynplifyPro 47
2.4.6 Synplify Pro使用流程 48
本章小结 52
思考与练习 52
第二篇 数字电路设计基础与VerilogHDL描述第三章 VerilogHDL语言基础 53
3.1 基本知识介绍 53
3.2 模块结构和编程框架 54
3.2.1 模块的结构 54
3.2.2 编程框架 56
3.3 数据类型和基本元素 58
3.3.1 基本概念 58
3.3.2 基本数据类型值 59
3.3.3 数据类型 59
3.3.4 常量 61
3.4 结构化描述 62
3.5 TestBench简介 64
本章小结 66
思考与练习 67
第四章 组合逻辑设计 68
4.1 基本操作符 68
4.1.1 算术操作符 69
4.1.2 移位操作符 70
4.1.3 关系运算符与相等运算符 70
4.1.4 位操作、复制和逻辑操作运算符 70
4.1.5 连接与复制运算符 72
4.1.6 条件运算符 72
4.1.7 位宽调整操作 73
4.1.8 关于Z和X的综合 74
4.2 组合逻辑描述 75
4.2.1 使用always模块描述组合逻辑 75
4.2.2 使用赋值语句描述组合逻辑 76
4.2.3 举例说明 76
4.3 条件控制语句 78
4.3.1 if-else语句 78
4.3.2 case语句 80
4.3.3 casez和casex语句 82
4.3.4 “full case”和“parallel case”语句 83
4.4 条件控制语句的布线结构 84
4.4.1 优先级布线网络 84
4.4.2 多路选择布线网络 85
4.5 always语句的编程指导 86
4.6 工程实践 89
4.6.1 十六进制数到七段数码管译码器 89
4.6.2 带符号加法器设计 92
4.6.3 桶形移位器设计 95
本章小结 96
思考与练习 97
第五章 时序逻辑设计 98
5.1 时序电路基础 98
5.1.1 时序电路基本存储单元 98
5.1.2 同步时序电路 99
5.1.3 时序电路分类 100
5.2 时序电路基本单元的HDL描述 101
5.2.1 D触发器 101
5.2.2 寄存器 104
5.2.3 寄存器文件 104
5.3 简单例程 105
5.3.1 移位寄存器 105
5.3.2 二进制计数器和变量 107
5.4 时序电路的TestBench 111
5.5 工程实践 114
5.5.1 LED时序动态选择电路 114
5.5.2 秒表设计 122
5.5.3 FIFO缓冲器设计 126
本章小结 131
思考与练习 131
第六章 时序状态机设计 133
6.1 有限状态机 133
6.1.1 Moore和Mealy状态机 133
6.1.2 有限状态机的描述方式 133
6.1.3 有限状态机的HDL开发 135
6.2 状态机设计实例 138
6.2.1 上升沿检测电路 138
6.2.2 按键防抖动电路 143
6.2.3 电路硬件验证 147
6.3 带数据路径的状态机(FSMD) 149
6.3.1 简单寄存器传输操作 149
6.3.2 FSMD状态描述 150
6.3.3 FSMD的模块框图 151
6.4 FSMD的HDL代码开发 152
6.4.1 基于FSMD描述的按键防抖动电路 152
6.4.2 显性描述数据路径 153
6.4.3 隐含描述数据路径 156
6.5 设计举例 158
6.5.1 斐波纳契序列(Fibonacci Number)实现电路 158
6.5.2 频率检测器设计 162
6.5.3 除法电路设计 165
本章小结 169
思考与练习 169
第七章 数字电路设计原则与VerilogHDL难点解析 171
7.1 时序电路基础 171
7.1.1 同步电路的时序分析 173
7.1.2 异步电路和同步电路的区别 174
7.1.3 同步时序设计规则 175
7.2 异步电路中的同步处理方法 175
7.2.1 时钟的同步处理 175
7.2.2 接口电路处理 177
7.2.3 全局信号处理 182
7.3 阻塞赋值与非阻塞赋值 184
7.3.1 概述 185
7.3.2 组合逻辑电路中的赋值描述 186
7.3.3 时序电路赋值描述 187
7.3.4 时序电路中的混合赋值 188
7.4 优秀HDL代码风格 191
7.4.1 代码风格的含义 191
7.4.2 通用代码风格 191
7.4.3 Xilinx芯片专用代码风格 195
7.4.4 推荐时序电路描述代码风格 196
7.5 TestBench编写 199
7.5.1 基于HDL的TestBench编写 199
7.5.2 always和initial模块 199
7.5.3 顺序执行语句 200
7.5.4 时序控制语句 201
7.5.5 系统函数和任务 203
7.5.6 用户自定义函数和任务 208
7.5.7 TestBench举例 211
本章小结 218
思考与练习 218
第三篇 基于FPGA的接口开发 219
第八章 UART串口通信控制器 219
8.1 UART传输系统 219
8.2 UART接收模块设计 220
8.2.1 设计方案 220
8.2.2 波特率产生器 221
8.2.3 UART接收器 221
8.2.4 接口电路 225
8.3 UART发送模块设计 228
8.4 UART系统的总结 231
8.4.1 完整UART系统 231
8.4.2 UART验证电路 233
8.4.3 Windows的超级终端 234
8.4.4 定制UART 235
本章小结 236
思考与练习 236
第九章 PS/2键盘接口控制器 237
9.1 PS/2基础 237
9.1.1 PS/2端口的物理接口 237
9.1.2 PS/2接口主从设备通信协议 237
9.1.3 PS/2接收模块设计 238
9.2 PS/2键盘扫描设计 242
9.2.1 关于键盘扫描编码 242
9.2.2 按键扫描电路设计 243
9.3 PS/2键盘接口电路 246
9.3.1 接口电路设计 246
9.3.2 接口电路验证 248
本章小结 251
思考与练习 251
第十章 PS/2鼠标接口控制器 253
10.1 PS/2鼠标接口电路 253
10.1.1 关于鼠标 253
10.1.2 鼠标PS/2通信协议 253
10.1.3 初始化过程 254
10.2 PS/2传输子系统设计 254
10.2.1 主系统对PS/2设备的通信协议 254
10.2.2 设计与编码 255
10.3 PS/2鼠标数据传输系统 260
10.3.1 双向传输PS/2接口电路设计 260
10.3.2 双向传输PS/2验证电路 262
10.4 PS/2鼠标数据接口电路 265
10.4.1 传输PS/2接口电路设计 265
10.4.2 传输PS/2接口电路测试 268
本章小结 270
思考与练习 270
第十一章 RAM接口控制器 271
11.1 关于IS61LV25616AL SRAM 271
11.1.1 芯片介绍以及I/O接口 271
11.1.2 时序参数 272
11.2 基本存储控制器 274
11.2.1 设计框图 274
11.2.2 时序要求 276
11.2.3 存储器文件与SRAM的对比 276
11.2.4 设计安全性 276
11.2.5 ASMD状态机图 276
11.2.6 时序分析 277
11.2.7 HDL代码设计 278
11.2.8 基本测试电路 281
11.2.9 完整的SRAM测试电路 283
11.3 更加完善的设计 289
11.3.1 异步SRAM的时序信息 289
11.3.2 选择设计Ⅰ 290
11.3.3 选择设计Ⅱ 291
11.4 Xilinx Spartan-3内部存储器 292
11.4.1 概述 292
11.4.2 利用CoreGenerator定制嵌入式RAM模块 292
11.5 Xilinx嵌入式存储器例化举例 293
11.5.1 单端口RAM 293
11.5.2 双端口RAM 295
11.5.3 ROM 297
本章小结 299
思考与练习 299
第十二章 VGA图形图像显示控制器 301
12.1 CRT显示器原理 301
12.1.1 CRT显示的基本原理 301
12.1.2 视频显示基本术语 302
12.1.3 S3开发板上的VGA端口 303
12.1.4 VGA视频控制器 303
12.2 VGA同步电路 304
12.2.1 水平同步 304
12.2.2 垂直同步 305
12.2.3 HDL实现 306
12.2.4 测试电路 308
12.3 像素产生电路 309
12.3.1 矩形图形显示 311
12.3.2 非矩形目标显示 316
12.3.3 动态目标显示 317
12.4 位图显示方案 324
12.4.1 采用双端口RAM实现 324
12.4.2 采用单端口RAM实现 328
本章小结 328
思考与练习 329
第四篇 基于FPGA的软核微控制器PicoBlaze第十三章 基于XilinX FPGA的微处理器 331
13.1 PicoBlaze架构介绍 331
13.1.1 微处理器的应用 333
13.1.2 PicoBlaze处理器的特点 333
13.1.3 顶层HDL模型 335
13.1.4 设计流程 335
13.2 指令设置 336
13.2.1 编程模型 337
13.2.2 指令格式 337
13.2.3 逻辑指令 338
13.2.4 算术指令 339
13.2.5 比较和测试指令 339
13.2.6 移位和循环指令 340
13.2.7 数据传输指令 341
13.2.8 程序流程控制指令 342
13.2.9 中断相关指令 344
13.2.10 KCPSM3汇编宏命令 345
13.3 PicoBlaze文件结构 346
本章小结 349
思考与练习 349
第十四章 PicoBlaze汇编语言开发 350
14.1 PicoBlaze汇编基础 350
14.1.1 KCPSM3语法规定 350
14.1.2 位操作 350
14.1.3 多字节操作 351
14.1.4 常用控制语句结构的汇编语言描述 352
14.2 子程序开发 355
14.3 PicoBlaze汇编程序开发 356
14.3.1 开发流程 356
14.3.2 程序举例 357
14.3.3 说明文档与注释 363
14.4 PicoBlaze软件开发流程 365
14.4.1 使用KCPSM3编译 365
14.4.2 使用PBlazeIDE仿真 366
14.4.3 使用JTAG接口下载代码 369
14.4.4 代码综合 369
本章小结 371
思考与练习 371
第十五章 PicoBlaze接口开发 372
15.1 输出端口 372
15.1.1 输出指令和时序 372
15.1.2 输出接口 373
15.2 输入端口 375
15.2.1 输入指令和时序 375
15.2.2 输入接口 375
15.3 求平方和电路接口开发 377
15.3.1 输出接口 377
15.3.2 输入接口 379
15.3.3 汇编程序设计 380
15.3.4 HDL程序开发 389
本章小结 392
思考与练习 392
第十六章 PicoBlaze中断 393
16.1 PicoBlaze中断处理机制 393
16.1.1 软件中断处理过程 393
16.1.2 中断时序描述 394
16.2 外部中断接口 395
16.2.1 单个中断请求 395
16.2.2 多个中断请求 395
16.3 软件开发 396
16.3.1 中断处理主程序 396
16.3.2 中断服务程序 397
16.4 设计举例 397
16.4.1 中断接口 397
16.4.2 中断服务子程序开发 397
16.4.3 汇编程序开发 398
16.4.4 HDL代码开发 405
本章小结 409
思考与练习 409
参考文献 410