描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302499138丛书名: 清华开发者书库
? 内容全面 涵盖FPGA及Vivado的基本功能,及其在数字系统中的多种设计流程。
? 技术前沿 基于当前的Vivado设计套件版本,论述了FPGA主流设计技术。
? 易于实践 全书结合大量实例论述,图文并茂、操作性强,便于快速动手实践。
全书分为8章,包括现代数字系统设计技术概论、可编程逻辑器件、Verilog HDL硬件描述语言、Vivado设计流程、数字系统的设计与综合、基于FPGA的DSP系统设计、Zynq嵌入式系统设计技术和EGO1综合性设计项目举例。各章都安排了针对性强的已验证过的设计实例,并附有Verilog HDL手册、EGO1开发板资料,供师生在教学中选用。
本书可作为高等院校电子、通信、自动化、计算机等专业本科教学参考书,也可作为信息类专业研究生和数字系统设计人员的参考书。
目录
第1章现代数字系统设计概论
1.1概述
1.2数字系统的层次化结构
1.2.1开关电路级的基础——CMOS反相器
1.2.2逻辑级的门电路
1.2.3寄存器传输级的有限状态机
1.2.4数字系统的系统级构成
1.2.5复杂系统的算法级设计
1.3数字系统设计的描述方法
1.3.1原理图设计
1.3.2程序设计法
1.3.3IP模块的使用
1.3.4基于模型的设计技术
1.3.5高层次综合——HLS设计
1.3.6脚本设计技术
1.4IP技术
1.4.1IP知识产权模块
1.4.2IP模块的种类与应用
1.4.3片上系统和IP核复用
1.5全可编程FPGA/SoC实现智能化系统
1.5.1软件智能化和硬件化
1.5.2在线可重构技术
1.5.3可重配置加速堆栈
本章小结
习题
第2章可编程逻辑器件
2.1概述
2.1.1可编程逻辑器件概述
2.1.2可编程逻辑器件分类
2.2CPLD的结构和工作原理
2.2.1简单可编程逻辑器件原理
2.2.2CPLD的结构和工作原理
2.3FPGA的结构和工作原理
2.3.1SRAM查找表类型
2.3.2反熔丝多路开关类型
2.4逻辑级FPGA的结构和工作原理
2.4.1可编程逻辑
2.4.2可编程互连线
2.4.3可编程I/O
2.5系统级FPGA的结构和工作原理
2.5.1片上存储器及接口
2.5.2数字时钟管理
2.5.3时钟资源
2.5.4系统级I/O
2.6平台级FPGA的结构和工作原理
2.6.1DSP模块
2.6.2高速串行接口
2.7全可编程FPGA的特性和结构
2.7.1采用统一的7系列架构
2.7.2高性能和低功耗结合的工艺
2.8ASIC架构的UltraScale系列
2.8.1UltraScale架构
2.8.2SSI互连技术
2.9FPGA的配置
2.9.1编程原理简介
2.9.2编程模式
2.9.3典型的配置电路
2.9.4编程流程
2.9.5部分重配置
本章小结
习题
第3章Verilog硬件描述语言
3.1硬件描述语言概述
3.1.1硬件描述语言特点
3.1.2层次化设计
3.2Verilog HDL程序的基本结构
3.2.1模块结构分析
3.2.2模块的实例化
3.3Verilog HDL词法、数据类型和运算符
3.3.1词法约定
3.3.2数据类型
3.3.3运算符
3.4Verilog HDL行为语句
3.4.1赋值语句
3.4.2顺序块和并行块语句
3.4.3结构说明语句
3.4.4条件语句
3.4.5循环语句
3.4.6系统任务和系统函数
3.4.7编译预处理命令
3.4.8Verilog HDL可综合设计
3.5Verilog HDL设计举例
3.5.1组合电路设计
3.5.2时序电路设计
3.5.3数字系统设计
3.5.4数码管扫描显示电路
3.5.5LED通用异步收发电路设计
3.6Testbench文件与设计
本章小结
习题
第4章Vivado设计工具
4.1Vivado工具概述
4.1.1单一的、共享的、可扩展的数据模型
4.1.2标准化XDC约束文件——SDC
4.1.3多维度分析布局器
4.1.4IP封装器、集成器和目录
4.1.5Vivado HLS
4.1.6其他特性
4.1.7TCL特性
4.1.8Vivado按键流程执行设计项目
4.2Vivado设计流程
4.2.1创建工程
4.2.2功能仿真
4.2.3RTL级分析
4.2.4综合设计
4.2.5分配引脚和时序
4.2.6设计实现
4.2.7生成bit文件
4.2.8下载
4.3产生IP集成器子系统设计
4.3.1产生IP集成器模块设计
4.3.2定制IP
4.3.3完成子系统设计
4.3.4产生IP输出产品
4.3.5例示IP到设计中
4.4硬件诊断
4.4.1设计诊断概述
4.4.2Vivado逻辑诊断IP核
4.4.3HDL例示法添加ILA核
4.4.4系统内诊断uart_led设计
4.4.5网表插入法添加诊断核
4.4.6添加VIO诊断核
本章小结
习题
第5章数字系统的高级设计与综合
5.1Verilog编程风格
5.1.1逻辑推理
5.1.2陷阱
5.1.3设计组织
5.1.4针对Xilinx FPGA的HDL编码
5.2综合优化
5.2.1速度与面积
5.2.2资源共享
5.2.3流水线、重新定时和寄存器平衡
5.2.4有限状态机编译
5.3数字系统的同步设计
5.3.1同步设计基本原理
5.3.2建立和保持时间
5.3.3时序例外约束
5.3.4同步设计中的异步问题
5.4数字系统的综合
5.4.1数字系统综合概述
5.4.2系统级综合
5.4.3高级综合
5.4.4寄存器传输级综合
5.4.5逻辑级综合
本章小结
习题
第6章FPGA DSP系统设计
6.1DSP基础
6.1.1DSP的基本概念
6.1.2FPGA实现DSP的特点
6.2DSP硬核的结构与使用
6.2.1输入和输出端口
6.2.2DSP48E1模块的操作
6.2.3输入端口逻辑电路
6.2.4输出端口逻辑
6.3FPGA设计DSP技术
6.3.1浮点数与定点数的表示与转换
6.3.2采样周期的设置
6.3.3System Generator模块
6.3.4Black Box模块
6.3.5ModelSim模块
6.3.6Gateway In模块和Gateway Out模块
6.3.7Concat模块、Convert模块、Reinterpret模块和Slice模块
6.3.8模块通用属性
6.4DSP48实现MAC
6.4.1利用Xilinx Blockset设计12×8 MAC
6.4.2利用Simulink仿真12×8 MAC
6.4.3利用System Generator Block产生代码
6.4.4实现12×8 MAC设计
6.4.5硬件协同仿真校验设计
6.5设计FIR滤波器
6.5.1产生FIR滤波器的系数
6.5.2输入FIR滤波器系数
6.5.3在Simulink中仿真FIR滤波器
6.5.4实现FIR滤波器
6.5.5连接演示板,通过Simulink仿真设计
6.6设计MAC FIR滤波器
6.6.1分析系数
6.6.2添加控制逻辑并参数化
6.6.3添加双口RAM
6.6.4在数据端口添加填充位和去填充位
6.6.5完成MAC FIR设计
6.6.6用各种信源测试设计
6.6.7执行硬件在环路校验
6.7Vivado HLS
6.7.1高级综合的调度和装配
6.7.2数据通道 控制器架构
6.7.3理解Vivado HLS
6.7.4高级综合的优化方法
本章小结
习题
第7章嵌入式系统Zynq设计
7.1Zynq概述
7.2Zynq设计入门
7.2.1Vivado工程创建
7.2.2由Vivado创建Zynq嵌入式系统
7.2.3SDK应用程序编写
7.3Zynq嵌入式系统调试方法
7.3.1Vivado硬件调试
7.3.2使用SDK进行Zynq调试
7.4调试Linux应用
7.4.1产生SDK软件工作空间
7.4.2启动超级终端
7.4.3添加和诊断软件应用
本章小结
习题
第8章综合设计实例
8.1实例一: 基于VGA接口的设计实例
8.1.1设计任务
8.1.2原理分析与系统方案
8.2实例二: PS/2键盘编解码演示系统
8.2.1设计任务
8.2.2原理分析与系统方案
8.2.3设计实现
8.3实例三: 实现SOPC系统
8.3.1设计任务和方案
8.3.2实验步骤
8.3.3实验调试设备
本章小结
习题
附录AEGO1用户手册
附录BVerilog HDL(IEEE 13642001)关键词表及说明
参考文献
由Xilinx公司发明的FPGA技术,按照摩尔定律已经历了30多年的发展历程,它的可编程特性使其成为电子产品设计和验证不可或缺的手段,在数字信号处理(DSP)系统和嵌入式系统等设计领域也得到日益广泛的应用。为了适应迅速发展的技术进步,培养出符合新时代要求的合格人才,近年来大学教育利用FPGA的可编程特性进行了广泛的探索,也取得了令人瞩目的成果,例如得到*认可的口袋实验板,以及贯穿式教育和工程实训等教改措施。
根据近期在多个大学进行数字系统和嵌入式系统工程实训的经历,结合国家对新型人才培养的要求,以及根据读者对利用FPGA设计现代数字系统的需求,选取目前流行的FPGA器件、设计工具和设计语言编写了此书。本书选用Xilinx公司7系列全可编程FPGA和SoC,2017x版本的Vivado设计工具,以及在许多大学得到广泛应用的依元素公司开发的EGO1开发板,作为学生的口袋实验板随身携带,不仅可以使设计项目在FPGA硬件上运行,也可以通过实验验证、理解和运用所学知识。
Verilog HDL是设计者们喜爱的语言,与VHDL相比,更节省代码,更接近C语言,适合有C语言基础的读者学习,因此被业界广泛使用,也为本书所采用。
全书共8章。
第1章介绍现代数字系统设计概论,包括现代数字系统层次化的设计概念、多种描述方法和IP、SoC概念。本章使初学者对现代数字系统设计有一个整体的认识。
第2章介绍历代FPGA器件的结构特点、硬件资源和配置方法,为进一步的设计和优化奠定必要的器件基础。
第3章介绍Verilog HDL的基本语法和设计实例,是全书的设计语言基础教程。
第4章介绍Vivado工具编程、仿真、综合和实现的设计流程,以及测试诊断工具和IP集成工具等。
第5章是比较深入的高级设计与综合技术,包括Verilog HDL的编程风格、综合优化、同步设计、高级综合与系统综合。本章是完成较复杂数字系统设计的重要设计知识与设计技巧。
第6章介绍在FPGA内实现DSP的方法,在FPGA内建DSP是现代DSP技术的重要的发展方向。本章介绍在FPGA构建DSP的基本方法和System Generator设计工具,给出使用System Generator设计工具设计FIR数字滤波器的完整设计过程。
第7章介绍Zynq嵌入式系统设计技术,包括Zynq嵌入式处理器结构、AXI4总线,利用IP模块在Vivado构建硬件,在SDK中编写软件,协同开发流程。
第8章给出三个综合设计实例。
为了方便读者,本书编写了Verilog HDL手册、EGO1开发板资料和参考文献供查阅。
本书保留原书如下三个特点:
一是内容完整,包含设计理论、器件知识、设计语言、基本设计工具,还包括高级设计与综合技术、FPGA内构建DSP的设计方法、SOPC设计方法和综合设计实例。为初学者提供了完整的学习内容和丰富的参考资料。
二是注重读者的认识规律,由浅入深,循序渐进,既有深入的内容,又使初学者能很快入门; 既有数字技术的理论知识,又有指导实践的实验实例。
三是书中涉及的所有程序均已经过调试,在教学过程中可以放心地使用和验证。
当然,现代数字系统设计涉及很广泛和深入的知识,不可能在一门课程中全部解决。我们希望能帮助初学者尽快入门,但更深入的研究和专门的设计知识需要在后续课程和设计实践中不断积累和完善。现代数字系统设计对理论和实践的综合要求都是比较高的,建议使用本教材的老师在介绍基本的设计基础后,尽量安排学生通过实验来发现和解决更多的问题,以提高实践能力。
本书是采用Vivado 2017版本的FPGA教材。选用本书作为教材的高校教师可以到网站http://eelements.readthedocs.io/zh/ego1_v2.1/EGO1.html#id12获取实验的详细资料及演示资料(需获准)。
本书由孟宪元和钱伟康教授共同完成编写和审稿。
由于FPGA技术发展迅速,设计工具的版本每年都有若干次更新,作者水平有限,编写时间仓促,书中的疏漏之处请读者予以指正。
感谢清华大学出版社对本书的出版给予的关心和支持!
孟宪元
2019年2月
数字系统的高级
设计与综合
从基于原理图的设计转到硬件描述语言设计是电子设计的一次变革,它允许一个设计者从理论上以工艺无关的行为方式来描述所设计的数字系统模型。随着设计要求不断提高,复杂性不断增加,用硬件描述语言的数字电路设计在很多方面已经变成单调和费时的事情,设计者迫切需要更高层次抽象的设计与综合技术,为了适应技术的发展,大量高层次的设计技术与综合工具可提供给设计工程师使用。
对于结构比较清晰的数字系统,可以利用HDL硬件描述语言直接在寄存器传输级(即RTL级)对设计的系统进行描述,这种描述是对系统行为的描述,然后由综合工具进行综合,利用硬件来实现数字系统。
在第3章介绍Verilog HDL语言的基础上,第4章结合Vivado设计软件介绍了如何将描述系统行为的设计程序进行硬件实现,并加载到目标器件进行调试和验证。由于设计者的程序的编码风格和采用的设计技术直接影响系统模型的建立和综合的结果,本章将讨论如何使编写的程序能够建立正确的系统模型,并被软件综合成设计者设想的结构,包括编码风格的影响、综合工具优化的使用,以及同步设计技术的概念和措施。后,按照数字系统的层次结构简要介绍综合可能采用的一些方法,以便读者理解从语言描述到硬件实现的过程。
5.1Verilog编程风格
对于使用硬件描述语言(HDL)编程的抽象级描述,综合优化技术仅能协助设计者满足设计要求。综合工具遵循编码构造和按照RTL中展开的结构在基础的层次上映射逻辑。如果没有类似FSM和RAM等十分规则的结构,综合工具可以从代码中提取功能,识别可替代的结构,并相应地实现。
除了优化之外,为综合编码时的基本指导原则是不减少功能而使所写的结构和伪指令小化,但是这样可能在仿真和综合之间产生不一致的结果。一个好的编码风格一般要保证RTL仿真与可综合的网表具有相同的性能。一类偏差是厂商支持的伪指令,它可以按照专门注释的形式(不考虑仿真工具)加入RTL代码,并引起综合工具按RTL代码本身不明显的方式推演一个逻辑结构。
由于综合工具只能对可综合的语句产生终的硬件实现,如果设计者对语言规则和电路行为的理解不同,则可能使设计描述的编码风格直接影响EDA软件工具的综合结果。例如,描述同一功能的两段RTL程序可能产生出时序和面积上完全不同的电路,好的描述方式就是综合器容易识别并可以综合出所期望的电路,电路的质量取决于工程师使用的描述风格和综合工具的能力。
5.1.1逻辑推理
1. ifelse和case结构——特权与并行性
在FPGA设计的范围内,把一系列用来决定逻辑应该采取什么动作的条件称作一个判决树。通常,可以分类成ifelse和case结构。考虑一个十分简单的寄存器写入的示例。
例51
module regwrite(
outputreg rout,
input clk,
input[3:0]in,
input[3:0]sel);
always @(posedge clk)
if(sel[0])rout <= in[0];
else if (sel[1])rout <= in[1];
else if (sel[2])rout <= in[2];
else if (sel[3])rout <= in[3];
endmodule
这类ifelse的结构可以推理成如图51所示的多路选择器的结构。
这类判决结构可以按许多不同的方式来实现,取决于速度/面积的权衡和要求的特权。下面介绍如何针对不同的综合结构对各种判决树进行编码和约束。
ifelse结构固有的性质是特权的概念。出现在ifelse语句的条件所给予的特权超过判决树中的其他条件。所以,上述结构中更高的特权将对应靠近链的末尾和更接近寄存器的多路选择器。
在图51中,如果选择字的位0被设置,则不管选择字的其他位的状态,in0将被寄存。如果选择字的位0没有被设置,则利用其他位的状态来决定通过寄存器的信号。通常,只有当某一位(在此情况是位LSB)前面的所有位均没有被设置时,则利用该位来选择输出。这个特权多路选择器的真正实现如图52所示。
图51串行多路选择器结构的简单特权
图52特权多路选择器
无论ifelse结构后如何实现,将赋予出现在任何给定的条件之前的条件语句更高的特权。所以,当判决树有特权编码时应该利用ifelse结构。
另一方面,case结构通常(不是总是)用于所有条件互不相容的情况。换言之,可以在任何时刻只有一个条件成立的情况下优化判决树。例如,根据其他多位网线或寄存器(例如加法器的译码器)进行判决时,在一个时刻只有一个条件成立。这与上述用ifelse结构实现的译码操作是一样的。为了在Verilog中实现完全相同的功能,可以采用case语句。
例52
case(l)
sel[0]:rout <= in[0];
sel[1]:rout <= in[1];
sel[2]:rout <= in[2];
sel[3]:rout <= in[3];
endcase
由于case语句是ifelse结构的一种有效替代,许多初学者以为这是自动地无特权判决树的实现。对于更严格的VHDL语言,该想法恰巧是正确的; 但是对于Verilog语言,却不是这种情况,可以从图53中case语句的实现看出。
图53特权译码逻辑
如图53所示,缺省的部分是通过特权译码来设置多路选择器上相应的使能引脚,这导致许多设计者落入陷阱。如果综合工具报告case结构不是并行的,则RTL必须把它改变为并行的。如果特权条件是成立的,在相应的位置应该采用ifelse结构。
2. 完全条件
目前为止检查的判决树中,如果case语句的条件没有一个是成立的,则综合工具将寄存器的输出返回到判决树作为一个默认条件(这个行为取决于综合工具默认的实现方式,但是本节假设它是成立的)。这个假设是如果没有条件满足,数值不改变。
建议设计者添加默认条件。这个默认值可以是也可以不是当前的数值,但是,为每个case条件分配输出一个数值,可避免工具自动地锁存当前值。用这个默认条件消除寄存器使能,如例53中修改后的case语句。
例53
//不安全的case语句
module regwrite(
outputreg rout,
input clk,
input[3:0]in,
input[3:0]sel);
always @(posedge clk)
case(l)
sel[0]:rout <= in[0];
sel[1]:rout <= in[1];
sel[2]:rout <= in[2];
sel[3]:rout <= in[3];
default:rout <= 0;
endcase
endmodule
如图54所示,默认条件现在是明确的,作为多路选择器一个可供选择的输入实现。虽然触发器不再要求一个使能信号,总的逻辑资源不一定减少。同时应注意到,如果每个条件不对寄存器定义一个输出(通常发生在单个case语句分配多个输出时),默认条件和任何综合的特征位都不能防止产生一个锁存器。为了保证总有一个数值分配到寄存器,可以在case语句之前利用初始赋值分配给寄存器一个数值,如例54所示。
图54为默认条件编码
例54
module regwrite (
output regrout,
input clk,
input[3:0]in,
input[3:0]sel);
always @(posedge clk)
rout <= 0;
case(l)
sel[0]:rout <= in[0];
sel[1]:rout <= in[1];
sel[2]:rout <= in[2];
sel[3]:rout <= in[3];
endcase
endmodule
这类编码风格消除了对默认情况的需要,也保证了如果没有其他赋值定义时,寄存器会分配到这个默认值。
完全条件可以用正确的编码方式来设计,推荐的方法是避免该约束仅由设计保证完全的覆盖,如前所述,即在case语句之前利用默认条件和设置默认数值。这将使代码具有更高的可移植性,减少不希望的失配可能性。设置FPGA综合选项时的风险之一是仅允许一个默认设置,因此所有的case语句自动地假设是parallel_case、full_case或二者兼之。厂商明确地提供了该选项。实际上,应该尽量不要使用这个选项,它会产生隐含的风险,以不正确的形式进行代码综合,并且用基本的系统内测试无法发现,在仿真中会产生不确定性。所以,parallel_case和full_case可以引起仿真和综合的失配。
3. 多控制分支
设计者通常犯的错误(在较差的编码风格中)是对单个寄存器不连接控制分支。在例55中,oDat被的判决树中两个不同的数值赋值。
例55
//不好的编程风格
module separated(
output regoDat,
inputiclk,
input iDat1, iDat2, iCtrl1, iCtrl2);
always @ (posedge iclk)begin
if (iCtrl2) oDat <= iDat2;
if (iCtrl1) oDat <= iDat1;
end
endmodule
因为无法说明iCtrl1和iCtrl2是否是互不相容的,因此该编码是模糊的,综合工具必须为实现做一定的假设。特别地,当二者的条件同时成立时,没有明显的方式管理特权。因此,
图55带明显特权的实现
综合工具必须基于这些条件发生的顺序赋予特权。在这种情况下,如果条件后出现,它将获得优于个条件的特权。
基于图55,iCtrl1有优于iCtrl2的特权,如果交换它们的次序,特权同样也会交换。这与ifelse结构的行为相反,ifelse结构通常把特权给予个条件。
所以,好的设计实践是把所有的寄存器赋值保持在单个控制结构内。
评论
还没有评论。