第一部分 基本数字电路 3
第1章 门级组合电路 3
1.1 简介 3
1.2 一般描述 3
1.3 基本词汇元素 5
1.4 数据类型 5
1.4.1 四值系统 5
1.4.2 数据类型分类 6
1.4.3 数字表示 6
1.4.4 运算符 7
1.5 程序结构 8
1.5.1 端口声明 8
1.5.2 程序体 9
1.5.3 信号声明 9
1.5.4 其他例子 10
1.6 结构描述 11
1.7 测试平台 14
1.8 文献备注 16
1.9 实验 17
1.9.1 编码 17
1.9.2 二进制解码器门级编码 17
第2章 FPGA及EDA软件概述 18
2.1 简介 18
2.2 FPGA 18
2.2.1 通用FPGA器件概述 18
2.2.2 Xilinx Spartan-3器件概述 19
2.3 Digilent S3开发板概述 20
2.4 开发流程 22
2.5 Xilinx ISE图形化界面概貌 24
2.6 ISE Project Navigator简明教程 26
2.6.1 创建工程和HDL代码 28
2.6.2 创建Testbench及执行RTL仿真 29
2.6.3 添加约束文件综合和实现代码 29
2.6.4 生成并下载配置文件至FPGA芯片 31
2.7 Modelsim HDL仿真器简明教程 34
2.8 文献备注 39
2.9 实验 39
2.9.1 门级大于电路 39
2.9.2 门级二进制译码器 39
第3章 寄存器传输级组合逻辑电路 41
3.1 引言 41
3.2 运算符 41
3.2.1 算术运算符 42
3.2.2 移位运算符 43
3.2.3 关系和等价运算符 43
3.2.4 按位运算符、缩减运算符和逻辑运算符 43
3.2.5 位拼接和复制运算符 44
3.2.6 条件运算符 45
3.2.7 运算符优先级 46
3.2.8 表达式位长度调整 46
3.2.9 z、x的综合 48
3.3 组合逻辑电路always块 49
3.3.1 基本语法和行为 50
3.3.2 顺序赋值语句 50
3.3.3 变量数据类型 51
3.3.4 简单示例 51
3.4 if语句 53
3.4.1 语法 53
3.4.2 示例 54
3.5 case语句 56
3.5.1 语法 56
3.5.2 示例 57
3.5.3 casez和casex语句 58
3.5.4 full case与parallel case 59
3.6 条件控制语句的布线结构 60
3.6.1 优先路由网络 60
3.6.2 多路选择网络 62
3.7 always块的通用编码准则 63
3.7.1 组合逻辑电路代码的常见错误 63
3.7.2 准则 67
3.8 参数和常量 67
3.8.1 常量 67
3.8.2 参数 69
3.8.3 Verilog-1995的参数使用 71
3.9 设计实例 72
3.9.1 7段LED数码管十六进制译码器 72
3.9.2 “符号—幅值”加法器 76
3.9.3 桶式移位器 79
3.9.4 简化的浮点加法器 81
3.10 文献备注 87
3.11 实验 87
3.11.1 多功能桶式移位器 87
3.11.2 双优先级编码器 88
3.11.3 BCD码增量器 88
3.11.4 浮点数大于比较电路 88
3.11.5 浮点数和有符号整型数转换电路 89
3.11.6 增强型浮点型加法器 89
第4章 常规时序电路 90
4.1 简介 90
4.1.1 D触发器和寄存器 90
4.1.2 同步系统 91
4.1.3 代码开发 92
4.2 触发器和寄存器的HDL代码 92
4.2.1 D触发器 93
4.2.2 寄存器 96
4.2.3 寄存器文件 97
4.2.4 Xilinx Spartan-3器件的存储元件 98
4.3 简单的设计举例 99
4.3.1 移位寄存器 99
4.3.2 二进制计数器及其转换形式 101
4.4 时序电路的测试平台 105
4.5 案例学习 109
4.5.1 LED分时复用电路 109
4.5.2 码表 118
4.5.3 FIFO缓冲器 122
4.6 文献备注 128
4.7 实验 128
4.7.1 可编程的方波生成器 128
4.7.2 PWM和LED调节器 128
4.7.3 旋转的方形图案电路 128
4.7.4 心跳电路 129
4.7.5 可轮换的LED标语电路 129
4.7.6 增强的码表 129
4.7.7 栈 130
第5章 有限状态机 131
5.1 引言 131
5.1.1 Mealy输出和Moore输出 131
5.1.2 有限状态机表示方法 132
5.2 状态机编码设计 134
5.3 设计举例 137
5.3.1 上升沿检测器 137
5.3.2 去抖电路 143
5.3.3 测试电路 147
5.4 文献备注 149
5.5 参考实验 150
5.5.1 双沿检测器 150
5.5.2 另一种去抖电路 150
5.5.3 停车场占用计数器 150
第6章 带数据路径的有限状态机 152
6.1 简介 152
6.1.1 单个RT操作 152
6.1.2 ASMD图 153
6.1.3 带寄存器的判决盒 154
6.2 FSMD的代码开发 156
6.2.1 基于RT方法学的去抖电路 156
6.2.2 带有数据路径元件的编码 157
6.2.3 带有隐含数据路径元件的编码 161
6.2.4 对比 163
6.2.5 测试电路 165
6.3 设计实例 167
6.3.1 斐波纳契数电路 167
6.3.2 除法电路 171
6.3.3 二进制向BCD码转换电路 175
6.3.4 周期计数器 180
6.3.5 精确的低频计数器 184
6.4 文献备注 188
6.5 实验 188
6.5.1 另一种去抖电路 188
6.5.2 BCD码向二进制码转换电路 188
6.5.3 带有BCD I/O的斐波纳契电路:设计方法Ⅰ 188
6.5.4 带有BCD I/O的斐波纳契电路:设计方法Ⅱ 189
6.5.5 尺度自适应的低频计数器 189
6.5.6 反应定时电路 190
6.5.7 巴贝奇差分引擎模拟电路 191
第7章 Verilog相关的话题 192
7.1 阻塞和非阻塞 192
7.1.1 概述 192
7.1.2 组合逻辑电路 194
7.1.3 存储元件 196
7.1.4 时序电路使用阻塞和非阻塞赋值 197
7.2 另外一种时序电路代码风格 200
7.2.1 二进制计数器 200
7.2.2 FSM 203
7.2.3 FSMD 204
7.2.4 总结 207
7.3 使用有符号数据类型 208
7.3.1 概述 208
7.3.2 Verilog-1995中的有符号数 209
7.3.3 Verilog-2001中的有符号数 210
7.4 在综合中使用函数 211
7.4.1 概述 211
7.4.2 举例 212
7.5 用于测试平台开发的额外结构 214
7.5.1 always和initial块 214
7.5.2 程序语句 215
7.5.3 时序控制 217
7.5.4 延时控制 217
7.5.5 事件控制 218
7.5.6 wait语句 218
7.5.7 timescale指令 219
7.5.8 系统函数和任务 219
7.5.9 自定义函数和任务 224
7.5.10 复杂测试平台示例 226
7.6 文献备注 234
7.7 实验 234
7.7.1 使用阻塞和非阻塞赋值的移位寄存器 234
7.7.2 BCD计数器的另一种代码风格 235
7.7.3 FIFO缓冲器的另一种代码风格 236
7.7.4 斐波纳契数电路的另一种代码风格 236
7.7.5 双模式比较器 236
7.7.6 增加的二进制监视器 236
7.7.7 FIFO缓冲器测试平台 236
第二部分 I/O模块 239
第8章 UART 239
8.1 引言 239
8.2 UART接收子系统 240
8.2.1 过采样步骤 240
8.2.2 波特率产生器 241
8.2.3 UART接收端 241
8.2.4 接口电路 245
8.3 UART发送子系统 248
8.4 UART总系统简述 252
8.4.1 完整的UART核 252
8.4.2 UART验证配置 254
8.5 定制一个UART 257
8.6 文献备注 258
8.7 实验 258
8.7.1 具备所有特征的UART 258
8.7.2 拥有波特率自动检测功能的UART 258
8.7.3 拥有波特率校验位自动检测功能的UART 259
8.7.4 UART控制的秒表 259
8.7.5 UART控制的LED标语 260
第9章 PS2键盘 261
9.1 引言 261
9.2 P32接收子系统 261
9.2.1 PS2端口的物理层接口 261
9.2.2 设备到主机的通信协议 262
9.2.3 设计和代码 262
9.3 PS2键盘的扫描码 266
9.3.1 扫描码概述 266
9.3.2 扫描码监听电路 267
9.4 PS2键盘接口电路 271
9.4.1 基本设计与HDL代码 271
9.4.2 验证电路 274
9.5 文献备注 277
9.6 实验 277
9.6.1 可选的键盘接口Ⅰ 277
9.6.2 可选的键盘接口Ⅱ 277
9.6.3 带看门狗定时器的PS2接收子系统 277
9.6.4 键盘控制的秒表 278
9.6.5 键盘控制的移动LED横幅 278
第10章 PS2鼠标 279
10.1 引言 279
10.2 PS2鼠标协议 279
10.2.1 基本操作 279
10.2.2 基本的初始化程序 280
10.3 PS2传输子系统 281
10.3.1 主机到PS2设备的通信协议 281
10.3.2 设计和代码 282
10.4 双向的PS2接口 288
10.4.1 基本设计和代码 288
10.4.2 确认电路 289
10.5 PS2鼠标接口 293
10.5.1 基本设计 293
10.5.2 测试电路 297
10.6 文献备注 298
10.7 实验 298
10.7.1 键盘控制电路 298
10.7.2 增强的鼠标接口 299
10.7.3 鼠标控制7段LED显示器 299
第11章 外部SRAM 300
11.1 引言 300
11.2 IS61LV25616AL SRAM的特性 300
11.2.1 Block示意图和I/0信号 300
11.2.2 时序参数 302
11.3 基础存储控制器 304
11.3.1 Block示意图 304
11.3.2 时序需求 306
11.3.3 SRAM的寄存器文件 307
11.4 安全设计 307
11.4.1 ASMD图 307
11.4.2 时序分析 308
11.4.3 HDL编码(执行) 309
11.4.4 基础测试电路 313
11.4.5 全面的SRAM测试电路 316
11.5 更主流的设计 322
11.5.1 时序问题 322
11.5.2 可选设计Ⅰ 323
11.5.3 可选设计Ⅱ 325
11.5.4 可选设计Ⅲ 326
11.5.5 Xilinx公司的高级FPGA特点 327
11.6 文献备注 328
11.7 实验 328
11.7.1 512K×16配置的存储器 328
11.7.2 1M×8配置的寄存器 329
11.7.3 8M×1配置的存储器 329
11.7.4 扩展存储器实验电路 329
11.7.5 存储控制器和可选设计Ⅰ的测试电路 329
11.7.6 存储控制器和可选设计Ⅱ的测试电路 329
11.7.7 存储控制器和可选设计Ⅲ的测试电路 329
11.7.8 DCM的存储控制器 330
11.7.9 高性能存储控制器 330
第12章 XilinxSpartan-3特殊存储器 331
12.1 简介 331
12.2 Spartant-3设备的嵌入式存储器 331
12.2.1 摘要 331
12.2.2 对照 332
12.3 合并存储器模块的方法 332
12.3.1 元件例化产生的存储器模块 332
12.3.2 核生成器产生的存储器模块 334
12.3.3 通过HDL生成的存储器模块 334
12.4 存储器相关的HDL模板 334
12.4.1 单口RAM 335
12.4.2 双口RAM 338
12.4.3 ROM 340
12.5 文献备注 342
12.6 实验 343
12.6.1 基于块RAM的FIFO 343
12.6.2 基于块RAM的栈 343
12.6.3 基于ROM的大量信号地址 343
12.6.4 基于ROM的sin(x)函数 343
12.6.5 基于ROM的sin(x)和cos(x)函数 344
第13章 VGA控制器Ⅰ:图形 345
13.1 简介 345
13.1.1 CRT的基本工作方式 345
13.1.2 S3板上的VGA端口 346
13.1.3 视频控制器 347
13.2 VGA同步 348
13.2.1 水平同步 348
13.2.2 垂直同步 349
13.2.3 VGA同步信号的时序计算 350
13.2.4 HDL实现 351
13.2.5 测试电路 354
13.3 像素生成电路概述 355
13.4 使用对象映射图的图像生成 356
13.4.1 矩阵对象 357
13.4.2 非矩阵对象 362
13.4.3 活动的对象 364
13.5 位图映射的图像生成 372
13.5.1 双口RAM实现 373
13.5.2 单口RAM实现 378
13.6 文献备注 379
13.7 实验 379
13.7.1 VGA测试图案发生器 379
13.7.2 SVGA模式同步电路 379
13.7.3 可视化屏幕调整电路 380
13.7.4 箱子里球的电路 380
13.7.5 箱子里两个球的电路 380
13.7.6 两个游戏者的游戏 380
13.7.7 越狱游戏 380
13.7.8 全屏圆点轨迹 381
13.7.9 鼠标指针电路 381
13.7.10 小屏幕内鼠标轨迹电路 381
13.7.11 全屏幕鼠标轨迹电路 382
第14章 VGA控制器Ⅱ:示例 383
14.1 简介 383
14.2 举例 383
14.2.1 点阵的特性 383
14.2.2 字体ROM 384
14.2.3 基本文本生成电路 386
14.2.4 字体显示电路 387
14.2.5 字体缩放比例 390
14.3 全屏文本显示 391
14.4 完整的乒乓游戏设计 396
14.4.1 文本子系统 396
14.4.2 修正图像分系统 404
14.4.3 辅助计算器 406
14.4.4 顶层系统 408
14.5 文献备注 415
14.6 实验 415
14.6.1 旋转旗帜 415
14.6.2 指针的下划线 415
14.6.3 双模式文本显示 415
14.6.4 键盘文本输入 415
14.6.5 UART终端 416
14.6.6 方波显示 416
14.6.7 简单的四路逻辑分析器 416
14.6.8 完整的双人乒乓游戏 417
14.6.9 完整的通关游戏 417
第三部分 PicoBlaze微控制器 421
第15章 PicoBlze概述 421
15.1 简介 421
15.2 定制硬件和软件 421
15.2.1 从专用FSMD到通用微控制器 421
15.2.2 微控制器的应用 423
15.3 PicoBlaze概述 424
15.3.1 基本组成 424
15.3.2 顶层HDL模块 425
15.4 开发流程 426
15.5 指令集 428
15.5.1 编程模式 428
15.5.2 指令格式 429
15.5.3 逻辑指令 429
15.5.4 算术指令 430
15.5.5 比较和检验指令 431
15.5.6 移位和循环指令 432
15.5.7 数据传输指令 434
15.5.8 程序控制指令 436
15.5.9 中断指令 440
15.6 伪指令声明指令 441
15.6.1 KCPSM3汇编伪指令 441
15.6.2 PBlazeIDE汇编伪指令 441
15.7 文献备注 442
第16章 PicoBlaze汇编语言开发 443
16.1 简介 443
16.2 有效的代码表 443
16.2.1 KCPSM3协议 443
16.2.2 比特操作 443
16.2.3 多字节数据处理 445
16.2.4 控制结构 446
16.3 子程序开发 449
16.4 编程 450
16.4.1 示例 451
16.4.2 程序文件 457
16.5 汇编代码处理 459
16.5.1 KCSPM3编译 460
16.5.2 PBlazeIDE仿真 460
16.5.3 JTAG重载 463
16.5.4 PBlazeIDE编译 463
16.6 PicoBlaze综合 464
16.7 文献备注 466
16.8 实验 466
16.8.1 有符号数乘法运算 466
16.8.2 多字节乘法运算 466
16.8.3 循环位移功能 466
16.8.4 高低位互置功能 466
16.8.5 二进制码至BCD码转换 466
16.8.6 BCD码至二进制码转换 467
16.8.7 心跳电路 467
16.8.8 旋转闪亮LED电路 467
16.8.9 离散LED调光器 467
第17章 PicoBlaze I/O接口 468
17.1 简介 468
17.2 输出端口 468
17.2.1 output指令及时序 468
17.2.2 输出接口 469
17.3 输入端口 479
17.3.1 输入指令和时序 472
17.3.2 输入接口 472
17.4 包括开关输入和7段LED显示接口的二次方计算程序 474
17.4.1 输出接口 475
17.4.2 输入接口 476
17.4.3 集成代码开发 478
17.4.4 HDL代码开发 488
17.5 结合组合乘法器和UART控制器的乘法程序 492
17.5.1 乘法器接口 492
17.5.2 UART接口 493
17.5.3 汇编代码开发 494
17.5.4 HDL代码开发 508
17.6 文献备注 512
17.7 实验 512
17.7.1 低频计数器Ⅰ 512
17.7.2 低频计数器Ⅱ 513
17.7.3 自适应低频计数器 513
17.7.4 利用软件定时器替代基础反应定时器 513
17.7.5 包含硬件定时器的反应定时器 513
17.7.6 增强型反应定时器 513
17.7.7 小屏幕鼠标跟踪电路 514
17.7.8 全屏幕鼠标跟踪电路 514
17.7.9 增强型跑马灯字幕 514
17.7.10 乒乓游戏 514
17.7.11 文本编程器 514
第18章 PicoBlaze中断接口 515
18.1 简介 515
18.2 PicoBlaze里的中断操作 515
18.2.1 软件处理 515
18.2.2 时序图 517
18.3 外部接口 517
18.3.1 中断请求信号 517
18.3.2 多重中断请求 518
18.4 软件发展描述 519
18.4.1 中断作为一个可选择的计划方案 519
18.4.2 中断服务程序的发展 519
18.5 设计用例 520
18.5.1 接口中断 520
18.5.2 中断服务程序的发展 521
18.5.3 集成代码的发展 521
18.5.4 HDL代码的发展 524
18.6 文献备注 528
18.7 实验 528
18.7.1 可选择的计时器中断服务程序 528
18.7.2 可编程的计时器 529
18.7.3 设置按钮中断服务程序 529
18.7.4 两个请求的中断服务程序 529
18.7.5 4个请求的中断控制器 529
附录 Verilog举例 531
A.1 数值和运算符 531
A.1.1 有符号数和无符号数 531
A.1.2 运算符 531
A.2 一般的Verilog构造 532
A.2.1 全部代码的组成 532
A.2.2 例化部分 534
A.3 条件运算符操作以及if和case语句 535
A.3.1 条件运算符操作和if语句 535
A.3.2 case语句 536
A.4 用always过程块组成的电路 537
A.4.1 过程块无默认输出值 537
A.4.2 过程块输出有默认值 538
A.5 寄存组成 538
A.5.1 寄存器模板 538
A.5.2 寄存器文件 539
A.6 时序电路 540
A.7 有限状态机 541
A.8 有限状态机数据 544
A.9 S3开发板的约束文件S3.UCF 547
参考文献 552