具体描述
内容简介
《FPGA/CPLD边练边学:快速入门Verilog/VHDL(第2版)》面向广大的FPGA/CPLD初学者,从零开始讲述可编程逻辑器件(FPGA/CPLD)以及相关的基础知识,并以一个入门级的学习套件为实验平台,12个应用实例贯穿其中,不仅有基本的verilog/VHDL语法讲解,而且有设计思路和背景知识的详细描述;手把手地将开发工具(QuartusII+ModelSim)的使用图文并茂地展示给读者。
《FPGA/CPLD边练边学:快速入门Verilog/VHDL(第2版)》中例程源程序可在北京航空航天大学出版社网站的“下载中心”免费下载。
《FPGA/CPLD边练边学:快速入门Verilog/VHDL(第2版)》内容重基础,文字诙谐幽默,适合广大FPGA/CPLD的学习者作为入门之选,也可作为具有一定专业知识背景的电子工程师、电子信息类在校本科生、研究生等的参考资料。
内页插图
目录
第1章 可编程器件发展简史与基本概念
1.1 可编程器件的由来与发展
1.2 FPGA/CPLD与Verilog/VHDL
1.3 设计方式与工具链
1.4 应用领域和发展趋势
第2章 实验平台板级设计
2.1 FPGA/CPLD板级电路设计五要素.
2.1.1 能量供应——电源电路
2.1.2 心脏跳动——时钟电路
2.1.3 状态初始——复位电路
2.1.4 灵活定制——配置电路
2.1.5 自由扩展——外设电路(I/O应用)
2.2 CPLD实验板DIY
2.2.1 读懂器件手册
2.2.2 CPLD核心电路设计
2.2.3 外设扩展电路设计
2.2.4 I/O引脚分配
第3章 数字电路基础
3.10和l——精彩世界由此开始
3.2 表面现象揭秘——逻辑关系
3.3 内里本质探索——器件结构
第4章 Verilog与vHDL语法基础
4.1 语法学习的经验之谈
4.2 可综合的语法子集
4.2.1 可综合的Verilog语法
4.2.2 可综合的VHDL浯法
4.3 代码风格与书写规范
4.3.1 代码书写规范
4.3.2 代码风格
第5章 第一个完整的工程实践案例
5.1 软件开发平台搭建
5.1.1 软件下载和License申请
5.1.2 Quartus II的安装
5.1.3 ModelSim的安装
5.2 基本开发流程概述
5.3 第一个工程实例
5.3.1 工程创建与设计输入
5.3.2 行为仿真
5.3.3 引脚分配与编译
5.3.4 门级仿真
5.3.5 板级调试
第6章 基础实验与拓展练习
6.1 基于时钟分频的PwM发生器
6.1.1 实验原理分析
6.1.2 Verilog参考实例
6.1.3 VHDL参考实例
6.1.4 仿真验证与板级调试
6.1.5 实验流程与注意事项
6.1.6 拓展练习
6.2 经典的按键消抖实例
6.2.1 实验原理分析
6.2.2 Verilog参考实例
6.2.3 VHDL参考实例
6.2.4 仿真验证与板级调试
6.2.5 实验流程与注意事项
6.2.6 拓展练习
6.3 基于Johnson计数器的流水灯实验
6.3.1 实验原理分析
6.3.2 Verilog参考实例
6.3.3 VHDL参考实例
6.3.4 仿真验证
6.3.5 实验流程与注意事项
6.3.6 拓展练习
6.4 数码管驱动显示实验
6.4.1 实验原理分析
6.4.2 Verilog参考实例
6.4.3 VHDL参考实例
6.4.4 仿真验证
6.4.5 实验流程与注意事项
6.4.6 拓展练习
6.5 乘法器设计实验
6.5.1 实验原理分析
6.5.2 Verilog参考实例
6.5.3 VHDL参考实例
6.5.4 仿真验证
6.5.5 实验流程与注意事项
6.5.6 拓展练习
6.6 VGA显示驱动实验
6.6.1 实验原理分析
6.6.2 Verilog参考实例
6.6.3 VHDL参考实例
6.6.4 仿真验证
6.6.5 实验流程与注意事项
6.6.6 拓展练习
6.7 UART串口收发实验
6.7.1 实验原理分析
6.7.2 Verilog参考实例
6.7.3 VHDL参考实例
6.7.4 仿真验证
6.7.5 实验流程与注意事项
6.7.6 拓展练习
6.8 PS/2键盘解码实验
6.8.1 实验原理分析
6.8.2 Verilog参考实例
6.8.3 VHDL参考实例
6.8.4 仿真验证
6.8.5 实验流程与注意事项
6.8.6 拓展练习
6.9 基于Izc通信的EEPROM读/写实验
6.9.1 实验原理分析
6.9.2 Verilog参考实例
6.9.3 VHDL参考实例
6.9.4 仿真验证
6.9.5 实验流程与注意事项
6.9.6 拓展练习
6.10 SRAM读/写测试实验
6.10.1 实验原理分析
6.10.2 verilog参考实例
6.10.3 VHDL参考实例
6.10.4 仿真验证
6.10.5 实验流程与注意事项
6.10.6 拓展练习
第7章 器件资源应用实例
7.1 MAX II内部振荡时钟使用实例
7.2 MAX II的UFM模块使用实例
参考文献
前言/序言
2010年6月和2011年10月,笔者(网名:特权同学)先后出版了图书《深入浅出玩转FPGA》和《爱上FPGA开发——特权和你一起学NIOSII》。这两本书都受到了广大读者的好评,前者在一年内两次重印且于2013年7月推出了第2版;后者也成为了当年Altera公司所举办的大学年会上的指定赠书。此外,笔者也在著名电子网站EDNChina和ChinaAET(《电子技术应用》杂志和电子发烧友网站)建立了专门的FPGA/CPLD助学小组,分享大量的学习资料,也提供了一些帮助初学者快速入门和进阶的开发套件。
1.为什么写这本书
FPGA技术在国内的发展相对较晚,但FPGA强大的功能,其固有的灵活性和并行性使得很多应用场合非它不可。因此,越来越多的电子工程师和电子专业在校学生都希望能够掌握这门技术。笔者经常收到读者或者开发套件使用者的邮件,所提问题五花八门,笔者虽然尽力答复大家,但着实有些难以招架。其中很大一部分初学者的问题都非常简单和基础,鉴于此,笔者在对这些不断重复的问题的回答过程中,也萌生了写一本基础的FPGA入门教程的想法。2.本书的侧重点和读者对象由于笔者已经出版的两本书中,《深入浅出玩转FPGA(第2版)》重点在FPGA设计的经验和技巧的分享,《爱上FPGA开发——特权和你一起学NIOSII》重点在片上系统的入门开发,因此,你所见到的现在这本书,它的重点则是HDL语法的掌握、软件工具(主要是QuartusII+ModelSim)的使用以及整个开发流程的体验。可以说,它是前面两本书的基础。
需要提醒读者注意的是,本书是基于一个CPLD学习套件来设计各种基本入门例程的。很多人会嗤之以鼻,这不是偷换概念吗?非也,FPGA和CPLD的区别笔者不想过多讨论,仁者见仁智者见智;笔者认为FPGA和CPLD在代码设计、工具使用和流程上几乎是一致的,虽然略有差别。
电子设计的基石:数字逻辑与硬件描述语言探索之旅 在日新月异的电子技术浪潮中,FPGA(Field-Programmable Gate Array)和CPLD(Complex Programmable Logic Device)作为可编程逻辑器件的代表,扮演着越来越重要的角色。它们赋予了电子工程师前所未有的灵活性和强大的设计能力,使得复杂数字系统的实现成为可能。然而,对于初学者而言,如何快速有效地掌握FPGA/CPLD的设计精髓,尤其是深入理解并熟练运用Verilog和VHDL这两种主流硬件描述语言(HDL),往往是一道不小的门槛。 本书并非直接教授特定的FPGA/CPLD开发板或某一款具体器件的精细操作,而是聚焦于构建坚实的数字逻辑基础,并在此基础上,系统地、循序渐进地引领您进入Verilog和VHDL的世界。我们相信,牢固的理论基础和对语言本质的深刻理解,才是征服任何硬件平台、任何复杂设计的关键。因此,本书将着力于为您打下坚实的理论根基,让您在面对实际项目时,能够游刃有余,而非被细节束缚。 第一部分:重塑数字逻辑思维——从基础到电路 在深入硬件描述语言之前,我们必须先建立起清晰、准确的数字逻辑概念。这一部分将带领您重新审视和巩固数字逻辑设计的核心原理。 二进制世界的奥秘: 我们将从最基本的二进制数制讲起,阐述其在数字系统中的重要性。您将学习如何进行二进制数的表示、转换,以及二进制运算(如加法、减法)的基本原理,为后续的逻辑门运算打下基础。 逻辑门:数字世界的“原子”: 了解并掌握各种基本逻辑门(AND, OR, NOT, XOR, NAND, NOR)的逻辑功能、真值表以及它们在电路图中的符号表示。我们将深入探讨这些逻辑门如何组合,实现更复杂的逻辑功能。 布尔代数:逻辑设计的数学语言: 布尔代数是数字逻辑设计的数学基础。您将学习布尔代数的基本定理和定律,如交换律、结合律、分配律、德摩根定律等。掌握这些定律,能够帮助您对逻辑表达式进行化简,优化电路设计,减少器件数量。 组合逻辑电路:输出只取决于当前输入: 这一章将聚焦于组合逻辑电路的设计。您将学习如何从逻辑功能需求出发,通过真值表、卡诺图等方法,设计出实现特定功能的组合逻辑电路,例如编码器、译码器、多路选择器(MUX)、数据选择器(DEMUX)、加法器、减法器等。我们将详细解析这些典型组合逻辑电路的设计思路和实现方式。 时序逻辑电路:状态的记忆与演变: 与组合逻辑不同,时序逻辑电路的输出不仅取决于当前输入,还与电路 past 的状态有关。您将了解触发器(Flip-Flop)的基本原理,如SR触发器、D触发器、JK触发器、T触发器,并理解它们如何作为存储单元,构建存储器和移位寄存器。 状态机:设计控制逻辑的核心: 状态机是设计复杂控制逻辑的强大工具。您将学习如何构建有限状态机(FSM),包括摩尔(Moore)型和米利(Mealy)型状态机。我们将通过实例演示如何将实际的控制需求抽象为状态转移图,并将其转化为具体的时序逻辑电路。 时钟与同步:数字系统的心跳: 时钟是数字系统正常运行的“心脏”。您将深入理解时钟信号的作用,以及同步设计的重要性。同步设计能够避免时序问题,确保电路的稳定性和可靠性。我们将探讨时钟沿(上升沿、下降沿)、时序约束(建立时间、保持时间)等关键概念。 第二部分:Verilog HDL——面向硬件的编程艺术 Verilog是一种广泛应用于数字系统设计的硬件描述语言。本部分将带领您逐步掌握Verilog的语法和编程范式,学会如何用代码来描述硬件。 Verilog基础:模块、端口与信号: 您将从Verilog的基本结构——模块(module)开始学习。了解模块的定义、端口(input, output, inout)的声明,以及如何声明不同类型的数据类型(wire, reg, integer等)。 行为级建模:描述电路的功能: 掌握Verilog的行为级建模方法,使用`always`块、`assign`语句等来描述电路的行为。您将学习如何使用逻辑运算符、算术运算符、位选择符、向量等来构建逻辑表达式。 结构级建模:实例化和连接: 学习如何通过实例化其他模块来构建层次化的设计。理解门级原语(如`and`, `or`)和用户自定义模块的实例化过程,以及如何通过连线(wire)来连接它们,实现“搭积木”式的设计。 过程赋值与组合/时序逻辑: 深入理解`assign`语句(用于组合逻辑)和`always`块(可用于组合或时序逻辑)的区别与联系。掌握在`always`块中使用不同的触发器(`posedge`, `negedge`, ``)来描述组合逻辑和时序逻辑。 参数化设计:提高代码的灵活性: 学习如何使用`parameter`关键字来定义参数,使得设计能够适应不同的配置和需求,增强代码的可重用性和灵活性。 数据流建模:另一种描述方式: 了解Verilog的数据流建模风格,使用`assign`语句和连续赋值来描述数据之间的转换关系,这对于某些类型的电路(如信号路径)非常直观。 运算符详解: 全面掌握Verilog中的各种运算符,包括逻辑运算符、位运算符、关系运算符、算术运算符、移位运算符、条件运算符等,了解它们在电路描述中的具体含义。 任务与函数:封装与复用: 学习如何定义任务(task)和函数(function),将重复的代码逻辑封装起来,提高代码的可读性和可维护性。理解任务和函数在描述行为上的差异。 时序控制与时钟域: 深入理解`posedge`和`negedge`在`always`块中的作用,以及如何通过时钟信号来控制时序逻辑的行为。探讨时钟域穿越(Clock Domain Crossing)的潜在问题及其解决方法(本书仅为概念介绍,不深入具体解决策略)。 延时:模拟仿真中的概念: 了解Verilog中的各种延时(``, `delay0`, `delay1`)在仿真中的作用,它们用于模拟实际电路的传播延迟,但通常不被综合成实际硬件。 第三部分:VHDL——严谨而强大的硬件描述语言 VHDL(VHSIC Hardware Description Language)是另一种广泛应用的硬件描述语言,以其严谨的语法和强大的描述能力而著称。本部分将为您揭示VHDL的魅力。 VHDL基础:实体、端口与架构: 学习VHDL设计的四大基本要素:实体(entity)定义了设计的接口,端口(port)声明了输入输出信号,架构(architecture)描述了内部的实现逻辑。 数据类型与信号: 掌握VHDL中丰富的内置数据类型(如`bit`, `boolean`, `integer`, `real`)以及用户自定义类型(如`enumerated`类型、`array`类型)。理解`signal`和`variable`的区别及其在赋值和行为上的差异。 行为级建模:描述电路的功能: 学习使用VHDL的并发语句(如`process`)来描述电路的行为。理解`wait`语句的作用,以及`if-then-elsif-else`, `case`语句在流程控制中的应用。 结构级建模:组件实例化: 学习如何通过实例化组件(component)来构建层次化的VHDL设计。理解组件声明、端口映射(port map)的过程,以及如何将不同部分连接起来。 过程赋值与组合/时序逻辑: 深入理解`process`语句如何用于描述组合逻辑和时序逻辑。掌握在`process`中使用`rising_edge()`和`falling_edge()`来同步时序逻辑。 类型转换与运算符: 学习VHDL中丰富的类型转换机制,以及各种运算符(算术、逻辑、关系、移位)的使用。理解VHDL的类型安全特性。 属性:描述硬件特性: 了解VHDL的属性(attribute)机制,可以用来描述硬件的特定属性,如时钟周期、频率等,辅助工具进行优化和检查。 程序包(Package):代码的组织与复用: 学习如何使用程序包来组织常用的类型定义、常量、子程序(函数和过程),提高代码的可重用性和可管理性。 并发与顺序:理解VHDL的执行模型: 深刻理解VHDL的设计是并发执行的,即使是在`process`语句内部,语句也是并行执行的(除了显式使用`wait`)。 生成语句(Generate Statements):参数化与循环: 学习`generate`语句,用于实现基于条件的实例化和迭代实例化,从而创建参数化的结构,自动化生成重复的逻辑。 第四部分:从语言到实践的思考(不包含具体开发板操作) 本部分将从更宏观的视角,引导您思考如何将所学的Verilog和VHDL知识应用于实际设计,并为未来的学习和实践打下基础。 综合:从代码到网表: 简要介绍综合(Synthesis)的概念,即硬件描述语言代码被转换成逻辑门和触发器组成的网表的过程。理解综合工具的目标(速度、面积、功耗)以及设计者如何通过代码结构影响综合结果。 仿真:验证设计的正确性: 强调仿真(Simulation)在数字设计流程中的关键作用。学习如何编写仿真测试平台(Testbench),输入激励信号,观察输出波形,以验证设计的逻辑功能是否正确。 时序分析:确保设计的可靠性: 介绍静态时序分析(STA)的基本概念,它是验证设计在实际工作频率下能否稳定运行的关键步骤。了解建立时间和保持时间的重要性。 常见的数字电路模块设计模式: 除了前面章节的例子,我们将讨论一些更通用的设计模式,如移位寄存器、FIFO(先进先出队列)的基本结构和工作原理(不涉及具体读写指针的HDL代码实现,但会讲解其逻辑),简单的状态机控制器等。 代码风格与设计原则: 强调编写清晰、可读、易于维护的HDL代码的重要性。介绍一些良好的代码风格和设计原则,如模块化设计、避免综合陷阱、合理的命名规范等。 如何进行下一步学习: 本书的宗旨是为您打下扎实的基础,为后续的学习指明方向。我们将提供一些建议,例如如何选择合适的开发板、如何学习和应用数据手册、如何阅读和理解参考设计等。 本书致力于为您构建一个全面而深入的数字逻辑和硬件描述语言知识体系。通过学习本书,您将能够: 清晰理解数字逻辑的基本原理和实现方式。 熟练掌握Verilog和VHDL的语法和建模技巧。 能够用HDL语言描述各种数字逻辑电路的功能。 理解设计、仿真、综合等基本流程。 为进一步学习FPGA/CPLD和嵌入式系统设计打下坚实的基础。 我们相信,通过对本书内容的深入学习和思考,您将能够自信地踏上数字设计工程师的道路,并在这个充满挑战和机遇的领域中不断成长。