第一篇 Verilog HDL语言设计基础篇 2
第1章 Verilog HDL语言设计入门 2
1.1 HDL发展概述 2
1.2 与VHDL和C语言的比较 3
1.3 Verilog HDL语言开发流程 9
1.3.1 Verilog HDL语言开发流程图介绍 9
1.3.2 常用EDA开发工具介绍 10
1.4 Verilog HDL程序的基本结构 14
1.4.1 模块 14
1.4.2 模块调用 23
第2章 Verilog HDL语言要素与表达式 25
2.1 程序格式 25
2.2 注释 25
2.3 间隔符 25
2.4 数值 26
2.5 字符串 28
2.6 标识符 29
2.7 系统任务和函数 31
2.8 编译指令 36
2.9 数据类型 45
2.9.1 线网(Net)和变量(Variable) 45
2.9.2 标量(Scalar)与矢量(Vector) 47
2.9.3 线网(Net)数据类型 49
2.9.4 变量(Variable)数据类型 54
2.9.5 数组(Array)类型 55
2.9.6 参数 57
2.9.7 名字空间 60
2.10 表达式 61
2.10.1 操作符 62
2.10.2 操作数 73
2.10.3 延迟表达式 76
2.10.4 表达式的位宽 77
2.10.5 有符号表达式 80
第3章 行为级建模 82
3.1 行为级建模的结构 82
3.1.1 过程块结构 84
3.1.2 initial过程块 85
3.1.3 always过程块 87
3.2 语句块 90
3.2.1 顺序语句块(begin-end) 90
3.2.2 并行语句块(fork-join) 92
3.2.3 顺序块和并行块的混合使用 93
3.3 时间控制 96
3.3.1 延时控制 97
3.3.2 边沿触发事件控制 98
3.3.3 电平敏感事件控制(wait语句) 104
3.4 赋值语句 106
3.4.1 过程赋值语句 107
3.4.2 阻塞型赋值语句和非阻塞型赋值语句 111
3.4.3 连续赋值语句和过程连续赋值语句 117
3.5 分支语句 127
3.5.1 if-else条件分支语句 128
3.5.2 case分支控制语句 132
3.6 循环控制语句 137
3.6.1 forever循环语句 137
3.6.2 repeat循环语句 138
3.6.3 while循环语句 140
3.6.4 for循环语句 141
3.7 任务(task)和函数(function) 143
3.7.1 任务(task) 143
3.7.2 函数(function) 147
第4章 结构级建模 153
4.1 模块级建模 154
4.1.1 模块的定义 154
4.1.2 模块的端口 155
4.1.3 模块的调用 158
4.1.4 在模块调用时对参数值的更改 164
4.2 门级建模 167
4.2.1 内置基本门级元件 168
4.2.2 用户自定义基本元件(UDP) 180
第5章 时序状态机的设计入门与提高 190
5.1 有限状态机(FSM)的分类 190
5.1.1 米利(Mealy)机 191
5.1.2 摩尔(Moore)机 191
5.2 有限状态机常用的描述、开发方法 191
5.3 基于状态转移图(STG)的设计 192
5.3.1 设计要点 192
5.3.2 建模实例 193
5.4 基于算法状态机(ASM)图的设计 199
5.4.1 算法状态机图 199
5.4.2 算法状态机和数据通道图 200
第二篇 Verilog HDL语言综合原理篇 206
第6章 综合的基本知识 206
6.1 综合的概念 206
6.2 数值集合与数据类型 208
6.3 储值单元的综合原则 209
第7章 Verilog HDL语句的综合 211
7.1 连续赋值(Continuous Assignment)语句的综合 211
7.2 过程赋值(Procedural Assignment)语句的综合 212
7.2.1 阻塞赋值语句 212
7.2.1 非阻塞赋值语句 213
7.3 逻辑运算符的综合 214
7.4 算术运算符的综合 215
7.4.1 无符号运算 215
7.4.2 有符号运算 215
7.4.3 进位与位宽 216
7.5 关系运算符(relational operator)的综合 216
7.6 移位(shift)运算符综合 218
7.7 位选择(bit-selects)综合 219
7.8 条件表达式的综合 220
7.9 always语句的综合 221
7.10 if语句的综合 224
7.11 case语句的综合 225
7.11.1 从case语句综合出锁存器 226
7.11.2 casez和casex语句的综合 230
7.11.3 并行的case语句 232
7.11.4 条件表达式使用常量的case语句 234
7.12 关于锁存器的综合 235
7.13 循环语句的综合 239
7.13.1 静态循环的综合 239
7.13.2 非静态循环的综合 241
7.14 触发器的建模 242
7.14.1 反相时钟 243
7.14.2 异步复位、置位 244
7.14.3 同步置位、复位 246
7.15 阻塞和非阻塞赋值的深入讨论 247
7.16 函数的综合 250
7.17 任务的综合 251
7.18 值x(任意值)、z(高阻)的综合 252
第8章 常用模块的建模实例 256
8.1 组合逻辑的建模 256
8.2 时序逻辑的建模 258
8.3 计数器建模 259
8.3.1 二进制计数器 259
8.3.2 Gray码计数器 260
8.3.3 Johnson计数器 262
8.4 多路开关建模 263
8.5 译码器建模 264
8.6 移位寄存器建模 266
8.6.1 通用移位寄存器 266
8.6.2 桶形移位寄存器 267
8.7 存储器建模 268
8.8 ALU单元建模 269
8.9 加法器建模 271
第9章 建模优化 273
9.1 资源共享 273
9.2 公共子表达式 276
9.3 代码调整 277
9.4 公因子 278
9.5 触发器和锁存器的优化 280
9.6 代码大小 282
9.7 算术表达式树高度优化 282
9.8 运算符强度缩减 284
第10章 设计验证 286
10.1 后综合设计验证 287
10.1.1 基于仿真的验证 287
10.1.2 形式化验证 287
10.2 面向验证的编码风格 288
10.2.1 功能正确性 288
10.2.2 时序正确性 291
10.3 定时验证 292
10.4 时序分析基础 293
10.4.1 周期与最大时钟频率 293
10.4.2 时钟建立时间 294
10.4.3 时钟保持时间 294
10.4.4 时钟输出延时 295
10.4.5 引脚到引脚延时 295
10.5 定时验证的系统任务 295
第三篇 常用EDA开发工具篇 298
第11章 Quartus Ⅱ使用指南 298
11.1 Quartus Ⅱ简介 298
11.2 Quartus Ⅱ设计流程 299
11.3 Quartus Ⅱ设计方法 303
11.3.1 自上而下与自下而上的设计方法比较 303
11.3.2 自上而下渐进式编译设计流程 303
11.3.3 自下而上的渐进式编译流程 304
11.4 Quartus Ⅱ各功能详解 304
11.4.1 使用模块编辑器 304
11.4.2 项目设置 305
11.4.3 时序分析报告 307
11.4.4 仿真 308
11.4.5 下载 310
11.5 时序约束与分析 313
11.5.1 时序约束与分析基础 313
11.5.2 设置时序约束的方法 314
11.5.3 最小化时序分析 319
11.6 设计优化 320
11.6.1 优化流程 320
11.6.2 使用DSE 321
11.6.3 设计优化的初次编译 323
11.6.4 资源利用优化 325
11.6.5 I/O时序优化 327
11.6.6 最高时钟频率优化 328
11.7 SignalTap Ⅱ 329
11.7.1 设计中创建SignalTap Ⅱ 329
11.7.2 通过SignalTap Ⅱ察看数据 331
11.7.3 SignalTap Ⅱ的高级配置 332
第12章 ISE开发工具 334
12.1 ISE系统简介 334
12.2 ISE设计快速入门 335
12.2.1 ISE的安装 335
12.2.2 ISE应用入门 340
12.2.3 ISE的一般设计流程 343
12.3 工程管理与设计输入 348
12.3.1 ISE工程管理器 348
12.3.2 HDL语言的输入工具——HDL Editor 348
12.3.3 原理图输入工具——ECS 349
12.3.4 IP核生成工具——CORE Generator 350
12.3.5 测试激励生成器——HDL Bencher 353
12.4 ISE中综合工具介绍 355
12.4.1 Synplify/Synplify Pro综合工具 356
12.4.2 Synopsys综合工具 364
12.4.3 Xilinx内嵌的综合工具——XST 365
12.4.4 全局时钟与第二全局时钟资源 370
12.5 约束设置 371
12.5.1 时序约束 372
12.5.2 分组约束 372
12.5.3 约束编辑器 373
12.5.4 引脚与区域约束编辑器 375
12.5.5 约束文件 377
12.6 设计进阶 378
12.6.1 时序分析 378
12.6.2 布局规划 378
12.6.3 FPGA底层编辑 380
第13章 ModelSim开发工具 381
13.1 ModelSim简介 381
13.2 基本仿真步骤 381
13.2.1 建立ModelSim库 381
13.2.2 编译源代码 383
13.2.3 启动仿真器 384
13.2.4 执行仿真 384
13.3 ModelSim各界面介绍 385
13.3.1 Main窗口 385
13.3.2 Structure窗口 386
13.3.3 Source窗口 386
13.3.4 Signals窗口 387
13.3.5 Process窗口 387
13.3.6 Variables窗口 388
13.3.7 Dataflow窗口 389
13.3.8 Wave窗口 389
13.3.9 List窗口 390
13.4 ModelSim调试功能 390
13.4.1 监视信号 390
13.4.2 使用断点 393
第四篇 设计经验与技巧篇 396
第14章 优秀设计的经验与技巧指导 396
14.1 Verilog HDL语言的编码风格(Coding Style) 396
14.1.1命名习惯(Naming Conventions) 396
14.1.2 注释(comment) 397
14.1.3 代码风格 398
14.1.4 模块分割与复用 398
14.1.5 时钟与同步问题 404
14.1.6 通用编码技巧 406
14.1.7 面向综合的编程风格 406
14.2 同步复位与异步复位 410
14.2.1 触发器建模的通用原则 410
14.2.2 同步复位 412
14.2.3 异步复位 414
14.2.4 异步复位问题 415
14.2.5 复位同步电路 416
14.2.6 复位分配树 417
14.2.7 复位毛刺过滤 420
14.2.8 多时钟复位讨论 421
14.2.9 总结 422
14.3 设计异步多时钟系统的综合及描述技巧 422
14.3.1 亚稳态 422
14.3.2 多时钟系统同步 423
14.3.3 静态定时分析 424
14.3.4 时钟命名习惯 425
14.3.5 设计分割 425
14.3.6 综合脚本与时序分析 425
14.3.7 高速时钟信号到低速时钟域的同步 426
14.3.8 多控制信号的传递 427
14.3.9 数据通道同步 431
第五篇 Verilog HDL实例应用篇 434
第15章 各种加法器(减法器)设计 434
15.1 行波进位(Ripple-Carry)加法器 434
15.2 进位链(Carry-Chain)加法器 435
15.3 跳跃进位(Carry-Skip)加法器 438
第16章 常用乘法器设计 441
16.1 基本乘法器 441
16.2 时序乘法器 443
16.3 阵列乘法器 445
16.3.1 行波进位乘法器 445
16.3.2 进位存储乘法器 448
第17章 伽罗华域GF(q)乘法器设计 451
17.1 应用背景 451
17.2 理论算法 452
17.2.1 有限域元素的弱对偶基表示 452
17.2.2 有限域元素的乘法 453
17.2.3 最优弱对偶基 453
17.3 基于弱对偶基的有限域比特并行乘法器建模 454
17.3.1 多项式基到弱对偶基坐标变换 455
17.3.2 弱对偶基系数扩展 456
17.3.3 乘法模块 456
17.3.4 弱对偶基到多项式基坐标变换 457
17.4 弱对偶基有限域乘法器程序说明 458
第18章 常用除法器设计 461
18.1 二进制恢复除法器 461
18.2 时序除法器设计 464
第19章 积分梳状滤波器(CIC)设计 468
19.1 应用背景 468
19.2 理论算法 469
19.3 三级CIC抽取滤波器建模 471
19.4 程序说明 473
第20章 CORDIC数字计算机的设计 476
20.1 应用背景 476
20.2 理论算法 477
20.2.1 计算正弦和余弦值 481
20.2.2 极坐标到直角坐标的变换 481
20.2.3 反正切函数与向量的模 482
20.2.4 笛卡儿坐标到极坐标的变换 482
20.2.5 反正弦和反余弦函数 482
20.2.6 线性函数 483
20.2.7 双曲线函数 484
20.3 用CORDIC计算正、余弦值实例建模 487
20.4 程序说明 489
第21章 伪随机序列应用设计 492
21.1 应用背景 492
21.2 理论知识 493
21.2.1 伪随机信号特性 493
21.2.2 线性反馈移位寄存器 495
21.3 PN序列应用实例 495
21.4 程序说明 496
第22章 异步FIFO设计 499
22.1 FIFO“空”/“满”检测 499
22.1.1 Gray码计数器 499
22.1.2 FIFO“空”/“满”状态 500
22.2 FIFO模块结构 501
22.3 FIFO源代码说明 502
22.3.1 顶层模块 502
22.3.2 双端口RAM模块 503
22.3.3 异步比较器模块 504
22.3.4 读指针与“空”逻辑模块 505
22.3.5 写指针与“满”逻辑模块 505
22.4 异步FIFO的相关问题 506
22.4.1 FIFO的复位 506
22.4.2 FIFO关键时序路径 506
第23章 RS(204,188)译码器的设计 508
23.1 应用背景 508
23.2 理论算法 509
23.2.1 Reed-Solomon码基本概念 510
23.2.2 RS译码与关键方程 511
23.2.3 BM及其改进算法求解关键方程 513
23.2.4 Chien搜索和Forney算法 515
23.3 RS(204,188)译码器建模 516
23.3.1 伴随式计算模块 516
23.3.2 改进的BM算法模块 517
23.3.3 Chien搜索模块 518
23.3.4 Forney算法模块 518
23.4 程序说明 521
附录A Verilog关键字 533
附录B Verilog运算符 535
附录C Verilog系统任务与函数 540