本书讲述了自20世纪90年代开始在美国和其他先进的工业国家逐步推广的利用硬件描述语言(Verilog HDL)建模、仿真和综合的设计复杂数字逻辑电路与系统的方法和技术。本书从算法和计算的基本概念出发,把复杂的算法逐步分解成简单的操作步骤,讲述最终如何由硬线逻辑电路来实现复杂的数字逻辑系统。
全书共分四部分,另加一个附录。第一部分为初级篇,共8讲;第二部分为中级篇,共10讲;第三部分为实践篇,共12个实验例选。最后一部分是 Verilog 硬件描述语言参考手册,即语法篇,供学习、查询之用。
书中突破传统的章节结构,以“学时”为单位,以“讲授”为形式,将Verilog HDL知识由浅入深、由简单到复杂、由典型到一般的循序渐进方法,一步步地传授给读者,使大学电子类及计算机工程类本科及研究生,以及相关领域的设计工程人员可以从中掌握Verilog HDL技术,把我国的IC设计、复杂数字系统设计推向一个全新的高度。
本书可作为电子工程类、自动控制类、计算机类的大学本科高年级及研究生教学用书,亦可供其他工程人员自学与参考。
第一部分 初级篇第一讲Verilog的基本知识
第一讲 Verilog的基本知识
1.1 硬件描述语言HDL1
1.2 Verilog HDL的历史2
1.2.1 什么是Verilog HDL2
1.2.2 Verilog HDL的产生及发展2
1.3 Verilog HDL和VHDL的比较3
1.4 Verilog 目前的应用情况和适用的设计4
1.5 采用Verilog HDL设计复杂数字电路的优点5
1.5.1 传统设计方法——电路原理图输入法5
1.5.2 Verilog HDL设计法与传统的电路原理图输入法的比较5
1.5.3 Verilog 的标准化与软核的重用5
1.5.4 软核. 固核和硬核的概念以及它们的重用6
1.6 Verilog HDL的设计流程简介6
1.6.1 自顶向下(TopDown)设计的基本概念6
1.6.2 层次管理的基本概念7
1.6.3 具体模块的设计编译和仿真的过程7
1.6.4 对应具体工艺器件的优化. 映象和布局布线7
1.7 小结8
思 考 题9
第二讲 Verilog语法的基本概念
概述10
2.1 Verilog模块的基本概念11
2.2 Verilog用于模块的测试13
2.3 小结15
思 考 题15
第三讲 常用Verilog语法之一
概述17
3.1 模块的结构17
3.1.1 模块的端口定义17
3.1.2 模块内容18
3.1.3 理解要点19
3.1.4 要点总结19
3.2 数据类型及其常量及变量20
3.2.1 常量20
3.2.2 变量23
3.3 运算符及表达式25
3.3.1 基本的算术运算符26
3.3.2 位运算符26
3.4 小结28
思 考 题28
第四讲 常用Verilog语法之二
概述29
4.1 逻辑运算符29
4.2 关系运算符30
4.3 等式运算符30
4.4 移位运算符31
4.5 位拼接运算符31
4.6 缩减运算符32
4.7 优先级别32
4.8 关 键 词33
4.9 赋值语句和块语句33
4.9.1 赋值语句33
4.9.2 块语句35
4.10 小结38
思考题38
第五讲 常用Verilog语法之三
概述39
5.1 条件语句39
5.1.1 if_else语句39
5.1.2 case语句42
5.1.3 使用条件语句不当在设计中生成了原本没想到有的锁存器45
5.2 循环语句46
5.2.1 forever语句46
5.2.2 repeat语句46
5.2.3 while语句47
5.2.4 for语句47
5.3 小结49
思 考 题49
第六讲 常用Verilog语法之四
概述50
6.1 结构说明语句50
6.1.1 initial语句50
6.1.2 always语句51
6.2 task和function说明语句52
6.3 系统函数和任务56
6.4 小结60
思 考 题60
第七讲 常用Verilog语法之五
概述61
7.1 系统任务$monitor61
7.2 时间度量系统函数$time62
7.3 系统任务$finish63
7.4 系统任务$stop63
7.5 系统任务$readmemb和$readmemh64
7.6 系统任务 $random65
7.7 编译预处理66
7.7.1 宏定义 `define66
7.7.2 “文件包含”处理 `include68
7.7.3 时间尺度 `timescale71
7.7.4 条件编译命令`ifdef. `else. `endif73
7.8 小结73
思 考 题74
第八讲 常用Verilog语法总结
概述75
总结86
第二部分 中级篇
第一讲Verilog HDL模型的不同抽象级别
概述87
1.1 门级结构描述88
1.1.1 与非门. 或门和反向器及其说明语法88
1.1.2 用门级结构描述D触发器89
1.1.3 由已经设计成的模块构成更高一层的模块90
1.2 Verilog HDL的行为描述建模91
1.2.1 仅用于产生仿真测试信号的Verilog HDL行为描述建模91
1.2.2 Verilog HDL建模在TopDown设计中的作用和行为建模的可综合性问题94
1.3 用户定义的原语95
1.4 小结96
思 考 题96
第二讲 如何编写和验证简单的纯组合逻辑模块
概述97
2.1 加法器97
2.2 乘法器100
2.3 比较器102
2.4 多路器103
2.5 总线和总线操作105
2.6 流水线105
小结110
思 考 题110
第三讲 复杂数字系统的构成
概述111
3.1 运算部件和数据流动的控制逻辑111
3.1.1 数字逻辑电路的种类111
3.1.2 数字逻辑电路的构成111
3.1.3 数据在寄存器中的暂时保存113
3.1.4 数据流动的控制115
3.2 在Verilog HDL设计中启用同步时序逻辑117
思 考 题119
第四讲 同步状态机的原理. 结构和设计
概述120
4.1 状态机的结构120
4.2 Mealy状态机和Moore状态机的不同点121
4.3 如何用Verilog来描述可综合的状态机122
4.3.1 用可综合Verilog模块设计状态机的典型办法122
4.3.2 用可综合的Verilog模块设计. 用独热码表示状态的状态机123
4.3.3 用可综合的Verilog模块设计. 由输出指定的码表示状态的状态机125
4.3.4 用可综合Verilog模块设计复杂的多输出状态机时常用的方法126
思 考 题128
第五讲 设计可综合的状态机的指导原则
概述129
5.1 用Verilog HDL语言设计可综合的状态机的指导原则129
5.2 典型的状态机实例130
5.3 综合的一般原则132
5.4 语言指导原则132
5.5 可综合风格的Verilog HDL模块实例133
5.5.1 组合逻辑电路设计实例133
5.5.2 时序逻辑电路设计实例139
5.6 状态机的置位与复位142
5.6.1 状态机的异步置位与复位142
5.6.2 状态机的同步置位与复位143
小结145
思 考 题145
第六讲 深入理解阻塞和非阻塞赋值的不同
概述146
6.1 深入理解阻塞和非阻塞赋值的不同146
6.1.1 阻塞赋值147
6.1.2 非阻塞赋值148
6.2 Verilog模块编程要点148
6.3 Verilog的层次化事件队列149
6.4 自触发always块150
6.5 移位寄存器模型151
6.6 阻塞赋值及一些简单的例子154
6.7 时序反馈移位寄存器建模155
6.8 组合逻辑建模时应使用阻塞赋值157
6.9 时序和组合的混合逻辑——使用非阻塞赋值159
6.10 其他阻塞和非阻塞混合使用的原则160
6.11 对同一变量进行多次赋值161
6.12 常见的对于非阻塞赋值的误解162
6.13 小结164
思 考 题164
第七讲 较复杂时序逻辑电路设计实践
概述165
总结176
思 考 题176
第八讲 I2C总线接口模块的设计
概述177
总结200
思 考 题201
第九讲 简化的 RISC_CPU设计
概述202
9.1 课题的来由和设计环境介绍202
9.2 什么是CPU202
9.3 RISC_CPU结构203
9.3.1 时钟发生器205
9.3.2 指令寄存器207
9.3.3 累加器209
9.3.4 算术运算器209
9.3.5 数据控制器210
9.3.6 地址多路器211
9.3.7 程序计数器212
9.3.8 状态控制器213
9.3.9 外围模块218
9.4 RISC_CPU 操作和时序219
9.4.1 系统的复位和启动操作220
9.4.2 总线读操作220
9.4.3 写总线操作220
9.5 RISC_CPU寻址方式和指令系统221
9.6 RISC_CPU模块的调试 222
9.6.1 RISC_CPU模块的前仿真222
9.6.2 RISC_CPU模块的综合236
9.6.3 RISC_CPU模块的优化和布局布线245
小结250
思 考 题250
第十讲 虚拟器件. 虚拟接口模型及其在大型数字系统设计中的作用
概述251
10.1 软核和硬核. 宏单元及虚拟器件和接口 251
10.2 虚拟器件和虚拟接口模块的供应商252
10.3 虚拟模块的设计252
10.4 虚拟接口模块的实例256
小结305
思 考 题306
第三部分 实践篇
设计示范和上机习题概述
练习一简单的组合逻辑设计307
练习二简单分频时序逻辑电路的设计309
练习三利用条件语句实现计数分频时序电路311
练习四阻塞赋值与非阻塞赋值的区别313
练习五用always块实现较复杂的组合逻辑电路315
练习六在Verilog HDL中使用函数317
练习七在Verilog HDL中使用任务(task)319
练习八利用有限状态机进行时序逻辑的设计322
练习九利用状态机实现比较复杂的接口设计325
练习十通过模块实例调用实现大型系统的设计330
练习十一简单卷积器的设计336
练习十二利用SRAM设计一个FIFO359
第四部分 语法篇
关于Verilog HDL的说明
一. 关于 IEEE 1364标准369
二. Verilog简介370
三. 语法总结370
四. 编写Verilog HDL源代码的标准372
五. 设计流程374
Verilog硬件描述语言参考手册
一. Verilog HDL语句与常用标志符(按字母顺序排列)375
二. 系统任务和函数(System task and function)439
三. 常用系统任务和函数的详细使用说明444
四. Command Line Options 命令行的可选项454
数字信号处理(DSP)系统的研究人员一直在努力寻找各种优化的算法来解决相关的信号处理问题. 当他们产生了比较理想的算法思路后, 就在计算机上用C语言或其他语言程序来验证该算法, 并不断修改以期完善, 然后与别的算法作性能比较. 在现代通信和计算机系统中, 对于DSP算法评价最重要的指标是看它能否满足工程上的需要. 而许多工程上的需要都有实时响应的要求, 也就是说应需要数字信号处理(DSP)系统在限定的时间内, 如在几个ms甚至于几个μs内, 对所输入的大量数据完成相当复杂的运算, 并输出结果. 这时如果我们仅仅使用通用的微处理器, 即使是专用于信号处理的微处理器, 往往也无法满足实时响应的要求. 因此, 不得不设计专用的高速硬线逻辑来完成这样的运算. 设计这样的有苛刻实时要求的复杂的高速硬线运算逻辑是一件很有挑战性的工作, 即使有了好的算法而没有好的设计工具和方法也很难完成.
近30年来, 我国在复杂数字电路设计技术领域与国外的差距越来越大. 作为一名在大学讲授专用数字电路与系统设计课程的老师深深感到自己身上责任的重大. 我个人觉得, 我国在这一技术领域的落后与大学的课程设置和教学条件有关. 因为我们没有及时把国外最先进的设计技术介绍给学生, 也没有给他们创造实践的机会. 1995年我受学校和系领导的委托, 筹建世行贷款的电路设计自动化(EDA)实验室. 通过近10年的摸索. 实践, 我们逐步掌握了利用Verilog HDL设计复杂数字电路的仿真和综合技术. 在此期间我们为航天部等有关单位设计了13万门卫星信道加密用的复杂数字电路, 提供给他们经前后仿真验证的Verilog HDL源代码, 得到很高的评价. 在其后的几年中又为该单位设计了10万门卫星下行信道RS(255, 223)编码/解码电路和3万门卫星上行信道BCH(64, 56)编码/解码电路, 这几个项目已先后通过有关单位的验收. 1999年~2000年期间, 我们也为自己的科研项目——小波(Wavelet)图像压缩, 成功地设计了小波卷积器和改进的零修剪树算法(即SPIHT算法)的RTL级 Verilog HDL模型, 不但成功地对该模型进行了仿真和综合, 而且制成的可重新配置硬线逻辑(采用ALTERA FLEX10K系列CPLD/10/30/50各一片)的PCI线路板, 能完成约2 000条C语句的程序才能完成的图像/解压缩算法. 运算结果与软件完成的完全一致, 而且速度比用Pentium Ⅱ 333 MHz CPU的PC机更快, 而PCI线路板上基本时钟仅为8.33 MHz. 近年来由我协助指导的JPEG 2000算法硬线逻辑的前端设计, 在清华同行的努力下已完成FPGA验证并开始进入投片验证阶段. 可见这种新的设计方法的潜力. 本书是在1998年由北京航空航天大学出版社出版的《复杂数字电路与系统的Verilog HDL设计技术》和高教出版社出版的《从算法设计到硬线逻辑的实现》和《实验练习与Verilog语法手册》基础上全面修改和扩充而成, 是一本既有理论又有实践的设计大全. 由于教学. 科研和实验室的各项工作很忙, 我只能利用零碎时间, 一点一点地把积累的教学经验和新收集到的材料补充输入到计算机中并逐步加以整理. 因为我们使用Verilog HDL设计复杂数字逻辑电路总共也只有近10年的时间, 水平并不高, 书中谬误之处在所难免, 敬请读者及时把意见反馈给我. 我之所以在原出版基础上把这本书改版推出, 是想把我们在采用Verilog HDL设计方法上新积累的一些经验与读者分享, 把原教材中一些不足的地方作一补充和修改, 在大学生和研究生中加快Verilog HDL设计技术的推广, 尽快培养一批掌握先进设计技术的跨世纪的人才. 期望本书能在这一过程中起到抛砖引玉的作用.
回想起来, 这本书实质上是我们实验室全体老师和同学们的劳动成果, 其中在EDA实验室工作过的历届研究生和本科生张琰. 山岗. 王静璇. 田玉文. 冯文楠. 杨柳. 傅红军. 龚剑. 王书龙和胡瑛等都帮我做了许多工作, 如部分素材的翻译. 整理. 录入和一些 Verilog HDL模块的设计和验证. 而我做的工作只是收集了全书的素材. 翻译和理解素材中一些较难的概念并结合教学经验把它们编写成通顺的段落, 以及全书文稿最后的组织. 整理和补充, 使其达到能够出版的要求. 实验室的董金明和杨惠军老师也给了我许多帮助和鼓励. 特别是董金明老师一直以他努力工作的实际行动给我以最有力的鼓励和鞭策, 使我不能懈怠. 在本书出版之际, 我衷心地感谢在编写本书过程中所有给过我帮助和鼓励的老师和同学们.
编者
2003年1月30日
于北京航空航天大学逸夫科学馆EDA实验室