科罗拉多嵌入式系统-FPGA-笔记-全-
科罗拉多嵌入式系统 FPGA 笔记(全)
001:课程介绍 🚀

在本节课中,我们将要学习什么是现场可编程门阵列(FPGA),了解其在现代电子系统中的重要性,并明确本课程的目标与使命。
我们邀请您加入我们的使命。

请将自己想象为女王陛下秘密情报机构的一名特工,为Q部门工作,开发用于各种有趣用途的新产品,我们将称您为“亚洲特工”。
FPGA正迅速在大多数电子产品中普及。它们是推动未来许多伟大新产品开发的关键技术,这些产品包括:自动驾驶汽车、物联网、安全数据中心与云计算、机器人技术、机器视觉与学习、可再生能源、家庭自动化、8K视频与视频监控、面部识别与生物信息学、5G蜂窝网络以及智能医疗诊断。
可编程逻辑器件现已构成一个年产值60亿美元的产业,预计到2020年将增长至年产值100亿美元,并成为价值数千亿美元的终端产品的一部分。
最新的FPGA拥有多达2000万个逻辑门。它们正在大多数应用中取代专用集成电路,因为其上市时间更快,且性能几乎相同。可编程逻辑为设计提供了终极的灵活性,允许芯片实现几乎任何数字功能。
当与硬核知识产权模块结合以构成片上系统时,这些器件允许以相对较低的成本快速开发出非常复杂的产品。
我们将尽力为您提供最好的资源和工具。您可能听说过FPGA设计很困难。确实如此。然而,我们的使命就是向您揭示FPGA设计的奥秘。


本节课中,我们一起学习了FPGA的基本概念、其广泛的应用领域、巨大的市场潜力以及本课程致力于帮助初学者掌握这项技术的核心目标。
002:课程概述 🚀

在本节课中,我们将要学习FPGA(现场可编程门阵列)技术的基础知识,了解其在嵌入式系统中的核心作用,并预览整个课程的结构与目标。
欢迎来到FPGA的奇妙世界
欢迎来到嵌入式系统FPGA设计的奇妙世界。

FPGA是推动未来众多伟大新产品开发的关键技术。这些产品包括自动驾驶汽车、物联网、安全数据中心与云计算、机器人技术、机器视觉与学习、可再生能源、家庭自动化、8K视频与视频监控、面部识别与生物信息学、5G蜂窝网络以及智能医疗诊断。FPGA正迅速在大多数电子产品中普及。
可编程逻辑器件现已构成一个年产值60亿美元的产业,预计到2020年将增长至年产值100亿美元,并成为价值数千亿美元的终端产品的一部分。在大多数应用中,FPGA正在取代ASIC(专用集成电路),因为其上市时间更快,且功能几乎相同。
可编程逻辑为设计提供了终极的灵活性,允许器件实现几乎任何数字功能。结合硬核IP(知识产权核)以构成片上系统,这些器件使得以相对较低的成本快速开发非常复杂的产品成为可能。最新的FPGA拥有多达2000万门电路。如果你正在考虑从事电子设计职业,这门课程将极大地提升你的职业机会。

课程目标与内容
本课程将为你奠定嵌入式系统中FPGA设计的基础。你将学习什么是FPGA以及该技术是如何发展的,如何为特定应用选择最佳的FPGA架构,如何使用最先进的软件工具进行FPGA开发,以及如何利用FPGA解决关键的数字设计问题。


关于讲师
我在FPGA设计领域拥有广泛的背景,在多个行业拥有超过30年的设计经验。我叫Tim Shaer,我将作为你的讲师和向导,陪伴你完成这段旅程。除了作为设计工程师的经验外,我还拥有工程经理、工程总监的经验,并在两所主要大学拥有数年的教学经验。我目前就职于科罗拉多大学博尔德分校。
学习工具与资源
新工具使得FPGA设计比过去更容易。你可能听说过FPGA设计很难。确实如此,然而,我们的使命就是向你揭示FPGA设计的奥秘。

我们需要你加入我们的使命。请将自己想象成“女王陛下秘密情报局”的一名特工,为Q部门工作,为各种有趣的用途开发新产品。我们将称你为“特工你”。我们将尽力为你提供最好的资源和工具。有了这些工具,即使你以前觉得FPGA设计很困难,也能成功地进行设计。
我们将为你提供许多资源来帮助你成功。以下是课程大纲中列出的一些重要网站的部分列表,旨在激发你查看完整大纲的兴趣。我们将有推荐的参考教材:A. Hall和Furman所著的《数字系统快速原型设计:SOPC版》,以及Peter Wilson所著的《FPGA设计秘籍》第二版。我们将使用一些工具,例如Altera的FPGA设计工具Quartus,以及Altera的系统设计工具Qsys。
课程结构与学习方法
本课程的目标是让学生学会使用FPGA,为各种应用创建原型或产品。我的目标是帮助你在FPGA设计上取得成功。尽管FPGA设计可能是一个复杂的话题,但我们会以易于理解的方式介绍它,通过一点努力,基本概念将很容易掌握,同时也为更有经验的设计师提供挑战。我们不是来让你跌倒的,虽然材料有时很难,但如果你有任何数字逻辑设计的背景,我相信你有能力学会这些内容。
我想向你概述一下课程的方向以及你将学习的内容。本课程包含四个模块:
- 模块一:将向你介绍FPGA的历史与架构。
- 模块二:为你提供使用强大的、最先进的FPGA设计工具的重要实践经验。
- 模块三:描述当前的FPGA技术,并让你具备为任务选择最佳器件的能力。
- 模块四:你将练习并发展FPGA设计与分析的专长,包括创建一个基于FPGA逻辑的可定制处理器。
在每个模块中,我们将采用多种学习方法帮助你掌握材料,包括:
- 视频内测验,以检查你的学习成果。
- 练习,通过行业工具的引导实践来应用所学知识。
- 讨论论坛,以交流所学。
- 评估,以展示所学。
总结与展望
FPGA已成为电子世界中无处不在的技术。在本课程中,你将学习使用FPGA为各种应用创建原型或产品。由于这些产品具有极大的灵活性和广泛的能力范围,我相信你会发现用FPGA创建项目是一次有趣的体验。FPGA为释放你的创造力提供了绝佳的机会,并帮助你的设计产生影响。
这是一门实践性课程。当你付诸实践时,从本课程中获得的知识将帮助你设计下一波激动人心的新产品,以应对前方可能存在的任何挑战。




003:欢迎来到可编程逻辑与FPGA设计的世界 🚀

在本节课中,我们将为FPGA设计打下基础。我们将首先了解可编程逻辑的历史背景,然后深入探讨CPLD和FPGA这两种核心可编程逻辑器件的架构与性能差异,并学习FPGA如何利用查找表实现逻辑功能。
历史背景与CPLD介绍
首先,我们将学习可编程逻辑的历史,为理解FPGA建立背景和上下文。
接着,我们将审视第一种可重编程逻辑器件——CPLD,并深入探讨其架构以及该架构如何影响性能。
从CPLD到FPGA
在模块的后半部分,我们将介绍现场可编程门阵列,并将FPGA的架构和性能与CPLD进行对比。
FPGA由用作查找表的内存单元组成,用于创建逻辑功能。
那么,什么是FPGA?一般而言,它是一种集成电路,由一系列可编程逻辑块组成,块之间具有可编程的互连布线。这种结构使得器件能够被配置以执行复杂的数字逻辑功能。
以下是其定义:现场可编程门阵列是一种集成电路,设计为在制造后可由客户或设计者进行配置,因此称为“现场可编程”。FPGA的配置通常使用硬件描述语言来指定,类似于设计专用集成电路时使用的语言。
FPGA中的逻辑实现
在本模块中,我们还将学习FPGA如何使用查找表来创建逻辑。
FPGA中的逻辑设计有所不同。我们将以加法器和乘法器为例,看看设计有何不同。由此,我们将清楚地了解FPGA中实现了多少种不同的功能。
逻辑决定一切,我们将迈出下一步。
总结与展望
我认为你会发现,由于FPGA产品具有极大的灵活性和广泛的能力范围,用它来创建项目会是一次有趣的体验。
希望你喜欢这个模块。

在本节课中,我们一起学习了可编程逻辑的历史背景、CPLD的基本架构,以及FPGA的核心定义和工作原理。我们了解到FPGA通过可配置的逻辑块和互连资源,使用查找表来实现复杂的数字逻辑功能,这为后续深入学习FPGA设计奠定了坚实的基础。
004:可编程逻辑简史 🧠

在本节课中,我们将学习可编程逻辑器件的发展历程。通过了解其历史,我们可以更好地理解什么是可编程逻辑,以及现场可编程门阵列(FPGA)在其中扮演的角色。
可编程逻辑的起源
你或许曾好奇,可编程逻辑究竟是什么?为了解答这个问题,让我们回顾一下可编程逻辑器件的发展史,这有助于我们理解可编程逻辑器件(PLD)的整体概念,特别是现场可编程门阵列(FPGA)。
FPGA是可编程逻辑器件的一个子集。以下是可编程逻辑器件发展的简要历史。
第一个可编程逻辑器件是PROM(可编程只读存储器),它于1956年发明,但直到1969年才商业化。随后,EPROM(可擦除可编程只读存储器)于1971年出现,接着是PLA(可编程逻辑阵列)于1975年问世,以及PAL(可编程阵列逻辑)于1978年诞生。本视频将解释这些器件之间的区别。
可编程硬件的需求与实现原理
自数字硬件诞生之初,人们就渴望拥有可编程的硬件。我们可以用两级“积之和”格式来实现任何逻辑方程。
为了便于说明“与”平面和“或”平面,我们采用一种特殊的表示法。左边是传统三输入“与”门的表示,右边是我们将用于两级可编程逻辑块的表示法:一个点表示硬连线,一个X表示可编程连接,空白表示无连接。正如你所见,可编程逻辑可以像ABC一样简单。
事实上,第一个可编程逻辑器件就是PROM。PROM有一个固定的“与”平面(即乘积项,也就是地址解码逻辑)。“或”平面(即和项)则可以通过改变存储器内容来编程。这里展示的是一个8x4的PROM。使用它,我们可以通过在第一列存储8位字00000001来实现逻辑函数output1 = ABC。这样,只有当A、B和C全为1时,输出output1才为1。
从PROM到PAL的演进
同样地,我们可以让“或”平面固定,而使“与”平面可编程。实际上,这是一种更高效的架构,因为我们感兴趣的大多数逻辑函数都具有有限数量的乘积项。
下图说明了PAL的通用方法,它拥有固定的“或”平面,但“与”平面是可编程的。PLD器件非常流行,至今仍用于许多设计中,常见的型号如22V10或16R8。
复杂可编程逻辑器件(CPLD)的出现
进一步的发展催生了CPLD,即在同一封装内包含多个PAL、具有寄存器输出和可编程互连结构的器件。CPLD是复杂可编程逻辑器件。你可以查看屏幕上的Altera链接,以获取更完整的CPLD历史。
FPGA的诞生与发展
FPGA产业萌芽于20世纪80年代的可编程只读存储器(PROM)和其他可编程逻辑器件(PLD)。美国海军水面作战中心资助了由Steve Caselman提出的一项实验,旨在开发一台能实现60万个可重编程门电路的计算机。这开启了人们对可编程逻辑的兴趣。
Altera公司于1983年成立,并在1984年交付了业界首个可重编程逻辑器件EP300。该器件封装上有一个石英窗口,允许用户用紫外线灯照射芯片,以擦除保存器件配置的EPROM单元。多年来,Altera一直宣扬CPLD架构优于FPGA,但后来也妥协并开始生产FPGA。
Xilinx的联合创始人Ross Freeman和Bernard Vonderschmitt在1985年发明了第一个商业上可行的现场可编程门阵列——XC2064。XC2064具有可编程的门电路和门电路之间的可编程互连,从而开创了一项新技术和一个新市场。XC2064拥有64个可配置逻辑块(CLB),每个包含两个三输入查找表(LUT),这至今仍是FPGA架构中的重要组成部分。二十多年后,Freeman因此项发明被列入美国国家发明家名人堂。
在20世纪90年代初,FPGA主要用于电信和网络领域。到90年代末,FPGA已进入消费、汽车和工业应用领域。可编程逻辑器件构成了一个年产值60亿美元的产业,预计到2020年将增长至100亿美元。
数字逻辑器件的全景图
可编程逻辑只是数字逻辑器件殿堂中的一部分。此图来自推荐阅读书目中Hamblen的著作。标准逻辑的范围更广,如图所示。它包括额外的TTL系列(如LVTTL)、额外的CMOS系列(如HC、LVC等),以及BiCMOS(BT、HT等),还有差分逻辑系列(如ECL和LVDS)。顺便提一下,我刚才列出的所有逻辑类型都可以在FPGA的I/O接口中找到,这是FPGA灵活性的另一个例证。
标准逻辑、可编程逻辑和全定制器件也被称为通用集成电路。在ASIC和全定制之间,是现在被称为ASSP的器件,我稍后会描述。
FPGA的核心概念
因此,FPGA在概念上比其他PLD更简单,它只由三个元素组成:导线、门电路和寄存器(触发器)。芯片由门电路和触发器的阵列组成,导线可以按特定模式将它们连接起来,这些模式为计数器、定时器、状态机、算术逻辑单元(ALU)甚至整个CPU等更大功能创建逻辑。互连模式是FPGA设计的核心,我们将在本课程中学习。
专用标准产品(ASSP)与片上系统(SoC)
ASSP(专用标准产品)是一种专用于特定应用市场并销售给多个用户(因此是标准的)的半导体集成电路产品。ASSP面向多个客户进行销售,就像通用产品一样,但由于针对特定应用,客户数量较少。与ASIC(专用集成电路)类似,ASSP用于特定应用,但销售给任意数量的公司,面向整个市场;而ASIC是为特定公司定制设计和制造的。ASSP通常提供与ASIC相同的性能特征并具有相同的芯片尺寸。
逻辑器件的终极表现形式是片上系统(SoC)。以下是SoC的两个定义,随着时间的推移,它们变得越来越普遍:
- 片上系统(SoC)是一种将计算机的所有组件集成到一个电子系统中,并置于单个芯片上的集成电路。它可能包含数字、模拟、混合信号和射频功能。SoC因其低功耗在移动电子市场非常常见,另一个典型应用领域是嵌入式系统。
- 片上系统(SoC)是一种将多个组件与CPU集成到单个芯片上的集成电路。典型的组件类型包括GPU、通信接口、模拟功能和无线电。如果它包含可编程逻辑,那么它就是可编程SoC或SoC FPGA。SoC的高度集成提供了比替代方案更低的成本、更小的尺寸和更低的功耗。
总结与展望
现场可编程门阵列(FPGA)是由门电路、寄存器和路由导线组成的可编程逻辑器件,这些元件在器件部署后可以通过编程连接在一起。创建互连模式是FPGA设计的核心。可编程逻辑器件(PLD)包括简单的PLD(如PROM和PAL)、复杂的PLD(CPLD)、FPGA和SoC FPGA。PLD是所有逻辑器件的子集,而FPGA是PLD的子集。
FPGA与专用集成电路(ASIC)和专用标准产品(ASSP)竞争,并在许多应用中成功取代了它们。在数字器件领域,FPGA似乎代表着未来。

本节课中,我们一起学习了可编程逻辑器件从PROM、PAL、CPLD到FPGA的演进历程,了解了FPGA的核心构成(导线、门、寄存器)及其设计本质(创建互连模式),并认识了ASSP、SoC等相关概念。通过这段历史,我们能够更清晰地把握可编程逻辑,特别是FPGA,在现代数字系统设计中的重要地位和灵活性。
005:CPLD架构 🏗️
在本节课中,我们将学习复杂可编程逻辑器件(CPLD)的架构。CPLD是FPGA的前身,至今仍在某些特定应用中发挥作用。我们将通过回顾其历史发展,来理解这种架构所带来的优势与局限。
概述
CPLD是一种基于可编程逻辑阵列(PLD)发展而来的器件。它通过将多个被称为“宏单元”的PAL结构集成到单个芯片中,实现了更复杂的逻辑功能。理解CPLD的架构有助于我们认识其在“胶合逻辑”等应用中的价值,以及为何它最终被FPGA架构所补充。
CPLD的起源与发展

上一节我们介绍了基础的PAL结构。本节中我们来看看CPLD是如何在此基础上演进的。
最初的PAL(可编程阵列逻辑)器件使用一个可编程的“与”阵列后接一个固定的“或”阵列,实现了积之和(SOP)的逻辑函数。其逻辑功能可以用以下布尔表达式表示:
F = Σ (Product Terms)

这使得一个通用逻辑器件可以替代多达十几个不同的专用逻辑芯片。
Altera等公司扩展了这一概念,将多个PAL结构(即宏单元)集成到单个集成电路封装中。在这个架构中,所有输入引脚对每个宏单元都可用,并且任何输出引脚都可以由任何宏单元驱动。

CPLD的关键特性

CPLD在CMOS工艺中制造,使其具备可重复编程能力,而早期的双极性PAL则不具备此功能。尽管在当时看来这并非主要特性,但可重复编程性如今已成为PLD器件一个非常重要的属性。
定义CPLD内部互连的程序存储于片上的EEPROM中。Altera进一步扩展了此概念:在单个芯片封装中集成多个宏单元,每个宏单元都有专用的输出引脚,该输出可以反馈回输入阵列。

CPLD的典型应用:地址解码与胶合逻辑
由于其架构特点,CPLD非常适合需要大量组合逻辑的设计。
每个宏单元能够同时处理多个数字输入(例如16个)。这使得单个宏单元可以解码来自处理器的16位地址并生成片选信号。因此,一个拥有8个或16个宏单元的芯片就能为整个微处理器系统生成所有片选信号。CPLD也因此常与处理器系统的“胶合逻辑”相关联。
CPLD的宏单元与互连结构

以下是CPLD内部架构的核心组成部分:
- 宏单元:本质上是一个带寄存器的PAL阵列。图中的“熔丝”符号代表器件内部可编程的配置开关。
- 可编程互连阵列(PIA):一个连接宏单元的互连导线矩阵,它将某些宏单元的输出馈送到其他宏单元的输入。

这种结构非常适合那些每个触发器都需要大量逻辑的问题,例如复杂的16状态状态机或宽输入解码器。
CPLD的层次化架构与挑战
CPLD的顶层架构是由互连导线连接的P个宏单元。随着宏单元数量n的增加,所需的互连导线数量倾向于以n²的速率增长,导致互连成本呈指数级上升。
为了缓解这个问题,互连结构被分区,使得并非每个宏单元都能访问所有输入。
于是,CPLD演变为由更大的电路组——“逻辑阵列块(LAB)”构成。一个LAB是由16个宏单元组成的逻辑阵列块,宏单元之间存在本地路由。而可编程互连阵列(PIA) 则是LAB之间的路由网络。
由此可见,CPLD本质上是层次化更高的器件。层次化——即用许多较小的逻辑功能构建更大的逻辑系统——是逻辑设计中的一个重要概念。设计师需要规划哪些宏单元实现特定的逻辑方程,哪些宏单元需要其结果,同时还要考虑层次化互连中可能产生的延迟。更好的软件工具随之被开发出来以协助这种规划。
CPLD的优势与局限
CPLD有几个有用的特性:
- 易于生成宽输入函数。
- 时序易于计算且非常可预测,这被称为确定性时序。

因此,对于胶合逻辑应用,CPLD至今仍是很好的选择。
然而,对于需要大量寄存器、数据传输或总线接口的设计,这种逻辑密集但触发器稀缺的器件扩展性不佳。这促使了另一种PLD架构——FPGA的发展。
总结


本节课中,我们一起学习了CPLD的架构。CPLD为可编程逻辑器件引入了可重复编程性这一重要新特性,并强化了层次化设计方法。其架构使得设计宽输入组合逻辑函数(如地址解码器和状态机)变得容易,且具有确定性时序。


但是,CPLD架构对于需要大量触发器的设计扩展效率不高,这已成为FPGA的应用领域。
006:LUT与FPGA架构 🧠

在本节课中,我们将要学习现场可编程门阵列(FPGA)的基本架构及其核心组成部分——查找表(LUT)。我们将了解FPGA的发展历程、LUT的工作原理,以及布线如何影响FPGA的性能。
FPGA的发明与发展
上一节我们介绍了可编程逻辑器件的基本概念,本节中我们来看看FPGA的诞生。现场可编程门阵列(FPGA)的发明,旨在提供一种具有高度灵活性和实用性的通用数字逻辑器件。它的成功甚至超出了发明者最宏伟的梦想。
FPGA最初的设计意图是模仿门阵列,以创造更灵活的通用逻辑器件。门阵列是一种具有大量门电路的集成电路,通过添加金属层或布线来定义器件的功能。然而,FPGA在许多情况下并非使用晶体管门来实现逻辑,而是使用配置为查找表(LUT)的存储器来实现。
查找表(LUT)的工作原理
现在,让我们深入了解FPGA的基本逻辑单元——查找表(LUT)是如何工作的。下图展示了LUT如何用于实现任何四输入单输出的逻辑器件。

请注意创建真值表时规律性的方法。变量A的取值先是全0,然后是全1。变量B的取值是四个0,然后是四个1,依此类推。要创建输出F,例如,当A和B都为真时,F为真,这对应了真值表的最后四行,实现了顶部的与门。同样,如果C为真且D不为真,则F也为真。
核心概念:由于列出了所有可能的输入组合,我们可以通过编程F的值来为四个输入创建任何逻辑表达式。这些表达式也可以实现为与门、或门等电路,如图所示。
半导体公司擅长制造存储器,存储器具有规则且高度优化的结构,易于复制。最早的FPGA就是由三输入LUT组成的逻辑单元阵列。
FPGA逻辑单元架构
FPGA架构与CPLD不同,其逻辑单元更小,通常由LUT实现。以下是一个逻辑单元的简化示意图。
一个典型的逻辑单元由一个四输入LUT、一个全加器(FAA)和一个D型触发器组成。图中的LUT被拆分为两个三输入LUT。在正常模式下,它们通过左侧的多路复用器组合成一个四输入LUT。在算术模式下,它们的输出被馈送到全加器(FAA)。模式的选择通过中间的多路复用器进行编程。
这是Altera Cyclone系列逻辑单元(LE)的示意图,输入在左侧,输出在右侧。该逻辑单元的核心是一个四输入LUT,可用于创建任何四输入组合逻辑电路。LUT输出是进位链结构的一部分,用于加速算术计算。LUT输出可以直接路由出去,也可以通过触发器寄存。可以看出,该电路设计时充分考虑了多功能性。
布线结构与性能影响
由于FPGA架构比CPLD更精细(粒度更细),布线对性能的影响更大。FPGA中的布线是分层的。
- 在最底层,有由SRAM位、闪存位或熔丝控制的布线开关。
- 局部布线中有许多布线开关,用于连接各种逻辑单元或模块。
- FPGA由逻辑块阵列组成。逻辑块组通过长线或超长线连接。
- 时钟等公共信号通过称为全局网络的特殊布线网络进行路由。
为了实现高扇入功能(如地址译码器),FPGA需要级联多个逻辑单元级。这可能导致过度且有些不可预测的延迟。时序分析工具和设计软件在一定程度上帮助解决了这些问题。
FPGA架构的演进
下图展示了FPGA架构的演进过程。

- 1995年,Xilinx的FPGA采用N x N单元阵列,全局布线沿中心脊柱分布。
- 2000年,增加了4K位块RAM。
- 2005年,增加了乘法器以及硬核处理器(本例中为PowerPC),这是最早的真SoC部件之一。
- 2007年,增加了DSP核心。
从这一演进可以看出,FPGA不再局限于“胶合逻辑”的领域,而是正在成为子系统或完整的系统本身。这一发展部分得益于使用SRAM存储器作为布线开关,其密度高于EEPROM。RAM工艺通常是最先在新半导体工艺节点上得到验证的,因此能提供当时最高的密度。另一项发展是采用了新的设计输入方法,如原理图输入和Verilog、VHDL等硬件描述语言(HDL)。
配置存储器类型
用于创建布线开关的配置存储器类型,是决定FPGA性能和能力差异的最重要方面。
以下是主要的配置技术:
- 反熔丝FPGA:以可靠性著称,但只能一次性编程,且成本昂贵。
- 闪存FPGA:也非常可靠,且可重复编程,但价格高于SRAM FPGA。
- SRAM FPGA:可编程,在同等逻辑规模下密度最高、成本最低。
四大FPGA供应商提供多种配置类型的产品:
- Xilinx提供闪存CPLD和FPGA,以及SRAM FPGA。
- Altera(现为Intel PSG)提供闪存CPLD和SRAM FPGA。
- Lattice销售SRAM CPLD和FPGA。
- Microsemi(现为Microchip)提供反熔丝和闪存FPGA。
FPGA与CPLD的选择
考虑到以上所有信息,为什么有时会选择CPLD而不是FPGA呢?请记住,如果只需要少量逻辑,CPLD可能是成本更低的选择。在相同空间内,CPLD也可能允许更多的I/O,而逻辑成本更低。如果需要满足非常严格且确定性的时序要求,CPLD也可能是最佳选择。
FPGA设计流程简介
在模块2中,您将学习如何使用FPGA设计工具创建FPGA设计。您使用的工具遵循如下图所示的设计流程。
设计从设计输入开始,接着进行仿真以验证逻辑是否符合预期。然后,工具将执行综合(也称为映射),将逻辑映射到器件架构。接下来,工具将通过布局和布线(或适配)来创建单元之间的互连。在适配完成后,最好再运行一次仿真。如果一切顺利,下一步就是使用工具创建编程文件,然后将其下载到FPGA器件中进行测试。
这里推荐一个很好的免费学习FPGA的资源:一本简短的书《FPGAs for Dummies》。
总结 🎯

本节课中我们一起学习了:
- FPGA是高度灵活的通用数字逻辑器件,这部分归功于其巧妙地将存储单元用作基本逻辑单元的LUT。
- FPGA比CPLD具有更好的扩展性,能为大型设计和需要大量触发器的设计提供成本更低的解决方案。
- 由于FPGA架构比CPLD更精细,布线对性能的影响更大。
- FPGA配置存储器可以使用SRAM、闪存和反熔丝等多种技术之一实现,这一选择影响着成本和性能。
- FPGA为您的下一个逻辑设计提供了无数种实现方式。
007:逻辑设计中的LUT应用 🧠

在本节课中,我们将学习如何使用查找表(LUT)进行逻辑设计。我们将探讨LUT在FPGA中的核心作用,理解其工作原理,并通过实例分析其在不同规模逻辑设计中的应用与权衡。
概述
FPGA使用查找表(LUT)作为其基础逻辑单元。LUT非常适用于逻辑设计,掌握其用法需要一些时间,但这项努力是值得的。
上一节我们介绍了LUT的基本概念,本节中我们来看看LUT在具体逻辑设计中的应用。
LUT的工作原理
LUT可用于实现任何N输入的逻辑表达式,其中N是LUT的输入数量。例如,一个三输入LUT需要八个存储位置,一个四输入LUT则需要十六个存储位置,依此类推。
LUT通常由SRAM位单元构成,用于保存配置信息(即LUT掩码),以及一组多路复用器,用于选择驱动输出的SRAM位。
下图展示了一个四输入LUT,它由16位SRAM和一个实现为树状结构的16选1多路复用器(由多个2选1多路复用器组成)构成。

通过设置LUT掩码的适当值,这个四输入LUT可以实现输入A、B、C、D的任何函数。它也可以由两个三输入LUT通过一个2选1多路复用器连接而成。
LUT规模与布线的权衡
我们可以在更大的LUT器件中实现更多逻辑。然而,LUT的规模与所需布线资源之间存在权衡。更大的LUT意味着更少的布线,但也需要更多的存储位置。
让我们通过一些例子来理解其中的原因。
如果我们使用一个8输入LUT来创建一个8位地址解码器,则只需要一个逻辑单元。下图展示了在FPGA中的实现方式(尽管图中为PAL实现,但8输入LUT的原理类似)。
然而,如果我们使用三输入LUT,则需要四级逻辑单元以及它们之间相关的布线,如下图所示。
这个对比清晰地展示了LUT规模对设计复杂性的影响。
实例分析:逻辑功能实现
接下来,我们通过具体计算,看看实现常见逻辑功能需要多少个LUT。
四比特比较器
让我们确定制作一个四比特比较器需要多少个LUT。
以下是实现步骤:
- 前两个比特的同或(XNOR)运算可以在一个四输入LUT中实现。
- 同样,比特3和比特4的同或运算也可以在另一个四输入LUT中实现。
- 最后的与(AND)运算可以在第三个四输入LUT中实现。
因此,实现一个四比特比较器总共需要三个四输入LUT。
全加器
一个全加器需要多少个四输入LUT呢?
请思考一下这个问题。我们将在下一个视频中深入探讨全加器的LUT实现方案。
总结
本节课中我们一起学习了LUT在FPGA逻辑设计中的关键作用。
总结要点如下:
- FPGA使用各种规模的LUT来实现逻辑。
- LUT的规模与所需布线资源之间存在权衡:规模较大的LUT可以集成更多逻辑,从而减少布线需求;规模较小的LUT则需要更多布线,但能提供更好的逻辑效率。
- LUT可用于创建多种组合逻辑功能。
通过理解这些基本原理和权衡,你可以更有效地利用FPGA中的LUT资源进行逻辑设计。


008:加法器设计 🧮

在本节课中,我们将要学习加法器在FPGA中的设计与实现。加法器是数字计算机的核心,理解其工作原理和实现方式对于掌握FPGA设计至关重要。
加法器的重要性
上一节我们介绍了FPGA的基本逻辑单元。本节中我们来看看加法器的基础地位。每个数字计算机的核心是CPU,每个CPU的核心是算术逻辑单元(ALU),而每个ALU的核心则是加法器电路。加法器是基础电路。一旦能够实现加法,就可以通过补码加法实现减法,也可以通过重复加法实现乘法。因此,FPGA内部集成了专门的结构来简化加法器设计并提升其性能。
基本加法器实现
一个全加器可以由少至五个逻辑门构成。在FPGA中,我们可以用一个三输入或四输入的查找表(LUT)来实现它,前提是LUT支持两个输出。在某些情况下,LUT架构会为进位输出提供一个独立的输出端口,与和输出分开。
以下是使用Altera Max 10 FPGA的RTL查看器工具(Quartus Prime FPGA设计套件的一部分)查看的加法器实现结果。RTL代表寄存器传输级,它是一种比门级更高层次的抽象,将数据在数字逻辑中的移动视为逻辑图,其中表达式代表存储在寄存器中的数据变量。
该实现看起来与之前展示的门级电路图完全一致。
从一位到多位:行波进位加法器
我们可以将多个一位全加器作为组件连接起来,构成N位加法器。下图展示了一个由四个全加器构成的四位加法器的连接方式。
这种结构被称为行波进位加法器。它的设计简单,但性能相对较慢,因为每个全加器都必须等待前一个全加器计算出的进位位。行波进位加法器从输入到最终和输出的总延迟可以用以下公式表示:
T_adder(n) = (n-1) * T_carry + T_sum = (n-1) * 3D + 2D = (3n-1) * D
其中,D是单个逻辑门的延迟,n是加法器的位数。
那么,一个用此方法构建的32位加法器会有多少级门延迟呢?根据公式计算,一个32位加法器将产生95级门延迟。
性能优化:超前进位加法器
为了获得更低的延迟和更好的性能,我们可以使用更复杂的电路,例如下图所示的超前进位加法器。
进位位可以通过生成项和传播项来计算。进位位 C(i+1) 的计算公式为:
C(i+1) = G(i) + (P(i) · C(i))
其中,生成项 G(i) 和传播项 P(i) 定义为:
G(i) = A(i) · B(i)
P(i) = A(i) ⊕ B(i)
这种加法器的延迟大致与位数 n 成正比,相比行波进位加法器有巨大改进,但代价是进位计算逻辑变得复杂得多。
FPGA中的高效实现
当加法器在FPGA中实现时,我们还需要手动设计这些复杂电路吗?答案通常是否定的。
下图展示了4位行波进位加法器在Altera Max 10 FPGA中使用技术映射查看器工具的实现结果。它显示该电路是由四对三输入LUT级联实现的。通过此电路的延迟将仅为4个LUT延迟,而不是根据延迟公式计算出的11个门延迟。
如果我们使用更先进的FPGA架构,可能会获得更大的优势。下图展示了4位加法器在Altera Cyclone 5 FPGA中的实现结果。它显示该实现使用了三个六输入LUT,而不是多个一位加法器。其中一个六输入LUT用于实现一个两位加法器(针对第1位和第3位),另一个六输入LUT被拆分为两个三输入LUT,用于生成第0位和第2位的和。
那么,这个电路的延迟是多少?只有2个LUT延迟,比我们最初预想的要好得多。
设计权衡与总结
虽然在某些应用中使用超前进位或其他更复杂的加法器电路可能有益,但现代FPGA中粗粒度架构的存在使得这在许多情况下变得不必要。您选择的实现方式需要根据具体情况决定,因为其中涉及许多起初可能并不明显的权衡。这在FPGA设计中很常见,也是其魅力的一部分。
此外,Cyclone 5的逻辑单元(称为自适应逻辑模块,ALM)包含了快速进位链和全加器实现作为其逻辑单元的一部分,这使得加法器的实现特别快速和高效。



在本节课中,我们一起学习了:
- 加法器是基本的数字电路功能,可以轻松在FPGA中实现。
- 标准的行波进位加法器易于设计但性能较慢。
- 其他电路类型性能更好,但需要更多逻辑资源。
- FPGA利用LUT以及额外的算术电路(如进位链和全加器)使得加法器实现特别高效。
- 即使在FPGA中实现标准设计,也能获得出色的性能。
009:乘法器设计 🧮

在本节课中,我们将要学习在FPGA中设计乘法器的不同方法。乘法是数字逻辑或算术逻辑单元中的常见功能,但其电路实现可能非常复杂。我们将探讨各种实现方式的优缺点,并了解为何现代FPGA中的硬核乘法器通常是首选方案。
乘法器设计的挑战
上一节我们介绍了FPGA的基本逻辑单元。本节中我们来看看如何用这些单元构建乘法器。两个数字相乘是一个常见的数字逻辑功能,但可能需要大量的电路资源。多年来,这一直是设计人员面临的一个问题。
幸运的是,在FPGA内部有多种实现乘法器电路的方法。
使用基本门电路构建乘法器
既然加法器可以用门电路构建,我们是否也能用门电路构建乘法器呢?答案是肯定的。
以下是一个例子:一个2位乘以2位的二进制乘法器。通常,我们可以使用阵列乘法器来用门电路构建乘法器。其工作原理类似于手工乘法,包括部分积生成和部分积求和两个步骤。
但是,所需门电路的数量随着位数n的增加而呈n²增长。因此,对于超过4位乘以4位的乘法,顺序设计比加法器乘法器更高效。
FPGA中实现乘法器的主要方法
以下是几种在FPGA中构建乘法器的主要途径:
- 组合电路:速度快,但占用面积大。
- 顺序移位相加(状态机方法):面积小,但速度慢。
- 专用算法(如布斯算法、数据乘法器或华莱士树乘法器):速度快且面积小,但设计复杂。
- 使用存储器作为查找表:简单,但扩展性差(不适用于大位数)。
- 上述方法的组合。
- 硬核乘法器模块:如果FPGA内部集成了此类模块,在大多数情况下这是最佳解决方案。
深入探讨顺序移位相加法
考虑顺序移位相加的状态机方法。对于超过4位乘以4位的乘法,这种方法在面积上比组合乘法器更小,但速度更慢,因为移位和相加需要2n个时钟周期。
查找表法的应用场景
对于较小的输入,使用存储器进行乘法是一个不错的解决方案。例如,一个4位乘以4位的乘法可以通过使用一个具有8位地址的存储器来实现。
地址位a[7:4]可以表示乘数,而a[3:0]表示被乘数。存储器需要2⁸或256个存储位置。虽然存储单元相对廉价,但超过8位乘以8位后,所需的存储器会变得过于庞大和昂贵。

硬核乘法器的优势

硬核乘法器提供了任何FPGA实现中最快的速度,运行频率可达200 MHz或更高,即每次乘法仅需50纳秒。
典型的Max 10或Cyclone V等器件会提供数十到数百个可用的18位 x 18位乘法器电路供用户使用。
总结
本节课中我们一起学习了数字乘法器的设计。创建数字乘法器是一个具有挑战性的设计问题,大多数解决方案都有明显的缺点。在FPGA中实现乘法器有多种方法,包括组合电路、顺序电路或状态机、专用算法(如布斯算法等)、存储器以及硬核乘法器模块。

许多FPGA包含多个硬核乘法器模块,支持非常快速的18位 x 18位乘法,这为在数字逻辑中实现乘法器提供了可能是最佳的解决方案。
010:FPGA设计流程与示例设计 🚀
在本节课中,我们将学习完整的FPGA设计流程,并通过一个示例项目来实践。我们将使用Intel的Quartus Prime软件,从设计输入开始,经过仿真、综合、布局布线、时序分析,最终生成编程文件并下载到FPGA设备中。

概述
上一节我们介绍了可编程逻辑器件和FPGA的基本概念。本节中,我们将通过一个具体的设计示例,来详细讲解FPGA的标准设计流程。这个流程是开发任何FPGA项目的基础。
FPGA设计流程详解
下图展示了我们将要遵循的完整FPGA设计流程:

1. 设计输入
设计流程始于设计输入。Quartus Prime提供了多种方法来描述FPGA需要实现的逻辑。
以下是Quartus Prime支持的主要设计输入方法:
- 原理图输入:包括原理图捕获。
- IP核导入:导入预先设计好的功能模块。
- 硬件描述语言文本输入:支持VHDL、Verilog和SystemVerilog。
- 状态机输入:图形化状态机设计。
- EDIF文件导入:导入标准格式的网表文件。
你可以在同一个项目中使用多种设计定义方法,并且这些方法可以混合搭配使用。
2. 仿真验证
在完成初步设计后,需要进行仿真来验证逻辑功能是否符合预期。这是一个关键的验证步骤。
3. 综合与映射
接下来,工具将执行综合(也称为映射),将设计逻辑映射到目标FPGA器件的具体架构资源上。Quartus Prime的分析与综合模块会检查设计源文件中的错误,构建一个包含所有设计文件的层次化数据库,并对逻辑设计进行综合与优化。
4. 布局布线
综合之后,工具需要通过布局布线(或称为适配)在器件内部创建单元之间的互连。将设计适配到尽可能小的器件中是FPGA设计的一个主要挑战。Quartus Prime允许通过选择不同的适配策略来控制此过程。
以下是主要的适配策略:
- 平衡策略
- 高性能策略(针对速度优化)
- 低功耗策略
- 小面积策略
5. 设计视图与分析
Quartus Prime能以多种图形化视图展示设计的不同方面,这有助于理解和调试。
以下是几种有用的设计视图:
- RTL视图:展示综合前的寄存器传输级电路结构。
- 技术映射视图:展示综合后映射到具体器件资源的电路。
- 芯片规划器:展示芯片内部设计资源的使用情况,在调试时对定位问题区域非常有帮助。
这些视图可以让你对设计实现和技术建立信心,特别是对于有经验的硬件设计师,有助于培养对设计的直观感觉。
6. 时序分析
同步是可靠FPGA设计的基础,而时钟是同步信号。静态时序分析可以确定设计是否存在相对于时钟的时序违规(如建立时间或保持时间违规),它是实现时序收敛的主要工具,对所有FPGA设计都至关重要。
TimeQuest时序分析器使用一组方程来计算裕量,并确定Fmax(最大工作频率),这是衡量FPGA性能的一个重要指标。分析过程可以由一组称为约束的规则来指导,这些约束也有助于适配器优化时序驱动的设计。我们将学习如何编写有效的约束来提高Fmax。
7. 时序仿真
布局布线完成后再次进行仿真是一个好习惯,它可以发现潜在的时序问题。如果分析确认电路运行正常,就可以进行下一步。
8. 编程与测试
最后一步是使用工具生成编程文件,然后将其下载到FPGA设备中进行实际测试。
仿真工具:ModelSim
ModelSim是一个强大的仿真工具,与Quartus Prime集成。它可以为设计中的所有信号以及用于测试的激励信号创建精确的时序图。我们将使用这个工具来测试并更好地理解示例设计的操作。仿真结果将以时序图的形式显示,如下图所示。

本模块视频内容
在本模块的后续视频中,我们将通过实际操作详细学习FPGA设计流程,具体内容包括:
- FPGA设计流程概述
- 下载Quartus Prime
- 安装Quartus Prime
- Quartus Prime软件介绍
- 在Quartus Prime中创建设计项目
- 在Quartus Prime中创建顶层设计
- 编译设计
- 查看RTL视图
- 使用TimeQuest进行时序分析(第一部分)
- 使用TimeQuest进行时序分析(第二部分)
- 使用ModelSim仿真FPGA设计
总结

本节课中,我们一起学习了完整的FPGA设计流程。我们了解到,设计从输入开始,经过仿真验证、综合映射、布局布线、严格的时序分析,最终生成可下载到硬件中的编程文件。通过使用Quartus Prime软件的各种工具和视图,我们可以有效地完成设计、分析和调试工作。在接下来的实践中,我们将应用这个流程来完成一个具体的示例设计。
011:安装Quartus Prime 🛠️

在本教程中,我们将逐步指导您完成英特尔(Altera)Quartus Prime开发套件版本16.1的安装过程。Quartus Prime是一款强大的FPGA设计工具,我们将在课程中持续使用它来探索FPGA设计的世界。
概述 📋
安装过程包含几个关键步骤,请仔细遵循以避免出现问题。在程序安装过程中,您可以随时暂停本教程。整个安装需要约14GB的硬盘空间。
安装Quartus Prime主程序


首先,我们需要安装Quartus Prime开发环境的核心部分。
- 找到并运行安装程序
QuartusSetup.exe。 - 按照安装向导对话框的提示进行操作。
- 为获得最佳效果,建议使用默认的安装目录。
- 当进入“选择组件”界面时,请保持所有组件为勾选状态。
- 点击“下一步”,安装将开始。请确保您的硬盘有足够空间。
- 安装完成后,点击“完成”以启动程序。此时可能会运行设备驱动安装,请允许其完成。
至此,Quartus Prime主程序安装完毕。您可能会看到一个购买选项的对话框,除非您需要,否则无需选择。接下来,请运行Quartus Prime。如果程序没有自动启动,您可以在开始菜单或桌面上找到 Quartus Prime 图标并点击它。
在开始使用Quartus Prime之前,我们还需要安装两个重要组件:Quartus帮助文档和编程器。
安装Quartus帮助文档
上一节我们安装了主程序,本节我们来安装帮助文档,它对于学习和查阅功能至关重要。
- 运行Quartus帮助文档的安装程序
QuartusHelpSetup.exe。 - 您将看到安装向导界面,点击“下一步”。
- 为帮助文档选择一个安装目录,通常使用默认目录最安全。
- 确认有足够内存后,即可开始安装。您将看到安装进度界面。
- 安装完成后,Quartus帮助文档的安装就结束了。
安装Quartus编程器
安装好帮助文档后,接下来我们需要安装Quartus编程器,它用于将设计配置到FPGA芯片中。
- 运行Quartus编程器的安装程序
QuartusProgrammerSetup.exe。 - 您将看到安装向导界面,点击“下一步”。
- 在下一个屏幕上接受软件许可协议,然后点击“下一步”。
- 为编程器选择一个安装目录,同样建议使用默认目录。
- 确认有足够内存后,开始安装。
- 安装完成后,您可以关闭其他程序。点击“完成”后,安装程序可能会启动相关应用。
如果您在安装过程中遇到任何问题,可以在英特尔(Altera)官方网站的支持页面 Altera.com/support 找到更多帮助信息。
总结 ✅

本节课中,我们一起完成了Quartus Prime开发套件的完整安装。您现在已经成功安装了:
- Quartus Prime主程序
- Quartus帮助文档
- Quartus编程器
所有安装现已完成,您已经准备好开始在Quartus Prime中进行FPGA设计了。
012:Quartus Prime简介 🚀

在本节课中,我们将要学习Altera(现为Intel)的FPGA开发工具——Quartus Prime的基本界面和核心功能。我们将了解其主要窗口、设计流程以及常用菜单选项,为后续的实际设计工作打下基础。
界面概览
Quartus Prime启动后,会呈现多个执行不同功能的窗口。
初始时,中心窗口包含“新建项目向导”、“打开项目”的按钮,以及一些指向Altera帮助网页的链接。
打开项目与导航
为了展示此工具的功能,我们打开一个最近的项目。
通常,在设计编译完成后,中心窗口会显示编译报告。该报告展示了编译结果,包括引脚分配和逻辑资源利用率。这份报告包含重要的性能和调试信息。
左上角是项目导航器。所有设计都按项目组织。此处会显示设计层次结构,我们也可以查看项目文件、设计单元、IP组件和设计版本。
回到层次结构窗口,如果我们点击顶层模块,其底层结构会展开,我们可以看到设计中的各个组件。
设计流程窗口
左下角是设计流程窗口,也称为任务窗口。它包含了FPGA设计流程中的所有步骤:
- 分析与综合:分析设计输入。
- 布局布线:或称为适配。
- 汇编:生成编程文件。
- 时序分析。
- 网表编写:生成适配后仿真文件。
以下是每个步骤的简要说明:
- 分析:检查设计源文件的语法和逻辑错误。
- 综合:将设计转换为器件特定的逻辑原语。它使用约束来指导生成综合后网表。
- 适配器:使用约束来指导如何将逻辑放置到FPGA的逻辑单元中,以及如何连接元件之间的布线。它生成适配后网表。
- 汇编器:生成编程和配置文件。
- TimeQuest时序分析器:执行静态时序分析以确定设计的时序余量(如果成功也称为时序收敛)。它还确定最大可能时钟频率或Fmax。
只要前面的步骤已运行,其中任何一个步骤都可以单独运行。也可以通过“全编译”一次性运行整个流程。这些步骤也可以从工具栏图标或“处理”菜单中运行。
编译运行时,任务窗口会显示编译状态。
消息窗口与IP目录
屏幕底部是消息窗口。红色消息表示会停止编译的错误,绿色消息是信息提示,蓝色消息是警告。也可以在消息窗口中输入Tcl脚本命令。
右侧是IP目录,列出了Altera提供的所有IP核。如果关闭了IP目录,可以从“视图”菜单重新打开。
创建与编辑设计
要创建设计,可以从“文件”菜单中选择“新建”,点击工具栏中的“新建文件”按钮,或在任务窗口中双击“创建新设计”。
“新建文件”对话框会出现,提供多种设计输入方式的选择。
设计输入可以通过以下方式实现:
- 使用原理图输入。
- 使用HDL(AHDL、Verilog或VHDL)通过文本编辑器。
- 状态机编辑器。
- 使用Qsys系统编辑器进行系统创建。
整个设计不必只使用一种设计输入类型,可以混合搭配这些方法。
原理图通常用作顶层设计输入。AHDL和VHDL文件可以做成黑盒,作为块插入原理图中,然后IP核也可以被包含并与这些自定义块连接。状态机编辑器可用于创建状态机,然后生成代表该状态机的HDL代码。
现在,如果我们双击顶层模块,原理图编辑器会自动打开,显示pipelined_multiplier.bdf。
如果我们回到项目导航器的文件视图,会看到分别代表乘法器和寄存器的Verilog和VHDL文件。双击这些文件会在中心窗口打开它们,以便查看底层源代码。
每当打开VHDL或Verilog文件时,都会打开内置的文本编辑器。您可以使用此编辑器编辑和保存这些文件。
菜单功能详解
上一节我们介绍了如何创建和查看设计文件,本节中我们来看看Quartus Prime的主要菜单功能。
“编辑”菜单允许控制编辑过程。“视图”菜单允许您控制显示哪些窗口。任何窗口都可以分离以便更详细地查看,稍后再重新附着。
“项目”菜单允许您控制项目,可以添加或删除文件、添加或删除版本、归档项目以及生成PowerPlay早期功耗估算。
“分配”菜单功能特别强大,它允许您更改器件。您还可以看到各种开发板上使用的器件,包括我最喜欢的两个:BeMicro MAX 10和Odyssey MAX 10。“设置”对话框允许控制项目的许多方面,包括文件、编译设置、用于设计输入和仿真的EDA工具设置、编译器设置(这特别有趣,因为它控制设计的性能和功耗)以及许多工具的选项。“分配编辑器”是进行引脚分配的一种方法。“引脚规划器”也允许定义引脚分配,并提供器件的图片视图。
“处理”菜单允许控制编译过程并访问PowerPlay功耗分析器工具。
“工具”菜单是Quartus Prime的瑞士军刀。它允许您运行RTL或门级仿真、启动TimeQuest时序分析器、启动众多设计顾问中的任何一个、启动芯片规划器或设计分区规划器。
以下是“工具”菜单中部分重要功能的说明:
- 芯片规划器:提供器件资源的图形化视图,可以显示布线连接以及扇入和扇出。
- 网表查看器:网表查看器对于帮助理解综合器和适配器对设计做了什么非常有用。有时结果可能会让您感到惊讶。
- SignalTap逻辑分析仪:启动SignalTap逻辑分析仪。
- 编程器:启动编程器。
- 系统调试工具:启动几种系统调试工具中的任何一种。
- Nios II处理器软件构建环境:启动Nios II处理器软件构建环境。
- Qsys系统编辑器:Qsys简化了复杂的系统设计,允许在框图级别进行设计,并轻松地将IP核包含在层次化设计中。
- 自定义:自定义和设置Quartus Prime的选项。
接下来,“窗口”菜单显示活动窗口。“帮助”菜单提供了许多获取帮助的途径,包括访问教程。
总结与探索

正如您所看到的,Quartus Prime是一个功能丰富的设计环境。花些时间探索各种菜单项和工具。一段时间后,您会发现使用该工具会变得直观且功能强大。
现在我们已经熟悉了Quartus Prime所提供的所有功能,在下一个视频中,我们将创建我们的第一个FPGA设计。
013:在Quartus Prime中创建设计项目 🚀

在本节课中,我们将学习如何在Quartus Prime软件中创建一个新的设计项目。这是进行FPGA设计的第一步,我们将通过一个流水线乘法器项目来演示整个过程。


我们提供了设计文件,你可以跟随视频逐步操作。如果你还没有下载文件,可以在视频下方找到下载链接和安装说明。这些文件也包含在本周的课程材料中。
在Quartus Prime中输入命令时,可以随时暂停视频。以下是本视频的议程。
我们将首先使用新建项目向导创建一个项目。
然后向项目中添加文件和库,选择目标器件。
最后选择EDA工具并进行设置。

如果你还没有打开Quartus Prime,请先打开它。你应该已经将示例项目文件安装在 C:\altera\project\pipe_mult_QP16_1 目录下。如果没有,请先完成这一步。
接下来,我们将展示如何使用新建项目向导创建一个新的Quartus Prime项目。我们将使用这个流水线乘法器项目来演示如何创建一个原理图设计。
要打开新建项目向导,请点击“文件”菜单,然后点击“新建项目向导”。此时会出现介绍页面,点击“下一步”。
对于项目目录,请将路径更改为你安装示例项目的目录,这里是 C:\altera\project\pipe_mult_QP16_1\schematic。输入 pipe_mult 作为项目名称,然后按回车键。同时,将顶层设计实体也命名为 pipe_mult,软件可能已经为你自动填充了这个名字。你也可以根据需要更改顶层实体名称以匹配你的设计文件。完成后,点击“下一步”。
你可以创建一个空项目,或者使用项目模板来快速启动。对于本例,我们使用空项目,以便从头了解其工作原理。点击“下一步”。
接下来,我们将向设计添加源文件。浏览到项目目录内的 ram.vhd 文件。选择 ram.vhd 文件,点击“打开”,将 ram.vhd 添加到项目中。
为了包含包含用户定义或供应商提供的宏功能、块符号文件和其他源文件的库目录,我们点击“用户库”按钮。我们可以为要添加的库使用绝对或相对路径名。我们将 Megafunctions 项目库添加到 pipe_mult 项目中。使用全局库名称和位置:C:\intelFPGA\16.1\quartus\libraries\megafunctions。点击“下一步”继续向导的下一页。
选择 MAX 10 作为器件系列。你可以使用封装、引脚数和速度等级选项来缩小选择范围。选择 FBGA 封装,484 引脚,速度等级 8。最后,我们选择 10M08DAF484C8GES 这个具体型号。这定义了项目所用的器件与B micromax 10开发套件上的FPGA相同,你之后可以将此设计定位到该开发板。点击“下一步”继续。
我们可以在Quartus内部运行其他EDA工具。EDA设置页面允许你指定用于本项目综合、仿真和时序分析的工具。对于仿真,选择 ModelSim-Altera,格式选择 VHDL。所有其他默认的EDA工具设置都可以正常工作,因此点击“下一步”接受它们。
摘要页面显示了设计项目的基本信息。最好检查一下以确保条目正确。点击“完成”以完成项目创建。
现在,项目名称显示在顶部标题栏中,项目实体出现在项目导航器窗口的层次结构选项卡中。你现在已准备好为此项目创建设计文件,这将是下一个视频的主题。
关于项目的一些说明:Quartus将所有创建FPGA设计所需的文件组织到项目中。Quartus Prime有多种管理项目的方式。你可以通过从“项目”菜单中选择“归档项目”来归档项目。归档文件的扩展名为 .qar。你可以选择将哪些文件包含在归档中。通常用于压缩项目以便与他人共享。你也可以使用“复制项目”命令将项目复制到服务器或云上的另一个位置。
要查看项目中已打开的设计文件,我们在项目导航器中点击“文件”选项卡。它列出了项目中的设计文件。双击 ram.vhd 文件以在文本编辑器中打开它。
ram.vhd 文件在文本编辑器中打开。Quartus Prime文本编辑器是一个很好的编辑器,用于输入HDL设计,具有行号、语法着色和模板插入功能。使用“插入模板”命令将HDL、Tcl或宏功能模板插入到设计文件中。目前,你无需担心这段VHDL代码如何工作,这将是本专业课程第二部分的主题。然而,我们将能够在下一个视频中使用这段代码来完成一个设计。

在本视频中,你学习了如何在Quartus Prime中创建一个项目,如何为你的项目选择目标器件,以及如何向你的项目添加文件和库。

在下一个视频中,我们将探索如何完成此项目的设计输入。


014:在Quartus Prime中完成设计

概述

在本节课中,我们将学习在Quartus Prime软件中创建FPGA设计的多种方法。我们将重点介绍原理图捕获、IP核导入、HDL文本输入(包括VHDL、Verilog和SystemVerilog)、状态机编辑器以及导入第三方文件。课程将通过一个具体的设计实例,演示如何选择和使用这些方法,并完成从创建顶层原理图到连接设备引脚的完整流程。
创建顶层原理图文件
首先,我们需要为设计创建一个顶层原理图文件。原理图编辑器允许我们通过图形化的逻辑符号来表示和连接设计中的各个模块,这对于文档化和连接高级设计模块非常有用。
以下是创建和操作原理图的基本步骤:
- 打开Quartus Prime:确保已安装示例项目文件,并打开项目目录
C:\Altera_PRJ\pipe_mult\QP16。 - 打开现有原理图:从“文件”菜单中选择“打开”,然后选择
pipe_mult.bdf文件并打开。 - 理解原理图编辑器:该编辑器允许通过描绘代表逻辑器件、HDL文件、IP核和原理图的符号来包含逻辑块功能。块是代表设计实体及其端口信号的矩形形状。
从IP核创建原理图符号
上一节我们打开了原理图编辑器,本节中我们来看看如何将预设计的IP核模块添加到原理图中。IP核是可以在Quartus Prime中定制的预设计模块,从简单逻辑到复杂的PLL或DDR内存控制器都有。
以下是添加IP核符号的步骤:
- 打开IP目录:如果IP目录窗口不可见,请从“工具”或“视图”菜单中打开它。
- 选择IP核:在右侧的IP目录窗口中,依次展开“Library” -> “Basic Functions” -> “Arithmetic”,找到“LPM_MULT”并双击。
- 配置IP核:在弹出的“MegaWizard Plug-In Manager”对话框中,将输出文件命名为
mult。将数据A和数据B的宽度设置为8位,并接受其他所有默认设置。 - 设置输出延迟:在后续页面中,选择“Yes, I want an output latency of”,并指定为2个时钟周期。
- 生成符号:在最后的摘要页面,确保勾选“mult.bsf”(原理图符号文件输出),然后点击“Finish”完成创建。当询问是否将IP文件添加到项目时,选择“是”。
- 插入符号:回到原理图编辑器,双击空白区域打开符号对话框。在“Project”文件夹下找到并选择
mult符号,点击“OK”将其放入原理图中,并放置在合适位置。按Ctrl+S保存pipe_mult.bdf文件。
从HDL文件创建原理图符号
除了使用IP核,我们还可以将编写的HDL代码转换为原理图符号。这允许我们将文本描述的设计模块直观地集成到顶层原理图中。
以下是创建HDL符号的步骤:

- 打开HDL文件:从“文件”菜单中打开
ram.vhd文件。这是一个用于推断单端口32x16位同步RAM的VHDL文件。 - 创建符号文件:在文本编辑器中打开该文件后,再次点击“文件”菜单,选择“Create/Update” -> “Create Symbol Files for Current File”。
- 确认创建成功:在消息窗口中应看到“Create Symbol File was successful”的提示。
- 插入符号:回到原理图编辑器,双击空白区域打开符号对话框。在“Project”文件夹下找到并选择
ram符号,点击“OK”将其放入原理图中。
连接符号与设备引脚
现在我们已经将乘法器IP核和RAM模块的符号放入了原理图,接下来需要将它们相互连接,并连接到FPGA设备的物理引脚上。在原理图中,我们使用导线、总线和节点进行连接。
以下是连接各个部分的步骤:
- 连接RAM时钟:首先放大视图以便操作。从RAM符号的时钟端口拖动鼠标,绘制一条导线连接到原理图中已有的时钟输入节点。
- 连接数据输入:将RAM的数据输入端口连接到乘法器的结果输出端口。
- 连接地址总线:分别连接RAM的写地址和读地址总线到相应的信号源。
- 连接写使能信号:连接RAM的写使能信号。
- 连接RAM输出:将RAM的数据输出端口连接到一个D触发器的输入。
- 添加输出引脚:双击原理图空白处,在符号对话框中选择“Primitives” -> “Pin” -> “output”,添加一个输出端口符号。双击该符号,将引脚名称改为
q[15..0]。 - 连接输出:将D触发器的输出连接到刚添加的输出引脚符号上。
- 检查最终原理图:完成后,你的原理图应与示例类似。这表明你已成功完成了该设计的输入部分。
总结

本节课中,我们一起学习了在Quartus Prime中进行FPGA设计输入的多种方式。我们实践了如何选择和配置一个IP核乘法器,如何从HDL源文件创建原理图符号,以及如何通过原理图将逻辑模块和IP核连接起来,最终映射到FPGA的物理引脚上。这个过程展示了即使对于相对复杂的电路,使用图形化工具进行设计输入也并非难事。
015:设计编译 🚀

在本节课中,我们将学习如何在Quartus Prime软件中编译一个FPGA设计。我们将从准备设计文件开始,逐步完成编译设置、执行完整编译、分析结果、创建设计修订版本,最后归档项目。

编译器概述
上一节我们介绍了设计输入,本节中我们来看看如何将设计转化为可以在FPGA上运行的编程文件。Quartus Prime编译器是一套软件模块,它执行以下任务:
- 综合:将设计源文件转换为门级网表。
- 布局布线:将逻辑映射到目标FPGA的具体逻辑单元并连接它们。
- 汇编:生成用于配置FPGA的编程文件。
- 分析:验证设计的时序和功耗等性能。
你可以一次性运行所有步骤,也可以分步独立运行。编译器允许你应用多种优化技术,例如时序驱动编译,以优化资源使用和提高设计速度。
准备编译设置
在开始编译之前,我们需要配置编译器以获得期望的结果。这些设置主要通过“Assignments”菜单进行。
以下是关键设置步骤:
- 指定目标器件:在“Assignments”菜单中选择“Device”。这通常已在创建项目时设置好,但可以在此修改。本教程中我们保持默认设置。
- 配置编译器设置:在“Assignments”菜单中选择“Settings”。在“Compiler Settings”页面,你可以控制布局布线过程的优化目标:
- Balanced:平衡性能、功耗和面积。
- Performance:优化设计运行速度。
- Power:优化以降低功耗。
- Area:优化以减少逻辑资源使用。
- 启用功耗分析:在“Settings”对话框的“PowerPlay Power Analyzer”页面,勾选“Run PowerPlay Power Analyzer during compilation”,以便在编译后获得功耗估算。
- 了解设置文件:所有编译器设置都保存在项目的
.qsf文件中。你可以通过“File” -> “Open”打开此文件查看,或通过“View” -> “Utility Windows” -> “Tcl Console”使用Tcl命令进行修改。
执行完整编译
设置完成后,即可开始编译。确保在“Project Navigator”中双击顶层设计实体(例如 pipe_malt)以打开原理图。
从“Processing”菜单中选择“Start Compilation”,或点击工具栏上的三角形图标。编译过程将在“Task”窗口中显示进度,在“Messages”窗口中显示系统信息。编译报告会自动在中央窗口打开。
编译成功完成后,每个步骤旁会出现绿色的对勾。
分析编译结果
编译完成后,我们可以通过多种工具分析结果。
项目导航器:显示项目的完整层次结构、所有设计文件和单元。你可以右键点击实体,使用“Locate”功能在原理图或平面布局图中定位它,这称为交叉探测。
编译报告:提供当前编译的详细信息。报告左侧窗格列出了所有可用的报告类别。
以下是需要关注的关键报告:
- Flow Summary:显示编译状态、器件型号、资源使用情况(逻辑单元、引脚、存储器等)。
- Timing Analyzer Report:提供时序分析结果。点击“Slow 1200mV 85C model”下的“Fmax Summary”,可以查看设计在该工艺角下的最大时钟频率。公式 Fmax 是评估FPGA性能的关键指标。
- Setup & Hold Summary:查看建立时间和保持时间裕量。Slack 表示时序裕量,正数表示满足时序要求,负数(标红)表示时序违规。
创建与比较设计修订
为了比较不同编译器设置或约束下的效果,我们可以创建设计修订。
- 在“Project”菜单中选择“Revisions”打开修订对话框。
- 点击“Create”创建新修订。输入修订名(如
pipe_malt2),并选择基于哪个现有修订。 - 为新修订更改编译器设置(例如,将优化目标从“Balanced”改为“Performance”)。
- 编译新修订。你可以在“Project Navigator”的“Revisions”标签页中右键点击该修订,选择“Compile”。
- 编译完成后,在“Project” -> “Revisions” -> “Compare”中比较两个修订的结果。比较报告可以导出为CSV文件。
归档项目
完成工作后,建议保存并归档项目,以便分享或备份。
- 使用“File” -> “Save Project”保存项目。
- 使用“Project” -> “Archive”或双击“Task”窗口中的“Archive”任务。
- 在对话框中选择“Archive all revisions”并点击“Archive”。这将在项目目录中生成一个
.qar压缩文件。 - 如需恢复项目,使用“Project” -> “Restore Archived Project”。
总结


本节课中我们一起学习了Quartus Prime FPGA设计编译的全过程。我们掌握了如何指定编译器设置以优化性能、功耗或面积;如何执行完整编译并监控进度;如何利用编译报告和项目导航器分析资源使用和时序结果;如何通过创建设计修订来对比不同编译策略的效果;以及最后如何归档项目以便管理。这些是完成FPGA设计流程的关键步骤。
016:查看RTL与技术视图 🔍


在本节课程中,我们将学习如何使用Quartus Prime软件中的RTL查看器、技术映射查看器、芯片规划器和功耗分析器来分析一个FPGA设计。通过这些工具,你可以从逻辑层面、技术实现层面以及物理布局层面深入理解你的设计,并评估其功耗。
打开项目与工具概览
首先,在Quartus Prime中打开上一节视频中已编译完成的Pipe_Mac项目。Quartus Prime提供了多种分析工具,用于验证设计结果是否符合预期。有时编译器会产生意想不到的结果,FPGA设计师会利用这些分析工具来确认设计。
在“Tools”菜单下,点击“Netlist Viewers”,你将看到四个不同的查看工具:
- RTL Viewer:从纯逻辑设计角度查看设计。
- Technology Map Viewer (Post-Mapping):查看综合后映射到FPGA基本单元的设计。
- Technology Map Viewer (Post-Fitting):查看布局布线后的设计。
- State Machine Viewer:查看状态机。
这些网表查看器是图形化工具,让你能够直观地看到综合及布局布线的结果。你也可以在任务窗口的“Analysis & Synthesis”或“Fitter”部分找到它们。
使用RTL查看器
RTL查看器以最简单的原理图形式展示设计,可用于验证设计输入和逻辑。该工具在“Analysis & Elaboration”步骤后即可使用。
从“Tools”菜单,选择 Netlist Viewers -> RTL Viewer。查看器会显示乘法器、RAM和输出端的D触发器,这与你的原理图类似。输入端口在左侧,Q输出端口在右侧。
你可以通过展开左侧窗格的“Netlist Navigator”来检查每个主要模块由哪些组件构成。以下是导航器中的主要项目:
- Instances:列出设计实例,如乘法器和RAM。
- Primitives:列出FPGA架构中的基本单元。
- Ports:列出所有输入和输出端口。
点击mult_inst模块右上角的加号(+),可以逐级展开乘法器实例,直到看到最基本的原子单元(如mac_mult1和mac_out2块)。同样,展开RAM模块会显示同步RAM块本身、读地址寄存器和输出寄存器。完成查看后,通过“File -> Close”关闭RTL查看器。
使用技术映射查看器
上一节我们使用RTL查看器从逻辑层面审视了设计。本节中,我们来看看设计被映射到具体FPGA硬件单元后的样子。
技术映射查看器(映射后) 让你查看设计综合后被映射到FPGA基本单元(包括每个输入/输出到管脚的缓冲器)的结果。从“Tools”菜单,选择 Netlist Viewers -> Technology Map Viewer (Post-Mapping)。视图中细节更多,但乘法器和RAM的视图与RTL查看器非常相似,只是每个基本单元都被具体枚举。查看完毕后关闭它。
技术映射查看器(布局布线后) 让你查看布局布线后的最终设计。从“Tools”菜单,选择 Netlist Viewers -> Technology Map Viewer (Post-Fitting)。使用“View -> Zoom In”放大查看。滚动到底部,你会看到新增的JTAG和配置接口信号(如TMS、TDI、TCLK等)。对于这个相对简单的设计,此视图与其他视图差异不大。关闭查看器。
由于本设计中没有状态机,状态机查看器暂时没有帮助,因此我们跳过它。
使用芯片规划器进行分析
接下来,让我们看看芯片规划器。点击“Tools”菜单,然后选择“Chip Planner”。
芯片规划器以可视化方式展示器件资源在芯片上的实际布局。它可以用于分析设计、创建平面布局图,以及在设计中实施工程变更单(ECO)。结合其他Quartus Prime工具,你可以定位特定设计实体或时序路径在目标器件上的实际位置。
芯片规划器显示的细节级别取决于当前的缩放级别以及右上角“Layer Settings”选项卡中选择的模式。使用 Ctrl + 空格 放大,Shift + Ctrl + 空格 缩小。通常,逻辑阵列块(LAB)显示为蓝色,DSP块显示为白色列,RAM块显示为棕褐色列。规划器使用渐变色,资源利用率越高,颜色越深。
点击单个模块会在屏幕右侧的“Node Properties”窗口中显示其电路图。芯片规划器有两种编辑模式:
- Assignment模式:允许进行在下一次布局布线操作中由适配器应用的更改(如管脚分配、位置分配)。
- ECO模式:允许进行布局布线后更改(如逻辑布局或布线),这些更改在下次编译后不会保留。
你可以使用芯片规划器检查特定器件资源的扇入和扇出。点击一个RAM块,然后点击工具栏上的“Generate Fan-Out”图标或通过“View -> Generate Fan-Out”查看其扇出路径。同样,通过“View -> Generate Fan-In”可以查看扇入路径。使用“View -> Clear Unselected Connections”可以清除这些路径显示。分析完成后,通过“File -> Close”关闭芯片规划器。
进行功耗分析
最后,我们来学习如何进行功耗估算。准确的功耗信息对于电路板电源设计至关重要。
早期功耗估算器(EPE) 是一个基于电子表格的分析工具,可根据器件选型、资源利用率和操作条件进行早期功耗估算。虽然其内部模型很准确,但整体准确性依赖于对器件时钟速度和布线的估计,这可能并不完美。你可以从Altera官网下载EPE工具(如max10_ep.xls)。
EPE的数据可以手动输入,也可以从项目导入。在Quartus Prime的“Project”菜单中,点击“Generate PowerPlay Early Power Estimator File”可以生成一个.csv文件。在EPE工具中点击“Import CSV”即可导入此文件进行估算。为了电源设计,通常需要查看“最大”功耗值,并在右侧选择相应的电源轨配置以获取各电压的电流估算。
PowerPlay功耗分析器 在完成设计后使用,能提供更精确的功耗估算。该工具非常易用,几乎不需要用户输入。在Quartus Prime的“Tools”菜单下,选择 PowerPlay Power Analyzer Tool。最佳精度来自于使用门级仿真产生的信号活动数据。如果没有,可以使用无向量估算。在分析器窗口中向下滚动并点击“Start”。运行成功后,消息窗口会显示总功耗估算值(例如53.4 mW)。你还可以通过更改设置(如将功耗特性改为“Maximum”)来估算最大功耗。


本节课中,我们一起学习了如何使用RTL查看器和技术映射查看器从不同层面审视FPGA设计,如何利用芯片规划器分析设计的物理布局与连接,以及如何使用早期功耗估算器和PowerPlay功耗分析器来评估设计的功耗。掌握这些分析工具对于理解和优化FPGA设计至关重要。
017:TimeQuest时序分析(全)⏱️

在本节课中,我们将要学习时序分析的基础知识,包括TimeQuest时序分析器所使用的计算方法和术语。
概述
时序分析是现代数字设计,尤其是FPGA设计中至关重要的一环。它确保数据在正确的时刻被可靠地捕获,从而避免系统出现错误。本节我们将探讨时序分析的基本原理、常见问题及其解决方法。
时钟与同步
时钟是现代数字电子学的基础。它们提供同步信号,这是实现无误数据传输的必要条件。
当数字线路上的数据从一个值转换到另一个值时,在转换期间数据值是不正确的。我们需要等待数据稳定后才能使用它。这个同步信号就是时钟。
数据必须在时钟边沿之前和之后保持稳定,才能被可靠地传输。如果未能正确同步,将会引发一系列设计问题。
时序问题与危害
如果未能正确同步,将会引发一系列设计问题,例如:
- 时序冒险:由路径延迟不等导致的意外或不需要的信号,例如毛刺。这是工程师们极力避免的情况。
- 亚稳态:由时序违规导致触发器输出处于不确定状态,从而引发错误数据。
- 竞争条件:根据操作条件出现的违规,导致错误时隐时现,是工程师们的主要困扰来源之一。
- 时钟偏移:另一个导致违规的意外来源。
静态冒险分析
静态冒险是不等逻辑延迟的后果。下图展示了使用卡诺图来最小化特定逻辑函数的逻辑。

你能看出由于路径延迟,这个电路可能存在什么问题吗?
使用时序图分析电路,揭示了在某个时间段内会产生一个毛刺脉冲,此时逻辑电路的输出与逻辑方程预期的结果不符。如果B和C始终为1,我们预期F应始终为1。但由于存在的延迟,事实并非如此。
一种消除冒险的方法是通过增加额外的逻辑,如下图所示增加一个与门。

然而,更好的方法是使用触发器和同步设计,它只允许在数据正确且稳定的时钟边沿进行数据传输。
同步电路与术语
以下是静态时序分析器能够分析的基本同步电路。时钟A和时钟B可能来自同一个源,但路径延迟可能不同,尤其是在路由可以改变的FPGA中。

在讨论时序分析时,我们需要一些通用的术语:
- 发射沿:激活源寄存器和寄存器间路径的时钟边沿。
- 锁存沿:激活目的寄存器并捕获数据的时钟边沿。
TimeQuest通过分析时序路径在发射沿和锁存沿之间的延迟来衡量性能。
建立时间与保持时间
- 建立时间:在时钟边沿之前,数据信号必须保持稳定的最短时间。
- 保持时间:在时钟边沿之后,数据信号必须保持稳定的最短时间。
如果这些最短时间未被满足,就会发生建立时间或保持时间违规,可能导致数据错误或寄存器亚稳态。
建立时间和保持时间共同构成了数据需求窗口,即数据必须在时钟边沿周围保持稳定的时间段。
时序计算
上一节我们介绍了基本概念,本节中我们来看看具体的时序计算。
数据到达时间是数据从公共时钟边沿到达目的寄存器D输入端的时间。
用公式表示,数据到达时间等于:
数据到达时间 = 发射沿 + T_clock_A + T_clock_to_out + T_data
核心概念是比较数据到达的时间与时钟到达的时间,以判断是否存在建立或保持违规。
时钟到达时间是时钟从公共时钟边沿到达目的寄存器时钟输入端的时间。
时钟到达时间等于:
时钟到达时间 = 锁存沿 + T_clock_B
你认为时钟路径中的延迟是有益还是有害?它会导致时序要求违规吗?
建立时间需求的数据需求时间是数据被锁存进目的寄存器所需的最短时间。
建立时间需求的数据需求时间等于:
数据需求时间_建立 = 时钟到达时间 - T_SU
T_SU是所有触发器器件的基本要求,在FPGA数据手册中指定。该值因FPGA系列而异。
保持时间需求的数据需求时间是数据被锁存进目的寄存器所需的最短时间。
保持时间需求的数据需求时间等于:
数据需求时间_保持 = 时钟到达时间 + T_H
FPGA触发器的典型保持时间通常为零或1纳秒。
时序裕量
建立时间裕量是满足建立时间要求的余量。
建立时间裕量等于:
建立裕量 = 数据需求时间_建立 - 数据到达时间
建立裕量也可以表示为:
建立裕量 = 时钟周期 + T_clock_B + T_SU - T_clock_A - T_clock_to_out - T_data
现在可以看出,时钟B路径的延迟实际上增大了建立裕量。所以有时延迟是件好事。然而,时钟A路径的延迟对我们不利,逻辑和触发器时钟到输出的延迟也是如此。
保持时间裕量是满足保持时间要求的余量。
保持时间裕量等于:
保持裕量 = 数据到达时间 - 数据需求时间_保持
这与建立裕量的计算正好相反。保持裕量等于:
保持裕量 = T_clock_A + T_clock_to_out + T_data - T_clock_B - T_H
在这里,时钟B的延迟对我们不利,但时钟A的延迟对我们有利。
约束与时序收敛
根据设计者输入的时钟和延迟约束形式的要求,TimeQuest可以生成供适配器使用的信息,以调整布线延迟来满足所有要求。
当所有时序要求都得到满足时,这种状态称为时序收敛。
实现时序收敛可能是FPGA设计中最困难的挑战之一,这就是为什么在时序分析上要花费大量时间和精力的原因。
I/O时序分析
I/O时序分析使用相同的裕量方程,因为两个寄存器之间的数据传输仍然存在建立和保持要求。

下图显示了输入延迟的情况。数据输入相对于时钟的净到达时间称为输入延迟。输出的净延迟时间称为输出延迟。

为何需要了解这些术语和计算?
理解这些计算在发生时序违规时非常重要,因为你需要知道违规的原因才能修复它。
违规可能由以下原因引起:布线路径过长、约束定义不足、时钟偏移以及其他多种原因。时序分析帮助我们找到这些违规的根本原因。

TimeQuest分析器使用这些方程来计算裕量,并确定Fmax(FPGA性能的一个重要指标)。我们学到的术语用于时序报告中,因此在阅读报告之前,将这些术语牢记于心非常重要。
以下是一个时序报告示例。请注意数据到达时间、数据需求时间的使用,以及裕量的计算(本例中为负值,表示存在建立时间违规)。
使用TimeQuest进行时序分析
我们如何使用时序分析器TimeQuest进行时序分析?以下是使用时序分析器的基本步骤:
- 生成时序网表。
- 输入SDC约束。
你可以通过创建或读入一个SDC文件来完成此步骤,这是推荐的方法。或者,你也可以直接在控制台中约束设计。
接下来,你更新时序网表,然后生成时序报告并保存时序约束。
以下是使用时序约束的一些指导原则:
- 总体原则:用户必须为所有路径输入约束,以完全分析设计。这是因为时序分析器只对受约束的设计路径执行裕量分析。
- 约束的作用:约束指导适配器进行布局和布线,以满足时序要求。
- 建议:约束所有路径,或者至少约束时钟和I/O。
这听起来可能很困难,但实际上并非如此,因为通配符可以帮助匹配信号并将它们分组。一个单一的通用约束可以覆盖许多路径,甚至是整个时钟域中的所有路径。
我们将在下一个视频中使用TimeQuest来分析我们的PIPEM项目。
总结

本节课中我们一起学习了时序分析的基础知识、时序冒险的产生原因及避免方法、时序分析的术语和计算,以及使用TimeQuest进行时序分析的指导原则。掌握这些是进行可靠FPGA设计的关键。
018:TimeQuest时序分析(二)⏱️


在本节课中,我们将学习如何使用TimeQuest时序分析器来约束、分析并报告设计中所有逻辑的时序性能。

TimeQuest时序分析器是一个工具,它使用行业标准的分析方法和文件类型来验证您设计中的所有时序。
我们将使用上一个视频中的设计文件,在Quartus Prime中进行分析,以便您可以跟随操作并执行每个步骤。在向Quartus Prime输入命令时,您可以随时暂停视频。

以下是本视频将涵盖的内容:
- 在FPGA设计上运行TimeQuest时序分析器。
- 创建时序网表。
- 在TimeQuest中编写约束。
- 使用TimeQuest报告来解决时序问题。
- 创建并保存SDC约束文件。
- 通过时序驱动编译实现时序收敛。
启动TimeQuest并创建时序网表

首先,打开Quartus Prime并打开Pipe_Mt项目。此时,您应该已完成示例项目文件的编译。

在“Tools”菜单中,点击“TimeQuest Timing Analyzer”。观察分析器的布局:
- 任务窗格:提供对TimeQuest工作流程中常用功能的快速访问。
- 报告窗格:列出分析器生成的报告。
- 视图窗格:显示选中的报告。
- 控制台:显示在GUI或命令行界面中执行的SDC或Tcl命令。
要使用TimeQuest分析器,必须首先创建一个时序网表。时序网表由设计中所有源和目的时序元件的名称,以及最小和最大时序路径延迟信息组成。TimeQuest从编译结果中推导出网表。
TimeQuest使用行业标准术语来标识时序元件:
- Cell:基本器件构建块,包括逻辑单元、寄存器、乘法器、存储器或PLL。
- Pin:单元的输入或输出。
- Net:引脚之间的连接。
- Port:顶层器件引脚。
以下是创建时序网表的步骤:
- 点击“Netlist”菜单,然后点击“Create Timing Netlist”。
- “Create Timing Netlist”对话框打开,允许您选择输入网表和要使用的速度模型。
- 为输入选择“post-fit”,为速度选择“slow corner”。为了完全验证设计的时序,您应该始终运行所有模型以确保它们都通过。
- 网表创建完成后,您将在任务窗口中看到一个绿色的对勾标记。
创建时钟约束
接下来,我们需要创建时钟约束。您可以告知时序分析器时钟频率要求,这将首先用于分析目标是否达成,随后用于驱动适配过程以尝试实现此目标。
正如我们所见,时钟周期是建立时间计算的重要组成部分。随着周期缩短,建立时间裕量也会缩小。在某个临界点,将不再有裕量,此时设计运行在其最大频率,即 Fmax。
以下是创建时钟约束的步骤:
- 点击“Constraints”菜单,然后点击“Create Clock”。
- “Create Clock”对话框打开,您可以输入
CLK1作为时钟名称,并将周期设置为8纳秒。 - 要设置目标,点击框右侧的浏览按钮,打开“Target Name Finder”。
- 要选择要查找的信号类型,点击左上角集合列表的下拉箭头,选择“get_ports”以查看所有端口名称,然后点击下方的“List”。
- 选择
clock1时钟信号名称,点击右箭头按钮将其添加到“Selected Names”列表中,然后点击“OK”。 - 回到“Create Clock”对话框,点击“Run”。
clock1时钟被创建,等效的SDC命令也会出现在控制台中。
您也可以通过直接在控制台中输入SDC命令来添加约束。
为了用时钟约束信息更新时序网表,我们在任务窗格中双击“Update Timing Netlist”。完成后,我们会看到另一个令人愉悦的绿色对勾。现在,我们可以通过双击任务窗格“Diagnostics”文件夹下的“Report Clocks”来报告时钟时序。
约束输入和输出
除了约束时钟,我们还需要约束输入和输出。时序分析器知道所有内部时序延迟,但没有任何关于器件外部时序延迟的信息,因此我们需要通过定义输入延迟和输出延迟来提供这些信息。
输入延迟是所有外部延迟的净总和,通常包括从公共时钟源到外部器件触发器的延迟、触发器时钟到输出的延迟、PCB走线到FPGA输入的延迟,减去从公共时钟源到FPGA时钟输入的延迟。为了精确,您需要PCB延迟的测量值或模型,以及驱动输入的外部器件的数据手册信息。通常,输入延迟为几纳秒,但也可能为负值。最大延迟通常比最小延迟稍大一些。
现在,我们将使用set_input_delay命令,为两个8位输入总线dataA和dataB,相对于clock1,设置3纳秒的最大输入延迟和2纳秒的最小输入延迟。
- 点击“Constraints”菜单,然后点击“Set Input Delay”。
- 点击时钟名称列表下拉箭头,选择
clock1。 - 选择“Maximum input delay”选项,并输入
3 ns作为延迟值。 - 像之前一样点击浏览按钮查找数据端口名称。从集合下拉列表中选择“get_ports”,然后点击“List”。
- 在右上角的过滤框中输入
data*并按回车,以仅过滤出数据总线。 - 点击“List”列出它们,然后点击“OK”,接着点击“Run”来设置输入延迟。
此时,视图窗格的背景变为黄色,表示时序网表现在已过期。
在更新网表之前,我们可以通过几个按键在控制台中直接添加最小输入延迟:
- 点击控制台中的Tcl提示符,然后按向上箭头键。这将复制之前的
set_input_delay命令。 - 然后将
max改为min,将3改为2,以添加2纳秒的最小输入延迟。
以类似的方式,我们可以通过输入命令,使用Q*作为目标,快速添加2纳秒最大和1纳秒最小的输出延迟。
为了验证我们的输入,可以通过双击任务窗格中的“Report SDC”来查看列出新I/O约束的报告。这也会更新时序网表。我们可以在报告窗格的“SDC assignments -> set_input_delay”下看到约束列表。
查看时序报告
接下来,让我们查看一些摘要报告,包括未约束路径、裕量直方图和单个路径时序。
- 首先,通过双击任务窗格底部“Macros”文件夹下的“Report All Summaries”来生成摘要报告。您可能会看到红色,表示存在建立时间违规,我们稍后会处理。
- 接下来,在“Diagnostics”下,双击“Report Unconstrained Paths”以查看列出所有路径及其是否被约束的报告。您应该看到一些输入端口未被约束。
- 现在,在报告窗格中,点击“Summary”。摘要建立时间报告显示裕量值为-0.859,这表明时序要求未满足。为了获得正裕量,我们可以将时钟周期增加1纳秒。
- 为了进一步调查,点击“Reports”菜单,然后“Custom Reports”,接着点击“Create Slack Histogram”以创建说明裕量结果的裕量直方图。在出现的对话框中,点击时钟名称列表下拉箭头,选择
clock1,然后点击“OK”。我们清楚地看到许多信号存在违规。 - 现在,要查看特定路径,我们再次点击“Reports”菜单,然后“Custom Reports -> Report Timing”。在此对话框中,点击“From clock”框旁边的下拉箭头,选择
clock1,然后点击“Report Timing”。随后,我们看到数据到达路径和数据需求路径的计算。我们发现从存储器输出到Q9寄存器输入的延迟过大。
通过时序驱动编译修复时序问题
我们将通过运行时序驱动编译来修复此问题,该编译会优化逻辑布局以满足您的时序要求。
为了执行时序驱动编译,我们需要将约束保存到SDC文件中,重新编译设计,然后查看TimeQuest结果。
以下是保存约束到SDC文件的步骤:
- 首先,在TimeQuest的“Constraints”菜单中,点击“Write SDC File”。“Write SDC File”对话框应打开。
- 删除文件名中的
.out,然后点击“OK”。 - 点击右上角的“X”关闭TimeQuest并返回Quartus Prime。
要启动时序驱动编译:
- 点击“Processing”菜单,然后“Start Compilation”。
- 编译完成后,点击“OK”。在控制台窗口中,我们看到TimeQuest运行没有错误,表示成功。编译报告窗口中的报告可能仍然是红色的,但这是因为我们还有一些未约束的路径。慢速85度模型具有正裕量,Fmax为128 MHz,其他模型也没有违规。
移除剩余未约束路径
为了移除剩余的未约束路径:
- 再次启动TimeQuest。
- 点击“Constraints”菜单,然后“Set Input Delay”。
- 点击时钟名称列表下拉箭头,选择
clock1。 - 选择“Maximum input delay”选项,并输入
3 ns作为延迟值。 - 像之前一样点击浏览按钮查找端口名称。从集合下拉列表中选择“get_ports”,然后点击“List”。
- 在列表中向下滚动经过Q信号,选择下一个信号
read_address[0],然后滚动到底部,按住Shift键并点击wren。 - 点击右箭头将这些信号移动到右侧的选择框中(应该有11个信号,这包括了所有未约束的信号)。
- 点击“OK”,然后点击“Run”来设置输入延迟。
- 通过几个按键在控制台中直接添加最小输入延迟:点击控制台中的Tcl提示符,按向上箭头键复制命令,然后将
max改为min,3改为2。
现在,生成摘要报告:
- 双击任务窗格“Macros”文件夹下的“Report All Summaries”。请注意,所有摘要报告都没有红色标记。
- 接下来,在“Diagnostics”下,双击“Report Unconstrained Paths”以查看列出所有路径及其是否被约束的报告。您应该看到没有路径是未约束的,因此我们已经实现了目标。
最后,再次将约束保存到SDC文件并重新编译:
- 从TimeQuest的“Constraints”菜单中,点击“Write SDC File”。删除文件名中的
.out,然后点击“OK”。 - 点击右上角的“X”关闭TimeQuest并返回Quartus Prime。
- 点击“Processing”菜单,然后“Start Compilation”。
- 编译完成后,点击“OK”。在控制台窗口中,我们看到TimeQuest运行没有错误,表示成功。

总结

在本视频中,您学习了:
- 如何在FPGA设计上运行TimeQuest时序分析器。
- 如何创建时序网表。
- 如何在TimeQuest中编写约束。
- 如何使用TimeQuest报告来解决时序问题。
- 如何通过时序驱动编译实现时序收敛。
019:使用ModelSim进行设计仿真 🧪


在本节课中,我们将学习如何使用Mentor Graphics ModelSim仿真器来仿真FPGA设计中的逻辑。ModelSim是一个非常强大的工具,本节内容仅作为入门介绍,帮助你验证设计的正确性。
我们将以一个已完成时序分析的现有项目为起点,逐步完成从原理图转换到VHDL文件、启动ModelSim、添加信号、创建激励以及通过仿真测试案例验证逻辑等任务。

从原理图到VHDL文件转换 🔄
上一节我们介绍了仿真准备工作的目标,本节中我们来看看如何将原理图设计转换为仿真可用的VHDL文件。
首先,打开Quartus Prime并加载名为 pipemult 的项目。该项目应已完成时序分析。在项目导航器的“Hierarchy”选项卡中,双击 pipemult 项,原理图将显示出来。由于仿真器无法直接仿真原理图形式的电路,因此需要将其转换为HDL文件。
以下是转换步骤:
- 点击 File 菜单,选择 Create/Update,然后选择 Create HDL Design File from Current File。
- 在弹出的对话框中选择 VHDL,点击 OK。
- 在消息窗口中,应看到“Quartus Prime create VHDL file was successful”的提示。
- 此时,在项目导航器中再次双击
pipemult,编辑器窗口将显示生成的VHDL文件pipemult.vhd。
查看此VHDL代码,其 entity 部分包含了所有预期的输入输出端口。architecture 部分则由一个乘法器、一个RAM组件以及连接它们和输出寄存器的信号(或连线)构成。
现在,我们可以使用这个设计版本进行仿真。但在将其加入项目前,需要手动添加:
- 进入 Project 菜单,点击 Add/Remove Files in Project。
- 在打开的对话框中,点击文件名框右侧的浏览按钮。
- 选择
pipemult.vhd并点击 Open。 - 点击 Apply,然后点击 OK。
- 转到项目导航器的 Files 选项卡,确认
pipemult.vhd已包含在项目中。 - 右键点击
pipemult.vhd,选择 Set as Top-Level Entity。 - 右键点击原始的
pipemult.bdf原理图文件,选择 Remove File from Project。 - 在任务窗口中双击 Analysis & Synthesis 以重新编译。完成后,
pipemult.vhd即成为设计的顶层文件。
配置并启动ModelSim ⚙️
上一节我们完成了设计文件的转换,本节中我们来看看如何配置Quartus Prime以调用ModelSim,并启动仿真环境。
首先,验证仿真器设置:
- 点击 Assignments 菜单,选择 Settings。
- 在设置对话框的左侧窗格中选择 EDA Tool Settings。
- 确保 Simulation 的工具名称为 ModelSim-Altera,格式为 VHDL。如果不是,请通过下拉菜单选择。
- 点击 OK 关闭设置对话框。
接着,配置ModelSim可执行文件路径:
- 点击 Tools 菜单,选择 Options。
- 在选项对话框中,选择 General 下的 EDA Tool Options。
- 确认底部 ModelSim-Altera 框中的工具路径正确,或点击右侧浏览按钮,导航至ModelSim可执行文件(通常位于
C:\intelFPGA_lite\16.1\modelsim_ase\win32aloem\modelsim.exe)。 - 点击 OK。
现在,启动RTL仿真:
- 在 Tools 菜单中,选择 Run Simulation Tool,然后点击 RTL Simulation。
- ModelSim Intel FPGA Starter Edition 软件窗口将打开。
ModelSim窗口顶部是包含文件、编辑、视图、编译、仿真等选项的下拉菜单栏。其下是工具栏,将鼠标悬停在图标上会显示其功能。主窗口区通常包括左侧的库窗口、右上角的对象窗口、右下角的进程窗口以及底部的命令窗口。这些窗口会随着仿真活动而变化。
库窗口中包含了工具支持的Altera FPGA系列的所有基本模型、标准HDL库以及IP组件库。其中应有一个名为 work 的库,里面包含了我们的 pipemult 实体。
解决编译错误与启动仿真 🛠️
上一节我们启动了ModelSim,但在仿真前可能会遇到编译错误。本节中我们来看看如何解决这些错误并成功启动仿真。
尝试右键点击 work 库中的 pipemult 实体并选择 Simulate。命令窗口可能会显示加载设计时出错的提示。这通常是由于 ram.vhd 和 pipemult.vhd 文件中关于写地址和读地址的信号类型不匹配造成的。从原理图到VHDL的转换程序并非完美。
以下是修复步骤:
- 返回Quartus Prime,在项目导航器的 Files 选项卡中,双击打开
pipemult.vhd和ram.vhd两个文件。 - 在
ram.vhd文件中,选中从clock到q输出的所有端口声明行,按Ctrl+C复制。 - 切换到
pipemult.vhd文件标签页。 - 向下滚动到
RAM组件声明部分,选中从clock到q的端口部分,按Ctrl+V粘贴替换。这确保了组件声明与实体定义一致。 - 接下来,还需要修正顶层
pipemult实体中的端口声明。从刚粘贴的RAM组件声明中,复制wraddress和rdaddress端口行。 - 在
pipemult实体声明中找到对应端口,用复制的内容覆盖它们。 - 按
Ctrl+S保存pipemult.vhd文件。 - 返回ModelSim。在 work 库中,右键点击
pipemult实体,选择 Recompile。 - 此时,命令窗口应显示“编译成功,0个错误”的提示。
- 再次右键点击
pipemult实体,选择 Simulate。这次仿真应成功启动,命令窗口会出现VSIM>提示符。
此时,对象窗口会列出 pipemult 内部的所有信号。为了观察仿真结果,我们需要打开波形窗口:从顶部菜单选择 View,然后向下滚动并点击 Wave。

添加信号与创建激励 📈
上一节我们成功启动了仿真并打开了波形窗口,本节中我们来看看如何将信号添加到波形窗口并创建输入激励。
波形窗口出现后,默认时间尺度通常是100皮秒。将信号添加到波形窗口的方法如下:
- 点击 Objects 窗口,按
Ctrl+A全选所有信号。 - 将这些信号拖拽到波形窗口的左侧窗格并释放。
接下来,我们需要创建一些激励(测试向量)来测试逻辑设计。有多种方法可以创建激励,最高效的是编写测试平台(Testbench),这是一种封装HDL代码,用于创建驱动被测设备输入端口的外部虚拟设备。测试平台将在专项课程的第三部分详细讨论。
另一种方法是直接在ModelSim中手动输入激励,这也是我们现在要使用的方法。

以下是手动创建激励的步骤,首先为时钟信号创建周期波形:
- 在波形窗口的信号列表中,右键点击顶部的
clock信号,在下拉菜单中选择 Clock...。 - “定义时钟”对话框会出现。默认占空比为50%,默认周期为100个仿真时间单位(本例中为皮秒)。时间尺度通常在仿真开始时通过 Simulate -> Start Simulation 设置,此处我们接受所有默认值,点击 OK。
接着,为其他输入信号强制赋值:
- 右键点击
wren信号,选择 Force...。在对话框中,将值从U(未定义)改为1,点击 OK。 - 右键点击
dataA信号,选择 Force...。在对话框中,将值改为二进制2(写作8‘b00000010),点击 OK。 - 右键点击
dataB信号,选择 Force...。在对话框中,将值改为二进制3(写作8’b00000011),点击 OK。 - 地址信号暂时保持为0。其他信号是衍生输出,我们无需定义它们。


运行仿真与分析结果 🧮
上一节我们为输入信号创建了激励,本节中我们来看看如何运行仿真并分析波形结果以验证逻辑功能。

现在开始运行仿真:
- 从顶部菜单选择 Simulate,然后 Run,再选择 Run 100。仿真将运行100个时间单位。

仿真运行后,你将看到一个时钟周期以及其他信号的值。q 输出显示为红色,表示其状态未知,因为它尚未被有效驱动。
你可以通过点击顶部中间时间框左侧的图标(看起来像一张带向下箭头的纸)再次运行100个单位。重复此操作几次,以观察多个时钟周期。
在波形窗口底部有一个游标,可以将其拖动到特定的仿真时间点,例如约250皮秒处。此时,一个名为 mult_out 的信号(乘法器输出)被驱动为二进制值 6(即 2*3)。

为了更好地观察数值,可以更改信号的显示基数:
- 右键点击
dataA信号的值区域,选择 Radix,然后选择 Decimal。对dataB以及最后三个输出信号进行同样操作。 - 再次点击运行按钮,多仿真几百个单位。

观察波形:乘法器输出被存储到RAM中,随后RAM输出被驱动,最终设备的 q 输出引脚被驱动。从时序图中可以看出,完成一次乘法需要两个时钟周期,从RAM存储和读取需要两个周期,然后一个周期用于输出寄存。
要测量时间差,可以添加第二个游标:
- 右键点击现有游标下方的黑色空白区域,选择 New Cursor。两个游标之间的时间差将显示出来。
进行更多测试与保存结果 💾


上一节我们进行了初步仿真验证,本节中我们通过修改测试值来进行更全面的验证,并学习如何保存仿真结果。
接下来,让我们改变测试值,验证乘法器对不同输入的处理:
- 将
wren的值强制改为0。 - 将
dataA的值强制改为255(二进制8‘b11111111)。 - 运行仿真。此时
dataA可能显示为-1(如果被解释为有符号数),而乘法器输出显示为765。这合理吗? - 右键点击
dataA信号,选择 Radix -> Unsigned,现在它显示为255。255 * 3 = 765,乘法器工作正常。 - 再运行几次仿真,使结果传播到输出。注意输出
q并未变为765,这是因为wren为0,乘法器结果未被写入RAM。 - 将
wren重新强制为1。 - 再运行几次仿真,输出结果
q最终变为765。
此时,仿真的起始部分可能已不在屏幕显示范围内。可以通过右键点击波形窗口的黑色背景,从众多缩放选项中选择 Zoom Full 来调整视图。
再进行一次测试:
- 将
dataB也改为255。 - 运行仿真多次。如果未更改
dataB的基数,它可能显示为-1,乘法器输出显示为-511。这可能是混合了有符号和无符号数表示法造成的。 - 将
dataB和后三个输出信号的基数改为 Unsigned。现在显示的值是65025(即255*255),这是正确的。
在命令窗口左下方,可以看到总仿真时间(例如2200皮秒)。这是一个寄存器传输级(RTL)仿真,不包含电路模型中的任何时序或传播延迟信息,其目的是验证逻辑、时序和顶层计算的正确性。包含时序信息的仿真(时序仿真或门级仿真)将在布局布线后进行,我们将在后续课程中探讨。

最后,可以保存仿真结果:
- 保存波形图像:点击波形窗口,然后选择 File -> Export -> Image...,输入文件名(如
pipemult_wave)保存为图片。 - 保存信号列表:点击对象窗口,选择 File -> Save As...,可将其保存为文本文件。
- 保存仿真命令脚本:右键点击命令窗口,选择 Select All 复制所有使用过的命令,然后粘贴到文本编辑器中。这些命令以后可以作为脚本重新运行,以复现仿真。


总结 📝
在本节课中,我们一起学习了使用ModelSim进行FPGA设计仿真的完整流程。

我们首先将原理图BDF文件转换为用于仿真的VHDL文件,然后从Quartus Prime中启动并配置了ModelSim。在ModelSim环境中,我们学会了如何将信号添加到波形窗口,如何通过手动强制赋值来创建驱动输入的激励,以及如何通过精心设计并应用于仿真的测试案例来验证逻辑设计的正确性。

通过观察波形、更改数值基数、添加游标测量时间以及进行多组测试,我们验证了设计的功能和时序行为。这些技能是进行有效数字逻辑仿真和调试的基础。
020:多种类型的FPGA


在本节课中,我们将深入学习FPGA的架构,了解这些设备是如何构建的以及其背后的原理。我们将探讨如何根据一系列关键标准来评估和选择适合特定应用的FPGA。
在第一模块中,我们介绍了FPGA这类可编程逻辑器件。在第二模块,我们使用Cortus Prime工具完成了一个FPGA设计示例。在本模块中,我们将扩展对FPGA能力的认识,以便在设计时能做出正确的选择。
设计数字设备是一个创造性的过程,类似于构思新食谱或创作新画作。为了精通此道,我们需要了解有哪些“原料”可供我们创造新设计。赛灵思、阿尔特拉、美高森美和莱迪思等公司都生产优秀的可编程逻辑器件,但没有一款器件能适用于所有应用,每家厂商都有其专长领域。
你是否曾疑惑,为什么选择这款FPGA而不是那款?如果是,那么你很幸运,因为本模块将解答这个问题。我们将学习一套评估这些器件的标准,以帮助我们决定哪一款最适合特定的应用。
评估FPGA的关键标准
那么,我们需要从FPGA中获取哪些核心能力?以下是评估时必须考虑的11个关键标准。
1. 可重编程性与配置存储器类型
首先,FPGA需要具备可重编程能力,这取决于其配置存储器的类型。SRAM和闪存型FPGA是可重编程的,而反熔丝型则不可。可重编程性使得开发过程更加便捷,因为可以将新设计反复编程到同一器件中。
2. 规模与逻辑密度
FPGA必须提供充足的逻辑资源。通常,逻辑资源越多越好,因为随着FPGA规模增大,其价值增长往往快于成本增长。更小的制造工艺几何尺寸通常意味着更高的逻辑密度。逻辑数量有多种衡量方式,例如:
- 系统门数
- 逻辑单元
- 切片
- 宏单元
- 逻辑阵列块
- 自适应逻辑模块
3. 每逻辑门成本
当然,如果器件的成本超出了设计预算,那么逻辑器件带来的优势就无法实现。因此,成本,尤其是每逻辑门成本,是一个重要考量因素。
4. 速度与最大时钟频率
处理速度是FPGA的另一项基本特性,通常以最大时钟频率来衡量。速度的重要性不仅体现在内部逻辑上,也体现在输入/输出接口的性能上。
5. 功耗
与高速要求直接对立的是低功耗的需求。FPGA在高频运行时功耗可观,即使在空闲状态下也会消耗静态功率。根据架构和配置存储器类型的不同,功耗范围可以从微瓦到数百瓦不等。
6. 每I/O成本与I/O密度
除了内部能力,FPGA的外部接口同样重要。现代FPGA可以支持多种I/O类型。衡量其价值的一个指标是每I/O成本,以及相对于芯片上逻辑资源的I/O密度。
7. 硬核IP资源
提升FPGA价值的另一种方式是在芯片内集成硬核知识产权模块,例如:
- 存储器块
- 数字信号处理块
- 高速收发器
- 甚至硬核处理器
8. 确定性时序
某些器件,特别是CPLD和较小的FPGA,其结构使得时序具有确定性。这意味着即使基于新设计对器件进行重新布线,特定功能的时序也能保持一致。这在某些对时序要求严格的应用中至关重要。
9. 可靠性
在一些如安全关键型设计中,可靠性是主要关注点,通常以失效率或平均故障间隔时间来衡量。
10. 耐久性
对于长寿命产品,配置存储器的耐久性可能成为一个问题。这是基于闪存的FPGA的一个重要参数,包括可编程周期数和数据保持年限。
11. 设计与数据安全性
日益重要的是保护存储在FPGA位流文件中的设计信息,以及流经FPGA的数据的能力。
总结
本节课中,我们一起学习了评估和选择FPGA的11项关键标准。从可重编程性和逻辑密度,到成本、速度、功耗、接口、硬核资源、时序确定性、可靠性、耐久性以及安全性,这些标准为我们全面考察各大厂商的FPGA设备和技术提供了清晰的框架。掌握这些标准,将帮助你在未来的嵌入式系统设计中,为特定应用选出最合适的可编程逻辑器件。


021:Xilinx CPLD架构 🧩

在本节课中,我们将开始对现代可编程逻辑器件进行概览,首先从Xilinx的CPLD开始。我们将使用之前建立的可编程逻辑器件选择标准来评估这些器件。
概述
我们将依据11项标准来评估Xilinx的CPLD器件,这些标准包括:逻辑密度、每逻辑门成本、速度、功耗、可重编程性、每I/O成本、片上硬IP、确定性时序、可靠性、耐久性以及设计和数据安全性。
器件选择标准

以下是评估可编程逻辑器件的11项核心标准:
- 逻辑密度:以系统门、逻辑单元、切片或自适应逻辑模块的数量来衡量。
- 每逻辑门成本。
- 速度:最大时钟频率。
- 功耗:包括静态功耗和动态功耗。
- 可重编程性。
- I/O密度或每I/O成本。
- 片上可用硬IP:如存储器、DSP模块、收发器等。
- 确定性时序:每次实现时,时序保持一致。
- 可靠性:可通过适配率衡量。
- 耐久性:编程周期数和数据保留年限。
- 设计和数据安全性。
XC9500 XL CPLD系列
这是Xilinx XC9500 XL CPLD系列的数据手册,可以在Xilinx官网上找到。查看数据手册的目的是通过其指定的性能特性,判断该器件是否可用于我们的设计。
接下来,我们重点分析与选择标准直接相关的该器件的一些重要特性。
- 确定性时序:引脚到引脚的延迟为5纳秒。
- 5V I/O容限:这些器件可用作电压转换器,尤其是在许多传统设备仍运行在5V电压的汽车应用中。我本人在一个工业产品设计中就曾为此使用过XC9572XL。
- 配置与可编程性:该器件使用闪存单元进行路由配置,可重编程。数据保留20年,耐久性为10,000个编程周期,表现良好。
- 逻辑容量限制:最多288个宏单元,6400个门,288个触发器。
- 速度限制:最高208 MHz。
- I/O数量:最多192个I/O引脚,每个寄存器几乎对应一个I/O,这是一个I/O丰富的器件,与寄存器丰富而I/O稀缺的FPGA不同。
架构总览

上一节我们介绍了XC9500 XL的基本特性,现在来看看它的整体架构。
其顶层架构视图显示,最多288个宏单元通过路由矩阵连接到I/O模块。
宏单元架构详析

下图展示了宏单元架构的更详细视图。
- 每个宏单元的与阵列可接收多达54个输入信号。
- 其中5个与项的输出可以被“或”在一起,此外还可以接收来自相邻宏单元的反馈信号,该反馈信号本身可能又包含了其他宏单元的输入。
- 时钟、使能、复位等信号的选择是可编程的,可以是局部信号,也可以是全局信号。
- 每个宏单元只有两个输出连接到I/O模块。
Cool Runner-II CPLD系列
现在,我们来看看Xilinx的另一款CPLD系列:Cool Runner-II。

以下是该器件与选择标准直接相关的一些重要特性。
- 低功耗设计:该器件专为低功耗设计,因此得名,并包含多项低功耗特性。
- 逻辑容量限制:最多512个宏单元,512个触发器。
- I/O数量:最多270个I/O引脚,大约每两个寄存器对应一个I/O,同样是一个I/O丰富的器件。
- 确定性时序:引脚到引脚的延迟为5纳秒。
- 速度限制:最高323 MHz,器件规模越小,速度越快。这是因为具有更多宏单元的部件需要更多路由,电容更大,因此速度更慢。这体现了CPLD固有的规模扩展问题。
- 配置与可编程性:该器件使用非易失性配置存储器,配置时传输到SRAM单元进行路由,可重编程。数据保留20年,耐久性为1,000个编程周期,表现良好。
架构总览
Cool Runner-II的整体架构视图显示,最多512个宏单元通过高级互连矩阵连接,每个功能块连接到I/O。
宏单元架构详析
Cool Runner-II的宏单元架构图与XC9500 XL非常相似。
- 宏单元的与阵列可接收多达40个输入信号。
- 其中5个与项的输出可以被“或”在一起,来自其他宏单元的前馈信号通过与阵列输入。
- 时钟、使能、复位等信号的选择是可编程的,可以是局部信号,也可以是全局信号。
- 每个宏单元只有一个输出连接到I/O模块。
应用效率分析
还记得4位比较器吗?理论上,由于5个信号可以组合,每个宏单元可以生成5位比较器,这是对可用逻辑相当高效的利用。由此也可以推断,地址解码器的实现将是高效的。
那么,一个宏单元能实现多少个全加器?只能实现一个,因为只有一个输出。如果异或输出用作“和”输出,那么“进位输出”可以路由到下一个宏单元,就像“进位输入”来自前一个宏单元一样。然而,这在一个宏单元中只使用了大约9个门,效率并不高。同样,在实现移位寄存器时,只使用了每个宏单元中的寄存器,庞大的可编程逻辑阵列结构就显得多余了。
总结
本节课中,我们一起学习了Xilinx提供的两个CPLD系列:XC9500 XL和Cool Runner-II。

- 两者都具有可重编程性、确定性时序和丰富的I/O,但在速度和逻辑密度上有限制。
- XC9500 XL系列具有5V容限I/O,这在工业和汽车应用中可能很重要。
- Cool Runner-II是一个低功耗的CPLD系列。
- Xilinx的CPLD在实现比较器和解码器时效率很高,但在实现加法器或移位寄存器时效率不高。
022:Xilinx小型FPGA 🧩

在本节课中,我们将继续学习现代可编程逻辑器件,重点介绍赛灵思(Xilinx)的两款小型FPGA:Spartan-3AN和Spartan-6。我们将运用之前建立的11项可编程逻辑器件选择标准来评估这些器件。
器件选择标准回顾 📋
以下是评估可编程逻辑器件的11项核心标准:
- 规模或逻辑密度:以系统门、逻辑单元、逻辑片或自适应逻辑模块的数量衡量。
- 每逻辑门成本。
- 速度或最大时钟频率。
- 功耗:包括静态功耗和动态功耗。
- 可重编程性:配置存储器的类型。
- 每I/O成本或I/O密度。
- 片上硬核IP:如存储器、DSP模块、收发器等。
- 确定性时序:每次实现的时序保持一致。
- 可靠性:以适配率衡量。
- 耐久性:编程周期数和数据保持年限。
- 设计和数据安全性。

Spartan-3AN FPGA 分析 🔍
上一节我们回顾了选择标准,本节我们首先来看Spartan-3AN FPGA。
以下是赛灵思Spartan-3AN FPGA系列数据手册的部分内容。Spartan-3AN具有可重编程的闪存配置和用户存储器。

请注意其关键参数:
- 等效门数高达140万,逻辑单元达25K。其逻辑资源远多于CPLD。
- 该系列器件专为低成本应用设计。如果需要更多逻辑资源,则需要选择更大的器件。
- 速度:全局时钟缓冲器上的最高频率为350 MHz,快于CPLD。
- 功耗:最大功耗在20到200毫安之间,具体取决于器件规模。
- I/O:最多502个I/O引脚,逻辑单元与I/O的比例约为50:1。支持23种I/O标准。
- 耐久性:数据保持20年,编程周期达10万次,表现良好。
- 设计安全性:通过将配置存储器集成在单芯片上得到增强。
- 硬核IP块:增加了包括RAM块、乘法器和数字时钟管理器在内的硬核IP。
最初,可编程逻辑器件的大部分信息都列在数据手册中。然而现在,并非所有信息都能在数据手册中找到,部分内容位于对应的用户指南或手册中。
以下是Spartan-3的整体架构图:I/O位于外围,内部包含逻辑块、RAM、乘法器和时钟管理器。
这是一张Spartan-3逻辑片的图片(一个逻辑块的一半)。逻辑片的核心是两个4输入查找表和两个触发器输出。它还包含一些用于创建加法器的进位链逻辑,以及用于生成移位寄存器的移位时钟生成逻辑。

这是一张逻辑片中查找表资源的简化图。查找表也可用作分布式存储器(每个查找表相当于16位RAM)或16位移位寄存器。
Spartan-6 FPGA 分析 🔍
看过了Spartan-3AN,我们再来看看更现代的Spartan-6 FPGA。
以下是赛灵思Spartan-6 FPGA系列数据手册的部分内容。Spartan-6具有可重编程的SRAM配置,这需要外部非易失性存储器(通常是闪存)来在上电时加载配置。器件变为激活状态前的延迟为几毫秒。

请注意其关键参数:
- 它拥有高达147K逻辑单元,逻辑资源显著更多。该器件同样为低成本设计。
- 包含了额外的硬核IP块,包括180个DSP切片、近5000KB的块RAM以及最多8个高速收发器。
- I/O:最多540个I/O引脚,逻辑单元与I/O的比例约为300:1。支持55种I/O标准。
- 速度:全局时钟缓冲器上的最高频率为400 MHz,快于CPLD。
- 功耗:最大静态功耗在20到51毫安之间,具体取决于器件规模。动态功耗未指定。
- 其他信息可在多本用户指南中找到。
这是一张Spartan-6逻辑片的图片(一个逻辑块的四分之一)。逻辑片的核心是4个6输入查找表和8个触发器。它还包含一些用于创建加法器的进位链逻辑。共有三种能力不同的逻辑片类型。正如你所见,逻辑结构变得越来越复杂。
这是一张逻辑片中查找表资源的简化图。查找表也可用作分布式存储器(每个逻辑片最多可配置为256x1 RAM或ROM)或每个逻辑片32位的移位寄存器。
逻辑资源效率对比 ⚙️
了解了基本架构后,我们通过具体例子来看看这些FPGA的逻辑资源利用效率。
回顾一下四位比较器。一个查找表能实现多少位比较器?
- 在Spartan-3AN的情况下,查找表只有4个输入,因此只能创建一个2位比较器。更大的比较器需要将多个查找表级联。虽然逻辑被有效利用,但相对于CPLD的实现,这会增加延迟。
- 在Spartan-6的情况下,6输入查找表可以处理3位比较器,因此构建更宽的比较器时延迟更小。
一个Spartan-3A的逻辑单元能实现多少个全加器?
初看之下,似乎一个加法器需要两个查找表(每个查找表3个输入)来生成和与进位。
这种实现方式的问题是,每位输入都需要两个查找表,并且进位信号需要经过每个位的完整查找表延迟。
更好的实现方式是使用超前进位,判断输入进位信号是需要传播(当输入不同时)还是生成(当两个输入都为高时),如左图所示。
为了优化此逻辑的实现,Spartan-3这一代的CLB在查找表外部提供了一个专用的异或门(称为XORCY)来生成和,以及一个专用的多路复用器(称为MUXCY)来提供进位。这样,每个查找表就能实现一个全加器位。
这种结构比在CPLD中看到的逻辑资源利用效率更高。移位寄存器也是如此,可以完全使用查找表实现(Spartan-3A每个查找表16位,Spartan-6每个逻辑片32位)。
总结 📝

本节课中,我们一起学习了以下内容:
- 赛灵思提供多个小型FPGA系列,包括目前仍在使用的Spartan-3AN和Spartan-6。
- Spartan-3AN使用片上闪存配置存储器,因此是单芯片解决方案。
- Spartan-6使用SRAM配置存储器,因此需要一个额外的非易失性存储器件来保存配置。
- Spartan-3AN的逻辑单元基于一个4输入查找表和一个触发器,并带有额外的逻辑来帮助高效创建加法器和移位寄存器。
- Spartan-6的逻辑单元基于一个6输入查找表,每个逻辑单元带有两个触发器。
- 赛灵思的小型FPGA在实现加法器或移位寄存器时比CPLD更高效。
- 赛灵思的小型FPGA包含了额外的硬核IP块,包括乘法器和DSP、RAM块、时钟发生器以及高速收发器。
023:Xilinx大型FPGA 🚀

在本节课中,我们将继续学习现代可编程逻辑器件,重点介绍赛灵思(Xilinx)公司的大型FPGA系列。我们将沿用之前建立的评估标准,对Artix-7、Kintex-7、Virtex-7以及Kintex和Virtex的UltraScale系列器件进行分析。
评估标准回顾
在开始具体分析前,我们再次明确用于评估可编程逻辑器件的11项核心标准:
- 规模或逻辑密度:指可用逻辑资源的数量,通常以等效门、逻辑单元(LEs)、逻辑片(Slices)或自适应逻辑模块(ALMs)来衡量。
- 每逻辑门成本。
- 速度或最高时钟频率。
- 功耗:包括静态功耗和动态功耗。
- 配置存储器的可重编程性。
- 每I/O成本或I/O密度。
- 片上可用的硬核IP:包括存储器、DSP模块、收发器等。
- 确定性时序:指每次实现时序的一致性。
- 可靠性:通常以失效率衡量。
- 耐久性:指编程周期数或配置数据保持年限。
- 设计与数据安全性。

Artix-7 中端FPGA
上一节我们回顾了评估标准,本节中我们首先来看看Artix-7系列。下图展示了赛灵思7系列产品选型指南中关于Artix-7的部分概览。

以下是Artix-7的关键特性:
- 配置:采用可重编程的SRAM配置,需要外部非易失性存储器(通常是闪存)在上电时加载配置。器件激活前的延迟为几毫秒。
- 规模:最大可达215,000个逻辑片。这足以在FPGA上构建一个大型的32位CPU。
- 速度:时钟缓冲器最高频率为628 MHz,触发器翻转频率为1,412 MHz,比前代器件快得多。收发器速率最高可达6.6 Gbps。
- 功耗:最大静态功耗在1V电压下为48至328 mA(取决于具体型号)。动态功耗未直接指定,需使用功耗估算工具确定。
- I/O:最多500个I/O引脚,逻辑单元与I/O的比例约为400:1。支持36种I/O标准。
- 硬核IP:增加了多种硬核IP块,包括:
- RAM块
- 时钟管理单元(CMT),含锁相环(PLL)
- DSP切片
- PCIe收发器
- 模数转换器(ADC)
- 运行速率达1066 Mbps的DDR3接口
Kintex-7 大型FPGA
接下来,我们看看规模更大的Kintex-7系列。下图展示了其产品选型指南概览。

以下是Kintex-7的关键特性:
- 配置:采用可重编程的SRAM配置,需要外部非易失性存储器在上电时加载配置。
- 规模:最大可达477,000个逻辑片,是Artix-7的两倍。
- 速度:时钟缓冲器最高频率为741 MHz,触发器翻转频率为1,818 MHz。收发器速率最高可达12.5 Gbps。
- 功耗:最大静态功耗在1V电压下为201至1080 mA(取决于具体型号)。动态功耗需使用工具估算。
- I/O:最多500个I/O引脚,逻辑单元与I/O的比例接近1000:1。支持36种I/O标准。
- 硬核IP:与Artix-7相同,包括RAM块、时钟管理单元、DSP切片、PCIe收发器、ADC以及运行速率达1866 Mbps的DDR3接口。
Virtex-7 大型FPGA
现在,我们来了解顶级的Virtex-7系列。下图是其产品选型指南概览。

以下是Virtex-7的关键特性:
- 配置:采用可重编程的SRAM配置,需要外部非易失性存储器在上电时加载配置。
- 规模:最大可达近200万个逻辑片,是Kintex-7的四倍。
- 速度:时钟缓冲器最高频率为741 MHz,触发器翻转频率为1,818 MHz。收发器速率最高可达28.05 Gbps。
- 功耗:最大静态功耗在1V电压下为1012至3756 mA(取决于具体型号)。动态功耗需使用工具估算。这些器件的功耗可达100瓦范围,因此通常需要散热片。
- I/O:最多1100个I/O引脚,逻辑单元与I/O的比例接近2000:1。支持36种I/O标准。
- 硬核IP:与Artix-7相同,包括RAM块、时钟管理单元、DSP切片、PCIe收发器、ADC以及运行速率达1866 Mbps的DDR3接口。
7系列逻辑片结构
在介绍了三个7系列的具体型号后,我们来看看它们共用的底层逻辑单元结构。下图是7系列逻辑片的简化图,它与Spartan-6中的逻辑片相同。

这并不令人意外,因为设计者在优化逻辑单元上投入了大量时间和精力,一旦找到高效的结构,往往会沿用。其核心基于:
- 4个6输入查找表(LUT)和8个触发器(Flip-Flop)。
- 每个LUT可以创建一个单比特全加器。
- 每个LUT可以配置为一个32位移位寄存器。

其基本结构可以用以下代码概念表示:
// 一个7系列逻辑片包含:
module slice7_series (
input [5:0] lut_inputs [3:0], // 4个6输入LUT
output reg ff_outputs [7:0] // 8个触发器输出
);
// 每个LUT可实现任意6输入布尔逻辑函数
// 或作为分布式RAM/移位寄存器
endmodule
Kintex UltraScale 大型FPGA

接下来,我们进入更先进的UltraScale架构。首先看Kintex UltraScale系列。下图是其产品选型指南概览。

以下是Kintex UltraScale的关键特性:
- 配置:采用可重编程的SRAM配置,需要外部非易失性存储器在上电时加载配置。
- 规模:最大可达140万个逻辑片。
- 速度:时钟缓冲器最高频率为850 MHz,比前代器件更快。收发器速率最高可达16.3 Gbps。
- 功耗:最大静态功耗在1V电压下为1097至3181 mA(取决于具体型号)。动态功耗需使用工具估算。
- I/O:最多676个I/O引脚,逻辑单元与I/O的比例接近2000:1。支持41种I/O标准。
- 硬核IP:与7系列基本相同,但显著增加了100千兆以太网接口。同时包含运行速率达2400 Mbps的DDR4接口。总之,UltraScale系列的一切都更大、更快。
Virtex UltraScale 大型FPGA
最后,我们考察规模最大的Virtex UltraScale系列。下图是其产品选型指南概览。

以下是Virtex UltraScale的关键特性:
- 配置:采用可重编程的SRAM配置,需要外部非易失性存储器在上电时加载配置。
- 规模:最大可达超过500万个逻辑片,是Kintex UltraScale的两倍。
- 速度:时钟缓冲器最高频率为850 MHz。收发器速率最高可达30.5 Gbps,聚合带宽高达惊人的3.66 Tbps。
- 功耗:最大静态功耗在1V电压下为1581至7988 mA(取决于具体型号)。动态功耗需使用工具估算。这些器件的功耗可达100瓦范围,因此通常需要散热片。
- I/O:最多1400个I/O引脚,逻辑单元与I/O的比例接近4000:1。支持36种I/O标准。
- 硬核IP:与7系列类似,同样增加了100千兆以太网接口块。块RAM总量达到132 Mb。同时包含运行速率达2400 Mbps的DDR4接口。
UltraScale逻辑单元结构
了解了UltraScale系列的性能后,我们深入其逻辑单元结构。下图展示了UltraScale FPGA家族的逻辑单元。


它与7系列逻辑单元非常相似,包含一个6输入LUT和两个触发器,中间有进位逻辑。然而,在一个逻辑片中,这样的单元有8个(分为两组,每组4个),而7系列是4个。
- 当用作分布式RAM时,这些LUT功能更强,每个LUT可提供最多64位RAM,每个逻辑片最多可提供512位。
- 在M类型逻辑片中,每个LUT还可提供32位移位寄存器。
关于所有赛灵思FPGA的最新信息,可以访问:www.xilinx.com/products/silicon-devices/fpga。
思考与应用
基于所学的逻辑结构知识,让我们思考两个问题:
-
在UltraScale架构中,一个LUT能实现多少位比较器?
- 一个6输入LUT可以处理3位比较器(因为2^3=8种组合需要3个输入来判断相等或大小)。因此,构建更宽的比较器可以用更少的延迟完成。
-
在UltraScale逻辑单元中,可以制作多少个全加器?
- 考虑到每个单元有两个输出(和与进位),每个逻辑单元应该能够轻松生成一个全加器。这对于采用标准方法或提供更快性能的超前进位方法都是成立的。
总结
本节课中我们一起学习了赛灵思公司多个大型FPGA系列:
- 产品系列:赛灵思提供了多个大型FPGA家族,包括Artix-7、Kintex-7、Virtex-7以及Kintex UltraScale和Virtex UltraScale。这些都是大型器件,逻辑单元最多可达500万个。
- 性能提升:这些大型FPGA的速度大幅提升,内部时钟树频率最高达850 MHz,收发器速率达30 Gbps,聚合带宽高达3.66 Tbps。
- 丰富硬核IP:赛灵思大型FPGA集成了丰富的硬核IP块,包括存储器、锁相环(PLL)、数字信号处理器(DSP)、PCIe、Gen 2和3收发器、100千兆以太网接口,甚至在部分器件中集成了12位模数转换器(ADC)。


通过学习,我们对现代大型FPGA的关键特性和评估维度有了系统的认识。
024:Altera CPLD与小型FPGA

概述
在本节课程中,我们将继续学习现代可编程逻辑器件,重点介绍Altera公司的CPLD和小型FPGA,包括MAX 5、MAX 10和Cyclone 5系列。我们将运用之前建立的选择标准来评估这些器件,目标是学会如何根据项目需求选择最合适的器件。
Altera MAX 5 CPLD
上一节我们介绍了可编程逻辑器件的通用选择标准,本节中我们来看看Altera的MAX 5 CPLD。
以下是Altera MAX 5 CPLD系列器件手册的部分关键信息:
- 配置与存储:MAX 5采用可重编程的闪存配置和用户存储器。尽管其路由开关基于SRAM,但上电时,器件能在约0.5毫秒内将闪存中的配置信息传输到SRAM。
- 逻辑规模:逻辑单元(LE)数量高达2210个,比我们考虑过的其他CPLD更多。
- 速度:全局时钟缓冲器速度限制为304 MHz,与其他CPLD相当。
- 功耗:最大静态功耗在0.09至2毫安之间(取决于器件规模),属于低功耗器件。动态功耗未指定,需使用PowerPlay分析器工具确定。
- I/O:最多支持271个I/O引脚,逻辑单元与I/O的比例约为8:1。支持9种I/O标准。
- 数据保持与耐久性:数据保持时间未指定。编程周期耐久性(10,000次)相对较低。
- 时序:具有确定性时序,引脚到引脚的延迟为7纳秒。
- 设计安全性:由于配置存储器集成在单芯片上,设计安全性得到增强。
下图展示了MAX 5的逻辑单元(LE)。其核心是一个4输入查找表(LUT)和一个触发器,这使得它看起来更像FPGA的逻辑单元,而非传统的CPLD。实际上,MAX 5是作为CPLD和FPGA之间的跨界器件设计的,本质上更接近FPGA。

下图展示了MAX 5器件的整体布局,其本质上是一个由行和列路由连接起来的逻辑阵列块(LAB)阵列,每个LAB包含10个逻辑单元。
Altera MAX 10 FPGA
接下来,我们对比一下MAX 5与MAX 10的布局图。MAX 10的布局看起来更复杂(并且是彩色的)。MAX 10是更新一代的器件,顺应了集成更多硬核IP模块的趋势,例如锁相环(PLL)和模数转换器(ADC)。它是一个混合信号器件,在同一芯片上集成了模拟和数字功能。


以下是Altera MAX 10 FPGA系列器件手册的部分关键信息:
- 配置与存储:与MAX 5类似,采用可重编程的闪存配置。上电时,配置信息从闪存传输到SRAM约需0.5毫秒。
- 逻辑规模:逻辑单元数量高达50,000个,对于小型FPGA来说规模可观。
- 速度:全局时钟缓冲器速度限制为450 MHz,对于小型FPGA来说非常快。
- 功耗:功耗未指定,需使用PowerPlay分析器工具确定。该器件的功耗上限为5瓦。
- I/O:最多支持500个I/O引脚,逻辑单元与I/O的比例约为10:1。支持31种I/O标准。
- 设计灵活性:注意,在不同逻辑规模但引脚兼容的部件之间存在迁移路径。这种安排非常有益,特别是在项目过程中需求发生变化时,即使使用的逻辑量增加,也无需重新设计电路板布局。
- 硬核IP:增加了许多硬核IP模块,包括块存储器、乘法器、PLL、ADC和外部存储器接口。
- 数据保持与耐久性:数据保持时间为20年,编程周期耐久性为10,000次,表现良好。
- 设计安全性:配置存储器集成在单芯片上,增强了设计安全性。
下图是MAX 10的逻辑单元图。其核心几乎与MAX 5相同,都是一个4输入LUT和一个触发器,并带有进位链和模拟信号选择功能。尽管MAX系列曾是CPLD家族,但Altera最终在MAX 10上不再掩饰,直接称其为FPGA。
Altera Cyclone 5 FPGA
最后,让我们看看Cyclone 5小型FPGA的产品参数表。


以下是Cyclone 5 FPGA的关键信息:
- 配置与存储:Cyclone 5采用可重编程的SRAM配置和路由,因此需要外部非易失性配置存储器。上电时,配置信息被传输到内部SRAM。
- 逻辑规模:逻辑单元数量高达300,000个,对于小型FPGA来说是相当大的规模。
- 速度:全局时钟缓冲器速度限制为550 MHz,对于小型FPGA来说非常出色。
- 功耗:功耗未指定,需使用PowerPlay分析器工具确定。
- I/O:最多支持480个I/O引脚,逻辑单元与I/O的比例约为600:1。支持34种I/O标准。
- 硬核IP:增加了大量硬核IP模块,包括块存储器、乘法器、PLL、DSP模块、高速收发器和外部存储器接口。
下图展示了Cyclone 5的整体布局,包括逻辑单元、RAM块、DSP块、PLL、收发器和存储器接口。
Cyclone 5的基本逻辑单元是自适应逻辑模块(ALM)。它由一个8输入自适应LUT、两个全加器和四个寄存器组成。这种寄存器丰富的逻辑单元比前几代器件具有更强的设计封装能力。该LUT还可以配置为32x2的双端口SRAM。通过将全加器与LUT算法结合,ALM可以变成一个三输入加法器。
下图是正常模式下的ALM示意图(这是同一ALM的另一种视图,展示了其在特定模式下的操作)。

逻辑单元能力对比
现在,让我们通过一个具体例子来对比这些器件的逻辑单元能力。回顾一下我们之前提到的4位比较器。
-
在MAX 10中能实现多少位比较器?
MAX 10的LUT只有4个输入,因此可以创建一个2位比较器。要实现更大的比较器,需要级联多个LUT。虽然逻辑使用效率高,但相对于CPLD实现会引入额外的延迟。
代码示例:一个2位比较器(A1:A0 与 B1:B0)的逻辑可以在一个4输入LUT中实现。 -
在Cyclone 5中能实现多少位比较器?
Cyclone 5的ALM中的6输入独立LUT可以处理3位比较器。因此,构建更宽的比较器所需的延迟更小。 -
在一个逻辑单元中能实现多少个全加器?
- 对于MAX 10:由于增加了进位链逻辑,每个LUT可以创建一个1位全加器。即:1个LE = 1个1位加法器。
- 对于Cyclone 5:根据之前的课程,我们用3个Cyclone ALM实现了一个4位加法器。因此,每个ALM大约能创建 1.33个加法器位(4位 / 3个ALM ≈ 1.33)。
总结
本节课中,我们一起学习了Altera为小型逻辑设计提供的MAX 5 CPLD以及MAX 10和Cyclone 5 FPGA系列。
- MAX 5和MAX 10是单芯片解决方案,提供了较多的I/O、合理的逻辑密度以及高效的4输入逻辑单元。
- MAX 10额外增加了模拟信号处理功能,例如片内ADC。
- Cyclone 5是一款优秀的入门级FPGA,具有良好的速度、逻辑密度,并集成了大量的硬核IP模块,包括块存储器、PLL、乘法器、DSP模块、高速收发器和外部存储器接口。

理解这些器件的特性和能力,将帮助您在未来的嵌入式系统项目中做出更明智的器件选择。
025:Altera大型FPGA 🚀

在本节课中,我们将继续学习现代可编程逻辑器件,重点介绍Altera公司的大型FPGA系列,包括Arria 5、Stratix 5、Arria 10和Stratix 10。
选择可编程逻辑器件的目标是为我们的需求找到最合适的型号。我们将使用之前建立的选择标准来评估这些器件。
Arria 5中端FPGA
首先,我们来看Arria 5中端FPGA的产品规格表。
Arria 5采用可重编程的SRAM配置和布线,因此上电时需要外部非易失性配置存储器。器件会将配置信息传输到内部SRAM中。
以下是Arria 5的关键规格:
- 逻辑单元:最多可达500,000个,大约是Cyclone 5的两倍。
- 速度:全局时钟缓冲器速度最高为625 MHz。
- 功耗:未明确指定,需使用PowerPlay分析器工具来确定。
- I/O引脚:最多可达704个,逻辑单元与I/O的比例约为715:1。
- 硬核IP模块:增加了多个硬核IP模块,包括:
- 块存储器
- DSP模块
- 高速收发器(标准为6.6 Gbps,部分型号可达12.5 Gbps)
- 外部存储器接口(最高支持DDR3-1600)
下图展示了Arria 5的布局,其中逻辑块阵列中穿插着存储器和DSP模块,高速收发器和硬核DDR存储器接口位于器件外围。

这是Arria 5自适应逻辑模块(ALM)的示意图,它与Cyclone 5的ALM看起来完全一样,由两个6输入查找表(LUT)驱动四个触发器(Flip-Flop)寄存器构成。
一旦FPGA设计者确定了一种满意的逻辑单元架构,他们往往会重复使用它。
Stratix 5大型FPGA
接下来,我们考虑Stratix 5大型FPGA。
Altera Stratix 5同样采用可重编程的SRAM配置和布线,需要外部非易失性配置存储器。上电时,配置信息被传输到内部SRAM。

以下是Stratix 5的关键规格:
- 逻辑单元:最多可达950,000个,大约是Arria 5的两倍。
- 速度:全局时钟缓冲器速度最高为717 MHz。
- 功耗:未明确指定,需使用PowerPlay分析器工具来确定。
- I/O引脚:最多可达840个,逻辑单元与I/O的比例约为1100:1。
- 硬核IP模块:增加了多个硬核IP模块,包括:
- 高速收发器(在GT型号中最高可达28.05 Gbps)
- 块存储器
- 高达27x27精度的乘法器
- DSP模块
- 外部存储器接口(最高支持DDR3-1600)
下图展示了Stratix 5的布局,逻辑块阵列中穿插着存储器和DSP模块,高速收发器位于器件左右两侧,硬核DDR存储器接口位于器件的顶部和底部。

这是Stratix 5 ALM的示意图,它与Cyclone 5或Arria 5的ALM完全相同,由两个6输入LUT驱动四个触发器寄存器构成。得益于Altera的“缺乏想象力”,我们已经知道这个模块是如何工作的了。实际上,我们知道他们的想象力非常出色,但他们知道一个好的设计并会重复使用它。
Arria 10大型FPGA
现在,我们来考察Arria 10大型FPGA。
Altera Arria 10采用可重编程的SRAM配置和布线,需要外部非易失性配置存储器。上电时,配置信息被传输到内部SRAM。
以下是Arria 10的关键规格:
- 逻辑单元:超过100万个,大约是Arria 5的两倍。
- 速度:全局时钟缓冲器速度最高为644 MHz,与Arria 5相比提升不大。
- 功耗:未明确指定,需使用PowerPlay分析器工具来确定。
- I/O引脚:最多可达840个,逻辑单元与I/O的比例约为1100:1。
- 硬核IP模块:增加了多个硬核IP模块,包括:
- 高速收发器(最高可达28.3 Gbps)
- 块存储器
- 乘法器
- DSP模块
- 10千兆以太网接口
- 外部存储器接口(最高支持DDR4-2666)

这是Arria 10 ALM的示意图,它与Cyclone 5的ALM相同,由一个8输入自适应LUT(通常配置为两个6输入LUT)驱动四个触发器寄存器构成。

Stratix 10大型FPGA
最后,让我们看看Stratix 10大型FPGA。
Altera Stratix 10采用可重编程的SRAM配置和布线,需要外部非易失性配置存储器。上电时,配置信息被传输到内部SRAM。

以下是Stratix 10的关键规格:
- 逻辑单元:超过550万个,是Arria 10的五倍。
- 速度:全局时钟缓冲器速度最高为1100 MHz,是当时速度最快的FPGA。
- 功耗:未明确指定,需使用PowerPlay分析器工具来确定。
- I/O引脚:最多可达1640个,逻辑单元与I/O的比例约为3300:1。
- 硬核IP模块:增加了多个硬核IP模块,包括:
- 高速收发器(最高可达30 Gbps)
- 块存储器
- 乘法器
- DSP模块
- 10千兆以太网接口
- 外部存储器接口(最高支持DDR4-2666)
这个器件性能非常强大。想象一下,用如此强大的器件可以实现什么。Altera的HyperFlex架构具有“超灵活”优势。

以下是构成HyperFlex优势的关键创新:
- 寄存器无处不在:在互连布线中遍布的寄存器(称为Hyper-Register)与包含在自适应逻辑模块中的传统寄存器不同。每个器件中的单个布线段都关联一个Hyper-Register。
- 增强型内核时钟:可编程时钟树合成允许系统设计者创建局部化的时钟树,减少偏移和时序不确定性,以获得最大的内核时钟性能。此功能是HyperFlex架构实现两倍性能的关键特性。
- Hyper-Aware设计流程:Hyper-Aware设计流程包括三项新改进:快速前向编译工具、Hyper-Aware步骤,以及利用Hyper-Register的增强型综合与布局布线算法。
下图展示了HyperFlex架构,其中橙色标记的寄存器位于每个布线节点上,这正是HyperFlex架构与传统架构的不同之处。
有关HyperFlex架构的更多信息,请参阅Altera官网上的HyperFlex视频。
性能示例分析
回顾一下4位比较器的例子。在一个查找表(LUT)中可以实现多少位比较器?
在Stratix 10的情况下,六个独立的LUT可以处理3位比较器,因此可以用更少的延迟实现更宽的比较器。
对于Stratix 10,一个逻辑单元可以制作多少个全加器?其ALM与Cyclone 5的ALM非常相似。在之前的视频中,我们使用三个Cyclone 5 ALM实现了一个4位加法器,因此每个ALM大约可以创建1.33个加法器。
总结
本节课中我们一起学习了Altera公司面向大型设计提供的Arria 5、Stratix 5、Arria 10和Stratix 10 FPGA系列。
- Arria 5和Stratix 5是大型器件,拥有多达百万个逻辑单元,并集成了许多硬核IP模块,形成了具有强大处理能力的部件。
- Arria 10进一步提升了处理能力,配备了28 Gbps的串行收发器和2666 Mbps的DDR4 DRAM接口。
- Stratix 10是当时正在生产的最大、最快的FPGA,拥有超过550万个逻辑单元,内核时钟速度高达1100 MHz。
- Altera的HyperFlex架构是一项革命性的变革,将在同等功耗水平下将FPGA性能进一步提高一倍。


026:Microsemi单芯片FPGA解决方案 🧩

在本节课中,我们将继续探讨现代可编程逻辑器件,这次聚焦于Microsemi公司的FPGA产品,包括Igloo、Igloo2和Accelerator系列。在深入了解具体器件之前,先了解一些关于FPGA工艺技术和互连的背景知识会很有帮助。

概述:FPGA工艺技术
选择可编程逻辑器件的目标是为我们的需求找到最合适的部件。我们将使用之前建立的选择标准来评估这些器件。
Microsemi公司同时提供基于闪存(Flash)和基于反熔丝(Antifuse)的FPGA。正如我们从图表中看到的,基于互连方式的不同,它们在性能上存在差异。
反熔丝器件是一次性可编程(OTP)的,而闪存器件可以多次重新编程。闪存器件不具备高速性能,但非常适合低功耗应用。反熔丝器件非常坚固,可用于最极端的条件。
如果我们更仔细地观察这些技术,就能更好地理解这些性能差异是如何产生的。
在SRAM型FPGA中,SRAM单元可以被编程为在FPGA的布线路径之间闭合或打开一个开关。类似地,在闪存FPGA中,布线开关由一个被编程为1或0的闪存单元控制。在反熔丝器件中,布线之间的连接是通过在编程过程中熔断一个互连点来永久固定的,这种连接不可逆转。
闪存单元可以编程一次,并且由于是非易失性的,它们将永久保持这种状态,直到被重新编程。SRAM单元是易失性的,断电时会丢失信息,因此每次上电时都必须重新编程。
除了易失性和可重编程性之外,互连类型还有许多其他影响,接下来我们将探讨其中一些。
深入比较:SRAM与Flash单元
如果我们更仔细地观察一个SRAM单元,它通常由六个晶体管组成,如左侧电路图所示。这个电路在电源和地之间存在多条通路,即使单元处于静态工作状态,也会有有限的电流流过。这种泄漏电流很显著,可能导致功耗达到数瓦,在大型SRAM FPGA中尤其如此。
相比之下,闪存单元的路径更少,泄漏电流低1000倍,静态功耗非常低,在毫瓦量级。Microsemi的闪存工艺还允许器件进入一种称为“Flash Freeze”的挂起状态,这可以将功耗进一步降低到微瓦范围。由于这种低功耗能力,Microsemi将首批此类器件命名为“Igloo”(冰屋),因为它们几乎不因功耗而产生热量。
Flash FPGA的优势
Microsemi基于闪存的FPGA具有许多直接源于该技术的固有优势,包括:
- 真正的闪存技术:它们可重编程且非易失性,无需额外存储器来创建互连。
- 即时启动:上电即用,无启动延迟。
- 集成度高,降低总系统成本:可添加其他IP核以创建SoC器件,替代设计中的多个IC。
- 全面的低功耗:所有部件功耗都较低,部分还具有额外的超低功耗Flash Freeze工作模式。
- 最佳设计安全性:无需外部程序存储器,逆向工程器件程序文件更加困难。
- 卓越的可靠性:闪存单元不受辐射效应影响,更容易进行抗辐射加固。
Microsemi FPGA系列详解
上一节我们介绍了FPGA的基础技术差异,本节中我们来看看Microsemi的几个具体产品系列。
Igloo FPGA系列 ❄️
以下是Microsemi Igloo FPGA系列的总结。
- 技术基础:基于闪存,可重编程且非易失性,意味着上电即用,无需外部存储器,是单芯片解决方案。
- 密度:属于较小密度部件,最多只有6,000个触发器单元。
- 速度:全局时钟缓冲器速度限制在250 MHz,与其他FPGA相比较慢,但仍可使用。
- 功耗:这些器件最有趣的方面是低功耗,在Flash Freeze模式下功耗在微瓦量级。
- I/O:最多77个I/O引脚,逻辑单元与I/O的比例为80:1,在这方面更像CPLD。
- 硬IP核:添加了一些硬IP块,包括块存储器、闪存ROM和PLL。
下图展示了Microsemi Igloo Nano FPGA的结构,包含可配置的通用逻辑单元阵列、顶部的RAM块、外围的I/O块,以及可用于保护可编程内容读取的AES解密模块、用户闪存ROM、Flash Freeze控制和用于实现器件在系统编程的电荷泵。
Microsemi Igloo Nano使用“通用逻辑单元”作为主要逻辑元素。这是一个比其他FPGA厂商所见更细粒度的逻辑元素,可以带来更好的逻辑利用率,但也可能增加布线需求。架构之间总是存在权衡。
在这里,通用逻辑单元可以配置为任何三输入组合逻辑、一个D触发器或一个带使能的D触发器。这比我们考虑过的其他逻辑元素要简单得多。当用作组合逻辑时,通用逻辑单元可以实现任何三输入函数,包括此处显示的所有函数,它可以是一个或门、与门、异或门、多路选择器等。
Igloo2 FPGA系列 ⚡
以下是基于65纳米工艺制造的Microsemi Igloo2 FPGA系列的总结。
- 技术基础:基于闪存,可重编程且非易失性,意味着上电即用,无需外部存储器,是单芯片解决方案。
- 密度:属于中等密度部件,最多15万逻辑单元。
- 速度:全局时钟缓冲器速度限制在400 MHz,与其他FPGA相比足够。
- 功耗:这些器件的一个有趣方面是低功耗,即使在最大部件上,Flash Freeze模式下的功耗也低于11毫瓦。
- I/O:最多574个I/O引脚,逻辑单元与I/O的比例为250:1,比同尺寸的其他FPGA更偏向I/O密集型。
- 硬IP核:区别于前代器件的一个特点是,它相对于其前身充满了硬IP块。新增的IP包括DSP数学块、DMA、嵌入式非易失性存储器(eNVM)、三种不同类型的RAM、DDR/DDR2/DDR3控制器,以及最多16通道的5 Gbps串行收发器和PCIe控制器。
对于这个部件,器件布局变得非常复杂,因此我们首先看其框图。它由五个主要部分组成:高速存储器子系统(包括667 Mbps DDR控制器)、FPGA架构(最多15万逻辑单元)、收发器(包括PCIe和串行接口)、带设计安全特性的系统控制器以及GPIO块。
Igloo2的设计不仅旨在提供一款低功耗的中端FPGA,还具备出色的设计和数据安全性与可靠性,如下所列:
- 设计安全特性:包括程序数据加密、篡改检测和归零。
- 数据安全特性:包括非确定性随机比特生成器(NRBG)和物理不可克隆功能(PUF)。
- 可靠性:FPGA架构具有单粒子翻转免疫能力,存储器包含单错校正双错检测(SECDED)保护。
Igloo2的逻辑元素可用作组合逻辑元素(CLE)或时序逻辑元素(SLE)。每个逻辑元素由一个四输入查找表(LUT)、一个基于超前进位技术的专用进位链,以及一个可独立于LUT使用的独立触发器组成。四输入LUT可以配置为实现任何四输入组合函数,或实现算术函数,其中LUT输出与进位输入进行异或以生成和输出。
Accelerator 与 RTAX FPGA系列 🛡️
以下是Microsemi Accelerator FPGA系列的总结。
- 技术基础:基于反熔丝,是非易失性单芯片解决方案,但不可重编程。你只有一次机会正确编程这些器件,这在生产中不是问题,但可能妨碍开发。
- 密度:属于较小密度部件,最多21,000个触发器单元。
- 速度:全局时钟缓冲器速度限制在870 MHz,与其他FPGA相比非常快。
- 功耗:功耗相当低,小部件的静态功耗低于50毫瓦,大部件低于300毫瓦,尽管远不及闪存部件那么低。
- I/O:最多684个I/O引脚,逻辑单元与I/O的比例为30:1,因此这是一个I/O丰富的部件。
- 硬IP核:添加了一些硬IP块,包括最多292 Kb的块存储器和最多8个PLL。
下图展示了Microsemi Accelerator FPGA的布局。它由一个超级单元阵列组成,每个超级单元由四个组合单元和两个寄存器单元以及布线发送器和接收器构成,外围有几列块RAM和I/O块。
Accelerator有两种类型的逻辑元素:寄存器单元(R单元)和组合单元(C单元)。C单元可以实现超过4,000种最多五输入的组合函数。
Microsemi RTAX FPGA系列与Accelerator系列类似,也是基于反熔丝,是非易失性单芯片解决方案但不可重编程。RTAX系列的布局和逻辑元素与Accelerator家族相同。Accelerator家族可用于开发中模拟昂贵得多的RTAX部件,这通常是为了节省这些OTP器件的成本。
应用示例:逻辑资源估算
回顾我们之前提到的4位比较器。在一个逻辑单元中可以实现多少位比较器?
在Igloo2的情况下,独立的四输入LUT将处理2位比较器,制作这个4位比较器将需要3个LUT。在Igloo中,将需要5个通用逻辑单元。
对于Microsemi Igloo,一个逻辑单元中可以制作多少个全加器?每位加法器需要两个通用逻辑单元,其中图中的单元是与或阵列,红色高亮显示的是三输入异或门。那么一个4位加法器将需要8个通用逻辑单元,如图所示。
Igloo2的四输入LUT架构也需要8个逻辑元素(本例中是8个LUT)。其他四输入LUT架构仅需要4个LUT,而六输入ALM架构仅需要3个ALM。
总结
本节课中我们一起学习了Microsemi提供闪存和反熔丝两种FPGA。每种类型都有不同的能力和限制。
Microsemi当前的闪存FPGA产品,Igloo和Igloo2,是即时启动的单芯片解决方案,可重编程,具有非常好的低功耗性能、高可靠性和安全性。
Microsemi反熔丝FPGA专为恶劣环境和高可靠性设计,包括Accelerator家族和RTAX抗辐射家族。
Microsemi Igloo2拥有丰富的硬IP核,包括存储器控制器、高速收发器、RAM、DSP块和许多安全增强功能。
如果安全性、可靠性或低功耗是设计需求,Microsemi FPGA值得考虑。


027:Lattice单芯片FPGA解决方案 🧩
在本节课中,我们将继续学习现代可编程逻辑器件,这次重点介绍来自Lattice公司的FPGA和CPLD产品,包括ECP5、ECP3、MachXO2、MachXO3和iCE40系列。我们将按照从大到小的顺序来了解这些器件。选择可编程逻辑器件的目标是为我们的需求找到最合适的型号。我们将运用之前建立的选择标准来评估这些器件。


Lattice公司提供低成本、低功耗的小型CPLD和中端FPGA产品,有时封装尺寸非常小。其典型应用包括便携式消费电子产品和移动设备。
Lattice ECP5 FPGA系列概述
ECP5 FPGA系列采用40纳米工艺制造。由于基于SRAM结构,它们可重复编程但具有易失性,因此需要外部存储器来保存配置数据。这些器件针对成本和低功耗进行了优化,具有中等密度。
以下是ECP5系列的关键参数:
- 逻辑密度:中等密度,最多85K逻辑单元。
- 速度:全局时钟缓冲器速度最高40MHz,与其他FPGA相比足够。
- 功耗:相当低,即使在最大型号上功耗也约为250毫瓦。
- I/O数量:最多365个I/O引脚,逻辑单元与I/O的比例为230:1,比同尺寸的其他FPGA更偏向I/O密集型。
- 硬核IP:包含多个硬核IP模块,如DSP数学模块、RAM模块、DDR DRAM存储器支持以及最多4通道的5Gbps SERDES收发器。
ECP5器件包含一个由可编程I/O单元(PIO)环绕的逻辑块阵列。在逻辑块行之间,散布着嵌入式块RAM(EBR)行和数字信号处理(DSP)切片行。
在ECP5中,基本的逻辑单元是切片(Slice)。每个切片包含两个LUT4,驱动两个寄存器。在分布式SRAM模式下,切片0到切片2被配置为分布式存储器,而切片3用作逻辑或ROM。
ECP5的DSP切片功能非常多样,支持以下功能:
- 全双倍数据速率支持,以实现更高的工作频率,吞吐量最高可达370Mbps。
- 双乘法器架构。与单乘法器架构相比,可将累加器开销和延迟降低一半。
- 支持跨切片完全级联的DSP。
- 支持对称、非对称和非对称滤波器。
- 每个切片支持1个18x36乘法、或2个18x18乘法、或4个9x9乘法。通过跨两个DSP切片级联,可以实现36x36乘法。
- 乘累加操作,支持1个18x36乘法器结果累加或2个18x18乘法器结果累加。
Lattice ECP3 FPGA系列概述
上一节我们介绍了较新的ECP5系列,现在来看看其前代产品ECP3。ECP3 FPGA系列采用65纳米工艺制造,因此成本会高于同等的ECP5。与ECP5一样,它们基于SRAM,可重复编程且具有易失性,需要外部配置存储器。
以下是ECP3系列的关键参数:
- 逻辑密度:中等密度,最多150K逻辑单元,比后来的ECP5更大。
- 速度:全局时钟缓冲器速度最高500MHz,与其他FPGA相比足够。
- 功耗:中等,即使在最大型号上功耗也约为450毫瓦。
- I/O数量:最多586个I/O引脚,逻辑单元与I/O的比例为250:1,比同尺寸的其他FPGA更偏向I/O密集型。
- 硬核IP:包含多个硬核IP模块,如DSP数学模块、RAM模块、DDR DRAM存储器支持以及最多16通道的3.2Gbps SERDES收发器。
每个ECP3器件包含一个由可编程逻辑单元环绕的逻辑块阵列。在逻辑块行之间,散布着嵌入式块RAM(EBR)行和数字信号处理(DSP)切片行。
在ECP3中,基本的逻辑单元是切片。切片0到切片2包含两个LUT4,驱动两个寄存器;而切片3仅包含两个LUT4。只有切片0到切片2可以配置为分布式存储器。
Lattice ECP3的DSP切片支持许多功能,包括:
- 每个切片支持1个18x36、或2个18x18、或4个9x9乘法。通过跨两个DSP切片级联,可以实现36x36乘法。
- 乘累加操作,最多支持18x36乘法器馈入一个分辨率最高可达54位的累加器。
Lattice MachXO2 CPLD系列概述
接下来,我们转向更小、更集成的CPLD解决方案。MachXO2 CPLD系列采用65纳米工艺制造。它们基于SRAM,因此可重复编程且具有易失性。然而,它们集成了非易失性配置存储器,可在上电时加载SRAM单元,这意味着它们不需要外部存储器,是单芯片解决方案。
以下是MachXO2系列的关键参数:
- 逻辑密度:小密度器件,最多7K逻辑单元。虽然采用类似FPGA的架构,但通常与CPLD竞争。产品名中的“XO”代表“跨界”,意指这些器件旨在从CPLD跨界到FPGA。
- 速度:全局时钟缓冲器速度最高388MHz,与其他CPLD相比足够。
- 功耗:静态功耗非常低,即使在最大型号上也仅约200微瓦。
- I/O数量:最多334个I/O引脚,逻辑单元与I/O的比例为20:1,是一款I/O非常丰富的器件,类似于其他CPLD。
- 封装:这些器件的最佳特点之一是封装,尺寸可小至2.5mm x 2.5mm(边长十分之一英寸)。
- 硬核IP:对于如此小尺寸的可编程器件,其硬核IP数量是一个有趣的特点。增加的IP包括RAM块、用户闪存、I²C和SPI串行端口以及DDR DRAM存储器支持。
MachXO2系列架构包含一个由可编程I/O(PIO)和非易失性配置存储器块环绕的逻辑块阵列。该系列中逻辑密度较大的器件包含PLL和嵌入式块RAM(EBR)块。嵌入式功能块包括串行端口硬核IP。
MachXO2的逻辑单元是一个包含两个LUT4和两个触发器的切片。切片中的寄存器可配置为上升沿触发、下降沿触发或电平敏感时钟。所有切片都有15个来自布线的输入和1个来自相邻切片或PFU的进位链输入。有7个输出,6个用于布线,1个用于向相邻PFU传递进位。它与ECP3的切片非常相似。
Lattice MachXO3 CPLD系列概述
在了解了MachXO2之后,我们来看看其升级版MachXO3。MachXO3 CPLD系列同样采用65纳米工艺制造。它们基于SRAM,因此具有易失性。然而,它们集成了非易失性配置存储器,可在上电时加载SRAM单元,这意味着它们不需要外部存储器,是单芯片解决方案。在某些情况下,非易失性存储器是可重复编程的闪存;在其他情况下,它是一种成本较低、可编程两次的存储器。型号以“F”结尾的是闪存版本。
以下是MachXO3系列的关键参数:
- 逻辑密度:小密度器件,最多9K逻辑单元,比MachXO2多,但通常与CPLD竞争。虽然采用类似FPGA的架构,但产品名中的“XO”代表“跨界”。
- 速度:全局时钟缓冲器速度最高388MHz,与其他CPLD相比足够。
- 功耗:功耗低,即使在最大型号上也仅约20毫瓦。
- I/O数量:最多384个I/O引脚,逻辑单元与I/O的比例为25:1,是一款I/O非常丰富的器件,类似于其他CPLD。
- 封装:这些器件的最佳特点之一是封装,尺寸可小至2.5mm x 2.5mm(边长十分之一英寸)。
- 硬核IP:对于如此小尺寸的可编程器件,其硬核IP数量是一个有趣的特点。增加的IP包括RAM块、用于视频接口的MIPI D-PHY、I²C和SPI串行端口以及DDR DRAM存储器支持。
MachXO3L/LF系列架构包含一个由可编程I/O(PIO)和非易失性配置存储器块环绕的逻辑块阵列。该系列中逻辑密度较大的器件包含PLL和嵌入式块RAM(EBR)。嵌入式功能块包括串行端口和MIPI视频端口硬核IP。MachXO3的逻辑单元是一个包含两个LUT4和两个触发器的切片,与MachXO2的切片相同。
Lattice iCE40 Ultra FPGA系列概述
最后,我们来看Lattice最小、功耗最低的系列。iCE40 Ultra FPGA系列采用40纳米低功耗工艺制造。它们基于SRAM,因此具有易失性。然而,它们集成了非易失性配置存储器,可在上电时加载SRAM单元,这意味着它们不需要外部存储器,是单芯片解决方案。从NVCM加载配置可能需要几十毫秒。
以下是iCE40 Ultra系列的关键参数:
- 逻辑密度:小密度器件,最多3K逻辑单元。虽然采用FPGA架构,但通常与CPLD竞争。
- 速度:全局时钟缓冲器速度最高185MHz,与其他器件相比较慢,但对于针对低功耗优化的器件来说是可以预期的。
- 功耗:正如其名“iCE”所示,功耗非常低,即使在最大型号上,静态功耗也仅约95微瓦,动态功耗约11毫瓦,更小的型号功耗甚至更低。
- I/O数量:最多39个I/O引脚,逻辑单元与I/O的比例为90:1,是一款I/O丰富的器件。
- 封装:这些器件的最佳特点之一是封装,尺寸可小至2mm x 2mm(边长十分之一英寸)。
- 硬核IP:对于如此小尺寸的可编程器件,其丰富的硬核IP块是一个有趣的特点。增加的IP块包括RAM块、DSP块、I²C和SPI串行端口、片上振荡器、24mA LED驱动器、红外LED驱动器和PWM模块IP。
iCE40 Ultra架构包含一个由可编程I/O环绕的可编程逻辑块(PLB)阵列、两个振荡器发生器、两个用户可配置的I²C控制器、两个用户可配置的SPI控制器、DSP块、LED驱动器以及嵌入式块RAM(EBR)。iCE40的基本逻辑单元是一个LUT4和一个D触发器,每个可编程逻辑块由八个逻辑单元组成。
逻辑资源估算示例
现在,让我们运用对Lattice逻辑单元的了解进行一些简单的资源估算。
回顾一下四位比较器,在典型的基于LUT4的Lattice逻辑单元中可以实现多少位比较器?一个四输入LUT可以处理两位比较器,因此制作这个四位比较器需要三个LUT。
所需LUT数 = 比较器位数 / 每LUT处理位数 = 4位 / 2位每LUT = 2个LUT? 等等,这里需要澄清:一个4输入LUT可以实现2个1位比较器(即比较两个1位输入是否相等,需要检查A0B0和A1B1,这通常需要两个2输入函数,但一个4输入LUT可以组合这些)。更准确地说,一个4输入LUT可以生成一个2位比较的结果(例如,两位相等)。对于一个4位比较器(输出1位,表示4位全等),通常需要组合多个LUT。简单估算:一个n位比较器(逐位比较后相与)大约需要n-1个LUT来组合结果。对于4位,大约需要3个LUT。原文提到“it will take three LUTs to make this four bit comparator”,这与我们的分析一致。
在Lattice MachXO2的一个逻辑单元中可以实现多少个全加器?每位加法器需要两个LUT来生成和与进位输出,因此一个四位加法器将使用八个LUT。在一个包含两个LUT的切片中,可以实现一位全加器。
每个切片实现的全加器位数 = 切片内LUT数 / 每位加法器所需LUT数 = 2个LUT / 2个LUT每比特 = 1位
课程总结
本节课中,我们一起学习了Lattice公司的可编程逻辑器件。Lattice专注于低成本、高价值的中小型可编程逻辑部件,包括iCE40、MachXO2、MachXO3、ECP3和ECP5系列。
- MachXO2和MachXO3系列是单芯片解决方案,具有片上非易失性配置存储器,但由SRAM单元控制布线,这些SRAM单元必须在上电时加载。这些器件特点是低功耗、尺寸极小(可小至2.5mm x 2.5mm)并集成了多个硬核IP块。
- iCE40系列在如此小的器件中包含了丰富的硬核IP功能,并且功耗极低。
- Lattice器件的逻辑单元均基于四输入LUT和一个寄存器,功能足够但与其他FPGA产品相比能力稍弱。
总的来说,Lattice为需要低成本、低功耗、小尺寸或单芯片解决方案的应用提供了有吸引力的选择。


028:FPGA设计专业技能

概述
在本节课中,我们将学习一系列提升FPGA设计效率与专业性的核心技能。我们将从基础原理图设计入手,逐步探索IP核应用、时序优化、I/O管理、器件编程以及Qsys系统设计等高级主题,帮助你构建完整的FPGA设计知识体系。
模块回顾与学习路径
上一模块中,我们深入了解了FPGA的架构与功能,为设计工具箱增添了许多新工具。
本模块中,我们将通过实践练习来运用这些工具,并借助更多设计工具来扩展我们的FPGA设计知识。
以下是本模块将要学习的核心内容列表:
- 高级原理图设计:学习为流水线乘法器设计添加加法器电路。
- 使用IP核提升效率:对比原理图设计,学习如何利用IP核快速构建设计。
- 通过流水线优化时序:学习如何通过插入寄存器来分割组合逻辑延迟,从而提高设计最大频率。
- FPGA I/O管理:学习处理丰富的I/O选项,包括差分逻辑标准。
- 精确的引脚分配:学习使用引脚规划器和分配编辑器进行引脚分配。
- FPGA编程:学习创建编程文件、设置硬件链并将设计下载到目标器件。
- Qsys系统设计:学习创建Qsys系统,构建Nios II软核处理器并添加外设。
详细技能解析
高级原理图设计
在接下来的视频中,你将通过为流水线乘法器设计添加一个加法器电路,来深化对FPGA原理图设计的理解。
你将学习以下内容:
- 如何在原理图中添加输入和输出端口。
- 如何使用基本符号库来创建底层电路。
- 如何在原理图设计中创建层次结构。
使用IP核提升设计效率
我们将对比你之前使用原理图进行设计输入的经验,学习如何使用IP核来更快速地创建设计。
你将通过添加IP核来为设计增加类似基本ALU的功能。
通过流水线优化时序
输入与输出之间过大的组合逻辑延迟会显著降低设计的最大工作频率。
在某些情况下,可以通过插入寄存器(称为重定时或流水线)来将这些延迟分割成多个小段。
我们将学习流水线原理如何应用于改善FPGA设计的时序,以及如何在IP核中使用流水线来优化时序。
FPGA I/O:输入与输出管理
FPGA拥有丰富的I/O功能,包括多种I/O标准和可控的电路特性。
但管理众多的选项可能导致错误。我们可以通过使用有助于记录和跟踪I/O使用情况的方法来减少引脚分配错误。
像LVDS和LVPECL这样的差分逻辑标准在FPGA中越来越流行,因为它们能在相同条件下提供更高的速度和更好的抗噪性。
我们将学习如何处理这些接口。
精确的引脚分配
为了实现精确的引脚分配,你将学习以下内容:
- 如何使用引脚规划器和分配编辑器进行引脚分配。
- 如何使用分配编辑器来满足I/O标准并控制I/O属性。
- 如何使用I/O分配分析器来检查I/O分配。
FPGA编程
Quartus Prime软件包含一个用于创建编程文件的汇编器,以及一个使用下载电缆(如USB-Blaster II、ByteBlaster II或Ethernet Blaster II)下载文件的编程器。
你将学习以下内容:
- 如何为特定情况创建正确类型的编程文件。
- 如何为编程设置硬件链。
- 应使用哪种编程模式。
- 如何将编程文件下载到目标器件中。
掌握Qsys系统设计
你的培训将继续,介绍一个系统设计工具:Qsys。
你将学习以下内容:
- 如何创建一个Qsys系统。
- 如何构建一个Nios II软核处理器。
- 如何在Nios II Qsys设计中添加存储器和外设。
- 如何在处理器和FPGA fabric之间构建桥梁。
- 如何将Qsys设计引入顶层进行编译。
总结
本节课中,我们一起学习了通过使用Quartus Prime软件详细完成更多示例设计,来掌握FPGA设计流程。
本模块的视频将涵盖:FPGA设计专业技能、用于FPGA设计的高级原理图输入(包括绘制和层次结构)、使用IP块提高生产力、通过流水线规划改善时序、FPGA I/O管理、精确的引脚分配、FPGA编程、掌握Qsys系统设计以及为Qsys系统设计添加收尾工作。

希望你已准备好迎接挑战,充分利用这一系列工具,成为一名FPGA设计专家。
029:原理图绘制与层次化设计 🧩

在本节课中,我们将深入学习FPGA的原理图设计输入方法。具体来说,我们将为流水线乘法器设计添加一个加法器电路。你将学习如何为原理图添加输入/输出端口、如何使用基本符号库创建底层电路,以及如何在原理图设计中创建层次结构。
概述
上一节我们介绍了基本的原理图设计。本节中,我们将通过一个实践项目来巩固这些知识。我们将从构建一个1位全加器开始,逐步将其扩展为32位加法器,并将其集成到现有的流水线乘法器项目中。最后,我们将使用RTL查看器和编译工具来验证设计。

准备工作
在开始之前,请完成以下准备工作:
- 启动Quartus Prime软件。
- 打开在Module2中创建的
PipeMult项目。 - 确保项目目录中包含本教程所需的附加文件。如果尚未存在,请下载并解压
pipemult_qp16_under1_timing2.zip文件到C:\Colen\Altera\PRJ目录。
创建1位全加器电路
我们的目标是向PipeMult项目添加一个32位加法器。我们将从最基本的单元——1位全加器开始构建。
一个全加器可以由最少5个基本逻辑门构成,其逻辑表达式为:
- Sum = A ⊕ B ⊕ Cin
- Cout = (A · B) + (Cin · (A ⊕ B))
以下是创建该电路的步骤:
- 新建原理图文件:在Quartus Prime中,点击
File->New,选择Block Diagram/Schematic File。 - 放置逻辑门:
- 在原理图编辑区右键,选择
Insert->Symbol。 - 在符号库中,展开
Libraries->primitives->logic。 - 分别选择并放置以下门电路:两个
XOR(异或门)、两个AND2(两输入与门)、一个OR2(两输入或门)。
- 在原理图编辑区右键,选择
- 连接导线:使用工具栏中的
Orthogonal Node Tool(正交节点工具)按照全加器逻辑图连接所有门电路。 - 保存设计:将文件保存为
add1.bdf。
现在,我们需要为这个全加器模块添加输入输出端口(在FPGA设计中常称为“引脚”,但更准确地说,它们是设计实体的“端口”)。
- 添加输入端口:
- 使用工具栏的
Pin Tool,选择Input。 - 将输入引脚连接到顶部异或门的两个输入,分别命名为
A[0]和B[0]。 - 添加第三个输入引脚连接到最右侧异或门的输入,命名为
Cin[0]。
- 使用工具栏的
- 添加输出端口:
- 使用
Pin Tool,选择Output。 - 将一个输出引脚连接到异或门的输出,命名为
Sum[0]。 - 将另一个输出引脚连接到或门的输出,命名为
Cout[0]。
- 使用
- 再次保存:点击
File->Save。
至此,你已完成了一个功能完整的1位全加器原理图。这个过程展示了Quartus Prime原理图工具不仅能绘制美观的逻辑图,更能生成可被综合、仿真和实现的“活”的电路设计。
构建层次化设计:从1位到32位加法器
直接绘制32位加法器非常繁琐。利用层次化设计,我们可以用已完成的模块快速构建更大规模的电路。
首先,我们需要将 add1.bdf 转换为一个可重复使用的符号(Symbol)。
- 创建符号:打开
add1.bdf,点击File->Create/Update->Create Symbol Files for Current File。这将生成add1.bsf符号文件。 - 构建8位加法器:
- 新建一个原理图文件(
add8.bdf)。 - 插入符号,在
Project库中找到并选择刚创建的add1符号。 - 放置8个
add1符号,并将前一个全加器的Cout连接到下一个的Cin,形成行波进位加法链(Ripple Carry Adder)。 - 为整个8位模块添加总线形式的输入端口(
A[7..0],B[7..0],Cin)和输出端口(Sum[7..0],Cout)。
- 新建一个原理图文件(
- 构建32位加法器:
- 同理,新建
add32.bdf。 - 插入4个
add8符号(需先完成add8.bsf的创建),并将它们级联起来。 - 添加32位的输入/输出总线端口。
- 同理,新建
注意:为了节省时间,教程提供了已完成的 add8.bdf 和 add32.bdf 文件。你可以跳过手动绘制,直接将它们添加到项目中。
将加法器集成到主项目
现在,我们将这个32位加法器加入到之前的流水线乘法器电路中。
- 打开主原理图:在项目导航器中,双击打开
pipemult.bdf。 - 添加加法器模块:
- 右键点击原理图空白处,选择
Insert Symbol。 - 从
Project库中选择add32符号,将其放置在原理图中。
- 右键点击原理图空白处,选择
- 连接端口:
- 为
add32模块添加输入引脚:Cin,A[31..0],B[31..0]。 - 添加输出引脚:
Sum[31..0],Cout。 - 使用工具栏的
Orthogonal Bus Tool(正交总线工具)将引脚与模块的端口连接起来。总线连接允许一次性连接多位信号。
- 为
- 保存并编译:保存
pipemult.bdf文件。在任务窗口中,双击Compile Design进行全编译。编译成功后,状态栏会显示绿色对勾。
使用查看器验证设计
编译完成后,我们可以使用查看工具来直观地验证设计的结构。
- RTL查看器:
- 点击
Tools->Netlist Viewers->RTL Viewer。 - 在RTL视图中,你可以看到设计的层次结构。点击
add32模块前的加号,可以看到它由4个add8模块构成。继续展开,最终能看到你亲手绘制的add1门级电路。这与你设计的原理图完全一致。
- 点击
- 技术映射查看器:
- 点击
Tools->Netlist Viewers->Technology Map Viewer (Post-Fitting)。 - 这个视图展示了设计如何映射到FPGA芯片的实际物理资源(如查找表LUT、寄存器等)。你会发现,为了优化性能,综合工具可能将你的门级电路(如两个LUT3)转换成不同的结构(如两个LUT4)。这体现了RTL描述与实际硬件实现之间的差异,是工具为了提升性能(如减少进位链延迟)所做的优化。
- 点击

总结
本节课中我们一起学习了FPGA原理图设计的进阶技巧。我们回顾了如何添加输入输出端口、使用基本符号库创建底层门电路。更重要的是,我们实践了层次化设计方法:从1位全加器开始,逐步构建出8位和32位加法器模块,并将它们集成到主系统中。这种方法极大地简化了复杂系统的设计和管理。最后,我们利用 RTL查看器 验证了逻辑设计的正确性,并通过技术映射查看器观察到综合工具为了适应目标FPGA架构而进行的优化。原理图输入作为一种直观的设计方法,非常适合用于探究底层电路结构和管理由基本模块构建的复杂系统。
030:利用IP模块提升效率 🚀

在本节课程中,我们将学习如何利用IP模块来提升FPGA设计的效率。我们将对比之前使用原理图进行设计输入的方法,展示如何通过IP模块更快地构建设计。你将学会添加一个类似基础ALU的功能,具体包括添加和配置库IP模块、从HDL代码创建自己的IP模块,以及在原理图设计中连接和拆分总线。
以下是本视频将涵盖的内容:
- 完成我们的原型ALU,添加一个比较器、一个平方根函数以及一个由指令码驱动的多路复用器。
- 在RTL查看器中审查设计结果。
- 编译新设计。

准备工作 🛠️
在开始之前,你需要完成以下准备工作:
- 启动Quartus Prime。
- 打开我们在模块4视频2中最后使用的PipeMult项目。
- 下载并添加额外的文件
genmux.vhd和comparator.vhd(如果它们尚未存在于项目中)。
为了确保所有人使用相同的设计文件,请在启动Quartus Prime之前,将提供的 pipeMult_QP16_under1_M4V2.zip 文件解压到 C:\Altera\PRJ 目录中。你的目录结构应与屏幕上显示的类似。
启动Quartus Prime并打开PipeMult项目。在项目导航器中双击 PipeMult。如果VHDL文件被打开,请通过文件菜单打开原理图文件 pipeMult.bdf。如果在项目导航器的文件选项卡中未列出 pipeMult.bdf,请通过点击项目菜单 -> 添加/移除文件到项目来添加它。点击文件名框右侧的浏览按钮,选择 PipeMult.bdf,点击打开,然后点击添加,最后点击设置对话框底部的确定。在项目导航器的文件选项卡中,右键点击 PipeMult.bdf 并选择“设置为顶层实体”。
返回项目导航器的层次结构选项卡,双击 PipeMult,原理图应该会出现。
添加平方根函数 ➕➖✖️➗
接下来,我们将为设计添加一个平方根函数。与乘法器类似,在原理图或HDL中创建平方根函数将是一项相当繁重的工作。然而,在这种情况下,我们可以使用Altera提供的IP在几分钟内创建一个。
使用“视图 -> 实用工具窗口 -> IP目录”打开IP目录。选择“基本功能” -> “算术”,然后双击 Altera Square Root。在IP变体文件名中添加 sqrt,选择VHDL,然后点击确定。Altera Square Root 对话框会出现。将总线输入改为32位,点击下一步,再次点击下一步。确保 docmpP.bsf 和 _bb.v 文件被勾选,点击完成。当询问是否将Quartus Prime IP文件添加到项目时,选择“是”。如果你查看项目导航器中的IP组件,应该能看到 alt_sqrt 文件已被添加。
在原理图窗口中向下滚动,在32位加法器下方为新区块创建空间。双击原理图的空白区域,符号编辑器会出现。你应该能看到项目和Intel FPGA库。点击项目目录,然后选择 sqrt。点击确定开始放置平方根模块。将其放置在 add32 模块下方居中位置,大约在其下方四个网格标记处。从平方根模块的 radical 输入端口开始,向左移动约两个网格,然后将其连接到 add32 的 A 输入。点击空白处完成连接。我们将在添加更多功能后连接输出。
添加比较器 ⚖️
现在,我们向设计添加一个比较器,这是ALU中常见的底层功能。从项目菜单中,点击“添加/移除文件到项目”。点击文件名框右侧的浏览按钮,导航到你放置 comparator.vhd 的位置(通常在项目目录中)。选择并打开此文件以将其添加到项目,然后点击确定。查看项目导航器的文件选项卡,comparator.vhd 现在应该已添加。双击 comparator.vhd 在编辑器中打开它。从文件菜单中,选择“创建/更新” -> “为当前文件创建符号文件”。你应该在消息窗口中看到符号文件已创建的消息。
返回原理图窗口,双击空白区域,符号编辑器会出现。点击项目目录,然后选择 Binary_Comparator。点击确定开始放置比较器模块,将其放置在平方根模块下方居中位置,大约在其下方四个网格标记处。从二进制比较器的 A 输入端口开始,向左移动约四个网格,然后将其连接到 add32 的 A 输入。对 B 输入重复此操作,再向左移动几个空格。点击空白处完成连接。其他连接将在我们添加一个用于保存指令的寄存器和一个用于选择输出的多路复用器后进行。
添加指令寄存器和多路复用器 🔄
要添加指令寄存器,双击原理图的空白区域,符号编辑器会出现。在左侧的库下,选择最底部的 Intel FPGA 目录,然后 primitives,向下滚动到 storage。选择 DFF。点击确定并将 DFF 放置在比较器下方居中位置。重复此过程,在比较器顶部水平位置右侧约10个网格标记处添加另一个 DFF,如图所示。
接下来,我们将添加多路复用器来选择输出。从项目菜单中,点击“添加/移除文件到项目”。设置对话框会出现。点击文件名框右侧的浏览按钮,导航到你放置 genmux.vhd 的位置(通常在项目目录中)。选择并打开此文件以将其添加到项目,然后点击确定。查看项目导航器的文件选项卡,genmux.vhd 现在应该已添加。双击 genmux.vhd 在编辑器中打开它。从文件菜单中,选择“创建/更新” -> “为当前文件创建符号文件”。你应该在消息窗口中看到符号文件已创建的消息。
返回原理图窗口,双击空白区域,符号编辑器会出现。在库窗口中向上滚动,点击项目目录,然后选择 MUX4X。点击确定开始放置多路复用器模块,将其放置在平方根模块右侧约20个标记处并与之水平对齐。
连接所有模块 🔌
你已经完成了此设计的模块添加,现在是时候将它们全部连接起来了。
向上滚动到圆形器件左侧的时钟线位置。将光标放在这条线的拐角处,向下画一条线,然后向右连接到IR触发器。继续这条线,连接到比较器右侧的条件码触发器。
在IR触发器的左侧,双击原理图的空白区域,符号编辑器会出现。在左侧的库下,选择最底部的 Intel FPGA 目录,然后 primitives,向下滚动到 pin。选择 input,点击确定,并将引脚放置在IR触发器D输入的左侧并与之水平对齐。双击该引脚,输入 IR[1..0] 作为引脚名称,点击确定。从引脚画一条线连接到IR触发器的D输入。
在此输入引脚正下方添加另一个引脚,双击并命名为 Rst_n。从该引脚画一条线连接到两个D触发器的 clrn 引脚。从RAM D触发器,向下画一条线,然后向右,再向下连接到复位引脚。
现在,将IR D触发器的输出连接到多路复用器的输入 S。这将允许编码的指令操作码输入来选择哪个操作(乘法、加法、比较或平方根)作为输出。右键点击这条线,确认它是一条总线,而不是节点线,如果需要,将其更改为总线。
将平方根模块的 Q 输出延伸到多路复用器的 D 输入。
现在,我们将使用比较器的输出创建一个条件码寄存器。将每个比较器输出线延伸几个网格标记。你可能需要放大视图来操作。右键点击 greater 线,选择属性,输入名称 CC[0]。右键点击 equal 输出延伸线,选择属性,输入名称 CC[1]。重复此操作再命名四个输出,依次命名为 CC[2] 到 CC[5]。在比较器的输出端,使用工具栏中的正交总线工具绘制一条短垂直总线。将每条CC线延伸连接到这段总线。从这段总线画一条线连接到右侧的D输入。
在CC触发器右侧约40个网格标记处添加一个输出引脚:双击空白区域,选择最底部的 Intel FPGA 目录,然后 pin,再 output,点击确定。将CC触发器的输出连接到此引脚。右键点击该引脚,选择属性,输入名称 CC_out[5..0]。
在多路复用器左侧添加另一个输出引脚,并将多路复用器的输出连接到它。右键点击该引脚,选择属性,输入名称 ALU_out[15..0]。
我们快完成了。将 add32 模块的 sum 和 cout 输出引脚进一步向右拉。对于多路复用器的 C 输入,画一条线连接到 add32 模块的 B 输入。右键点击这条线,输入名称 B[31..16]。从多路复用器的 B 输入,画一条线连接到 add32 模块的 sum 输出。右键点击这条线,输入名称 sum[31..16]。
最后,观察到乘法器的输出引脚使用了不同的位排序约定。为了使之一致,点击该引脚并按删除键以删除乘法器上的输出引脚。现在双击空白区域,选择输出引脚,并将其放置在乘法器触发器的右侧。右键点击该引脚,输入名称 Q[15..0]。将引脚连接到触发器。从多路复用器的 A 输入,连接到输出引脚之前的乘法器输出线。
恭喜,你已经完成了此设计的输入。从Quartus工具栏的视图菜单中,选择“适合窗口”来查看并欣赏你的完整作品。按 Ctrl+S 保存 pipeMult.bdf。
编译与审查 ✅
在任务窗口中,双击“编译设计”。如果你有任何连接错误,它们将在编译过程中被识别,你需要编辑原理图来修复它们。
一旦你的设计编译完成,你可能会注意到编译报告中的时序条目是红色的。这是因为你添加了许多引脚,并且设计中存在未约束的路径。我们将在未来的视频中解决这个问题。
编译后,你的设计应该看起来像这样,一个完整的电路。

总结 📝
使用IP模块可以通过简化设计输入来极大地提高生产力。Altera为你的设计提供了大量免费可用的IP模块,你也可以从HDL代码创建自己的模块。

在本节课中,我们一起学习了:
- 如何添加和配置库IP模块。
- 如何从HDL代码创建自己的IP模块。
- 如何在原理图设计中连接和拆分总线。
031:通过流水线优化时序 🚀

在本节课中,我们将学习如何通过流水线技术来优化FPGA设计的时序性能。我们将使用时序约束来约束设计,分析结果,并应用流水线以获得更好的性能。
概述 📋
上一节我们介绍了时序分析的基本概念。本节中,我们来看看当设计存在时序问题时,如何通过流水线技术来改善它。我们将学习流水线原理,以及如何利用流水线和IP核来提升设计速度。
流水线原理简介 ⚙️
如果存在时序问题,我们可以通过流水线技术来改善。下图有助于描述长逻辑路径的问题,以及如何通过流水线来缓解。

在上方电路中,时钟的最大速度受到逻辑传播长延迟的限制。例如,如果延迟为100纳秒,那么在不导致寄存器B建立时间违规的情况下,最快时钟频率为10MHz。
我们可以通过插入触发器来将长逻辑延迟分割成两个较小的延迟,从而提高最大时钟频率。在我们的例子中,如果能够均匀分割,每个延迟将为50纳秒,那么最大时钟速度现在为20MHz。
公式: 一般来说,如果我们插入 n 个触发器,那么速度将提升 n 倍。

缺点是,数据从首次出现在输入到到达输出所需的时间现在将增加 n 个时钟周期,这带来了我们可能不希望的额外延迟。然而,这种延迟并不像乍看起来那么糟糕,因为时钟可以驱动得更快,并且一旦数据进入流水线的左端,在每个时钟周期,新数据都会在流水线中推进,使得输出端像以前一样每个时钟周期都产生新数据。
在实践中,速度与延迟之间的权衡通常是值得的,尽管我们通常无法均匀分割逻辑延迟,或者如果逻辑功能改变导致输出无效,可能根本无法进行分割。流水线技术只能在某些情况下应用,但在适用时非常有用。
准备工作 🛠️
以下是您需要先完成的一些准备工作。
首先启动Quartus Prime。然后打开我们在上一个视频中使用的 PipeMt 项目。

在启动Quartus Prime之前,为了确保每个人使用相同的设计文件,请将提供给您的 pipepeMt_QP16_under1_M4v3.zip 文件解压到 C:\AlTra_PRJ 目录。
启动Quartus Prime并打开 PipeM 项目。在项目导航器中双击 PipeM,原理图应该出现。
添加时序约束并分析 🔍
接下来,我们将完成对原型ALU电路的时序分析。
通过点击顶部菜单的 Processing -> Compilation Report 打开编译报告。注意,TimeQuest时序分析显示为红色。如果我们展开此项,会看到问题是“未约束路径”。在设计升级时添加了许多输入和输出,我们将使用TimeQuest为所有新路径添加约束。
打开TimeQuest,点击 Tools -> TimeQuest Timing Analyzer。在TimeQuest的任务窗口中,双击 Create Timing Netlist。完成后,向下滚动到诊断部分,双击 Report Unconstrained Paths。
这里我们看到有许多输入和输出路径未被约束。
添加输入延迟:点击顶部菜单 Constraints -> Set Input Delay。在 Set Input Delay 对话框中,为时钟选择 clock1,为输入延迟选择 Maximum。输入延迟值 3 纳秒。点击目标框右侧的浏览按钮。在 Name Finder 对话框中,点击 List。向下滚动到 a0,点击它,然后向下滚动到 b31,按住 Shift 并点击。点击右箭头添加选定的名称。继续向下滚动,然后按住 Ctrl 并点击 C_in、IR0 和 IR1,再次点击右箭头添加这些名称。向下滚动,在 N 下选择 reset,然后将其移动到选定窗口。点击 OK,然后点击 Run。
在Tcl控制台中,在刚刚输入的命令行后点击,按上箭头键复制该命令。按 Home 键将光标移动到行首,然后将 max 改为 min,将 3 改为 2,然后按回车。现在最大和最小输入延迟都已添加。
接下来,添加输出延迟。从 Constraints 菜单中,选择 Set Output Delay。在 Set Output Delay 对话框中,选择 clock1 和 Maximum。输入延迟值 2,然后点击目标框右侧的浏览按钮。在 Name Finder 对话框中,点击 List。点击 ALU_out0,向下滚动到 ALU_out15,然后按住 Shift 并点击它。点击右箭头将这些名称移动到选定的名称框。进一步向下滚动到 CC_out 总线以及 see_out 并选择这些信号。向下滚动并选择并移动 sum 信号。点击 OK,然后点击 Run。
在Tcl控制台中,在刚刚输入的命令行后点击,按上箭头键复制该命令。按 Home 键将光标移动到行首,然后将 max 改为 min,将 2 改为 1,然后按回车。现在最大和最小输出延迟都已添加。
在任务窗口中,双击 Report SDC 以验证约束的输入。在报告窗口中,点击 SDC Assignments,然后点击 set_input_delay 查看这些约束,同样查看 set_output_delay。
识别关键路径 🕵️
现在让我们戴上“侦探帽”做一些调查工作。向下滚动到测试窗口底部,点击 Report All Summaries。您应该看到时钟约束仍设置为125MHz。如果在报告窗口中向上滚动,请注意建立时间摘要现在显示为红色。双击此项,最坏情况的裕量出现在视图窗口中。
哇!😮 这是什么?大约负66.39纳秒的裕量。怎么会变得这么糟糕?Fmax大约是14MHz,而我们想要的是125MHz。对于你们中的一些人来说,这可能感觉像是一个“考验”时刻。然而,您可以将其视为一个机会,通过理解并改进它来证明您的“真本事”。
输入延迟假设一个外部设备有一个由您的时钟驱动的输出触发器,将数据传送到FPGA的输入。输出延迟假设您的输出驱动另一个外部电路的输入触发器,该电路也参考同一时钟。本质上,时序分析器假设有一个时钟延迟将数据从FPGA的输入移动到输出。
在这个设计中,有两个具有较大组合逻辑延迟的电路:平方根IP块和Add 32电路。如果您能确定最长路径在哪里,您或许可以改进它。滚动到测试窗口底部,双击 Report Top Failing Paths。从A或B输入总线到ALU输出的路径将被列出,其负裕量大于60纳秒。您现在对问题的根源有了一些了解。
接下来,在任务窗口中向上滚动,在自定义报告下,双击 Report Timing。在打开的对话框中,在 From Clock 框中选择 C1,向下滚动并点击 Report Timing。您应该看到数据需求路径是6纳秒,但数据到达路径是72纳秒,相差负66纳秒。如果您向下滚动数据到达路径,您将看到该路径经过 alt_square_root 块。
啊哈!最坏的延迟是通过平方根函数。我们能做些什么来改进这一点呢?碰巧的是,平方根IP块可以进行流水线处理。
应用流水线优化 🚄
为了保存到目前为止在TimeQuest中的工作,选择 Constraints 菜单,然后选择 Write SDC File。删除对话框中出现的文件名中的 .out,然后点击 OK。点击 File -> Close 关闭TimeQuest。如果询问是否写入另一个SDC文件,请点击 No。
返回Quartus Prime并查看 pipepemt.bdf。双击平方根块。当 alt_square_root 的对话框出现时,对问题“您想对函数进行流水线处理吗?”回答“是”,然后为延迟的时钟周期数输入 8。这意味着您有效地在平方根逻辑路径中插入了8个触发器。点击 Next 两次,验证 square_root.bsf 框被选中,然后点击 Finish。点击 OK 覆盖。点击 Yes 更新平方根块,并为所选块点击 OK。
平方根块现在有一个时钟输入。将其连接到左侧的时钟线。从顶部菜单中,选择 File -> Save 保存 pipepemt.bdf。现在编译设计。
编译后,您将看到TimeQuest时序分析仍然是红色。但是,如果您展开此项并查看 Slow 85 degrees C Model,您将看到裕量已改善到负19纳秒,比以前好了三倍,Fmax现在约为37MHz。改善很大,但仍未达到预期。
进一步分析与总结 📊
要理解原因,请再次启动TimeQuest。双击 Create Timing Netlist。向下滚动并双击 Report All Summaries。查看建立时间摘要,裕量现在约为负19纳秒。双击 Report Top Failing Paths。现在您应该看到像以前一样来自A和B输入的路径,并且可能还将 C_in 作为源输入,输出是 sum 或 ALU_out。这表明限制性的关键路径现在在 add_32 块内,而不是平方根块。
向上滚动,在自定义报告下,双击 Report Timing。选择 clock1,然后向下滚动并点击 Report Timing。现在最坏情况的路径经过实例 add_32 块,到达 sum 或 ALU 输出。
我们能否通过流水线加法器来改进这一点?答案是肯定的,但这有点超出了我们目前想要做的范围。对于平方根函数来说很容易,因为流水线是IP块配置内置的——这是使用IP块的另一个原因。对加法器做同样的事情将需要大量的电路重新设计。
然而,我们可以进行其他改进。您可以在顶层通过寄存 ALU_out 和 sum 输出来流水线化设计路径,就像流水线乘法器有寄存器输出一样。这将划分输出缓冲器的延迟。同样,您可以寄存 A、B 和 C_in 输入,这将分离输入缓冲器的延迟。可以在Mux块的所有输入处放置寄存器。
但查看之前的数据到达路径,通过Mux的延迟是亚纳秒级的,所以这不会有太大帮助。您还可以在TimeQuest中编辑时钟约束,这可能会使Fmax稍微快一些。在寄存器更改之后,50MHz可能是一个不错的目标。如果不流水线加法器,这可能是我们在这个FPGA中能达到的最快速度。
我们今天已经做了足够多的调查工作。与其现在添加输入和输出寄存器,我们将把这留作学生练习。关闭TimeQuest,然后在Quartus Prime中选择 File -> Save Project。

总结 🎯

本节课中我们一起学习了如何通过流水线技术优化FPGA设计的时序。
总结本视频,输入和输出之间较大的组合延迟会显著降低设计的最大频率。在某些情况下,可以通过插入触发器将组合延迟分割成若干部分,这被称为重定时或流水线,具体取决于如何实现。IP块在某些情况下可以配置为使用流水线,这将增加延迟但提高设计的整体速度。


在本视频中,我们学习了:
- 流水线原理如何应用于改善FPGA设计的时序。
- 如何使用流水线和IP块来改善时序。
- 如何分析时序分析器结果,以识别可能从流水线中受益以改善时序的关键路径。
032:FPGA输入输出设计 🧩

在本节课中,我们将要学习FPGA输入输出(IO)设计的关键知识。具体内容包括:IO标准如何驱动内部信号分配到FPGA的外部引脚、常用IO标准的细节及其对系统性能的重要性、如何为不同应用选择合适的IO类型,以及进行引脚分配和跟踪IO属性的五种方法。
IO标准与结构回顾 🔌
上一节我们介绍了FPGA的基本架构,本节中我们来看看FPGA与外部世界通信的桥梁——输入输出单元。IO标准直接影响引脚分配。
根据经验,FPGA项目失败或延迟最常见的三个原因是:首次上电调试、高速接口(如PCIe和DDR3)设计,以及引脚分配和IO错误。这有些令人意外,因为引脚分配看似简单,但若忽视细节,就容易出错。
FPGA的IO能力非常灵活,即使在同一芯片内,IO标准也可能大不相同。这带来了跟踪所有IO分配的挑战。
IO在FPGA中以Bank(组) 的形式组织,每个Bank有一个电压参考。常见电压有3.3V、2.5V、1.8V,相邻的Bank可能使用不同的电压。
常用IO标准详解 ⚡
以下是FPGA中常用的IO标准类型:
- 单端IO标准:如LVTTL或LVCMOS,包含许多变体(如HSTL、SSTL、GTL等)。它们使用一个引脚传输一个信号。
- 差分IO标准:如LVDS、LVPECL、CML等。它们需要两个引脚(一对导体)来传输一个信号,能提供更好的抗噪性和更高的速度,但代价是占用更多引脚资源。
一个重要的原则是:全局网络(如全局时钟、复位)通常必须分配到特定的、能接入FPGA内部全局网络的引脚上。一个常见的PCB设计错误是将时钟信号连接到无法访问全局网络的FPGA引脚上,这可以避免。
单端信号即使在相同电压下,其电压摆幅也可能不同,这取决于它们是TTL还是CMOS标准。例如:
- TTL的
V_OH - V_OL约为2.0V。 - LVCMOS的
V_OH - V_OL至少为2.6V。
有些部件具有PCI兼容的IO,带钳位二极管。通过串联一个电阻,3.3V的PCI输入可以容忍5V电压。
为了降低功耗,LVCMOS有扩展到更低电压的版本。例如在1.5V时,其电压摆幅计算如下:
V_OH - V_OL = 1.025V - 0.4V = 0.625V
还有基于参考电压的单端逻辑系列,如SSTL(存根系列终端逻辑)和HSTL(高速收发器逻辑)。它们的输入参考点不是地,而是一个公共的参考电压V_REF。这提高了速度,但降低了噪声容限。
FPGA IO引脚内部电路 🏗️
一个典型的FPGA IO引脚内部电路简化版如下:
- 当配置为输入时,外部信号可以传播到输入寄存器,或直接旁路到FPGA逻辑阵列。
- 当配置为输出时,引脚可由一个寄存器直接驱动,并且输出可以被使能或禁用,以创建三态总线输出。
以Max 10器件为例,其IO引脚电路更为详细,核心仍是三个寄存器和一个输出使能。IO具有可编程的特性,例如:
- 转换速率:可设置为快或慢。
- 驱动强度:可从2mA到24mA或更高不等。
其他IO特性也同样重要,并且需要以Bank为单位进行分配,因为它们可能因Bank而异。例如:
- 有些引脚支持热插拔,或仅为输入/输出,而有些则不支持。
- 有些引脚兼容DDR或PCI,而大多数不兼容。
- 有些引脚是三态的,可用于创建外部总线,有些则不是。
引脚分配与属性跟踪的五种方法 📋
面对如此多的选项,我们如何有效管理?像所有优秀的工程师一样,我们可以使用工具来跟踪。Quartus Prime等工具提供了使用电子表格来制定和记录分配的工具。
在Altera(现Intel)FPGA中,你可以通过以下五种方法之一进行引脚分配:
- 使用图形用户界面工具:如Pin Planner或Assignment Editor。
- 从文件导入:从SDC文件或Excel电子表格文件导入分配。
- 在HDL代码中编写指令:在Verilog或VHDL源文件中直接指定引脚分配。
- 使用Tcl脚本自动化:编写Tcl脚本来自动化分配过程。
- 从PCB布局CAD工具导入:将PCB设计工具与FPGA设计流程集成。
我们将按相反的顺序简要了解这些方法。
从PCB布局CAD工具导入有助于减少引脚分配错误,因为设计规则检查可以确保电路板和FPGA的分配相匹配。
使用Tcl脚本自动化是许多FPGA设计师喜欢的方式,它可以实现流程的自动化。
在HDL代码中包含引脚分配通常很有帮助,因为这样设计的源文件和引脚分配就位于同一处。这在Verilog和VHDL中都可以实现,例如:
// Verilog 示例
(* chip_pin = "A1" *) input wire clk;
(* chip_pin = "B2" *) output reg [7:0] data;

或许最高效的引脚分配方法是利用FPGA供应商的图形化工具,例如Altera的Pin Planner界面,它提供了直观的引脚映射和属性设置功能。
总结 📝
本节课中我们一起学习了FPGA输入输出设计的核心内容。
我们了解到,FPGA拥有广泛的IO能力,包括多种IO标准和可控的电路特性,但丰富的选项也导致了频繁的错误。我们可以通过使用有助于记录和跟踪IO使用情况的方法来减少引脚分配错误。
像LVDS和LVPECL这样的差分逻辑标准在FPGA中越来越流行,因为它们能同时提高速度和抗噪性。然而,这些标准需要导体对,这进一步复杂化了引脚分配过程。
具体而言,我们学习了:
- FPGA中常用IO标准的细节及其对整体性能和系统要求的重要性。
- 如何确定各种应用所需使用的IO类型。
- 进行引脚分配和跟踪IO属性的五种方法。
033:精准引脚分配


在本节课程中,我们将学习如何将FPGA设计中的内部信号分配到外部引脚上。引脚分配决定了你的设计如何与外部世界交互,因此正确操作至关重要。我们将学习使用引脚规划器和分配编辑器进行引脚分配,如何满足I/O标准并控制I/O属性,以及如何使用I/O分配分析器检查引脚分配。

以下是本视频将涵盖的内容:
- 使用引脚规划器为设计分配引脚。
- 使用分配编辑器为设计分配引脚。
- 使用I/O分配分析器检查引脚分配。
引脚分配方法概述 📋

在Altera FPGA中,有五种方法可以进行引脚分配:
- 使用Quartus GUI工具,即引脚规划器或分配编辑器。
- 从SDC文件或Excel电子表格文件导入。
- 在HDL文件(如Verilog或VHDL)中编写指令。
- 使用Tcl脚本和Tcl命令自动化操作。
- 从PCB布局工具导入。
本视频将展示第一种方法,即如何使用引脚规划器和分配编辑器。
准备工作与项目打开 🛠️
在启动Quartus Prime之前,请将提供的 pipeline_QP16_under_one_M4V4.zip 文件解压到 C:\Altera_prj 目录下,以确保大家使用相同的设计文件。
启动Quartus Prime并打开 Pipeline 项目。在项目导航器中双击 Pipeline.bdf,原理图应会显示。在进行分配之前,必须执行编译的第一步:分析与综合。如果尚未完成,请现在执行。
在此之后可以随时进行分配,但任何更改都需要重新运行综合之后的流程步骤,以使设计更新反映这些更改。
使用引脚规划器进行分配 🗺️
引脚规划器是一个用于进行引脚分配和设置I/O约束的交互式图形工具。它使得为设计中所有I/O进行分配变得容易。可以从“Assignments”菜单、工具栏或任务窗口访问它。
点击“Assignments”菜单并选择“Pin Planner”。规划器会在中心窗口显示器件引脚布局图,底部窗口列出需要分配引脚的信号或节点(称为“All Pins”列表),右侧窗口是引脚图例,左下角是任务窗口,左上角窗口是信号组列表。如果缺少任何窗口,可以从“View”菜单添加。
有多种方法可以进行引脚分配:
- 可以从信号列表中将节点名称拖放到封装视图中的某个引脚上。
- 也可以双击“Location”单元格,为信号分配一个位置(引脚或I/O Bank)。
但是,必须确保正确的信号连接到正确的引脚,尤其是时钟信号。请查阅评估板用户手册或用户指南中的器件引脚排列,或查看所用电路板的原理图。正确完成引脚分配非常重要,否则在电路板上电时可能会损坏FPGA,特别是如果将输入信号连接到输出引脚。全局信号(通常是时钟和复位)也必须正确连接。还必须确保所分配引脚的I/O电压和标准正确。
分配时钟与复位信号 ⏰
假设你使用的是BeMicro MAX 10板。通过查看BeMicro MAX 10的原理图,可以确定哪些引脚和信号应该连接在一起。在原理图第2页,你会发现一个50 MHz时钟连接到引脚N14,一个24 MHz时钟连接到引脚N15。
在“All Pins”列表中,向下滚动到 clock1 信号,点击它并将其拖到部件布局图中的N14引脚上。符号会先变成蓝色,然后在点击空白处后变成棕色,表示该节点已被分配。注意引脚符号是一个上升沿,表示该引脚连接到内部时钟网络。
选择“View”菜单并点击“Zoom In”几次,以查看每个引脚的不同属性。每个引脚的形状、颜色和文本都提供了该引脚属性的信息。例如,独特的颜色有助于识别每个I/O Bank。三角形代表电源和地引脚,圆形代表特殊功能引脚,正方形是时钟引脚,五边形是JTAG引脚,六边形是通用I/O引脚。这些及更多信息显示在引脚图例窗口中。
如果双击N15,你将看到引脚属性窗口,它允许你为这个引脚分配一个节点(与将节点拖到引脚上相反)。我们没有更多时钟了,所以关闭引脚属性窗口。
你可以通过转到任务窗口并点击“Highlight Pins”,然后选择“Clock Pins”,再选择“Clock”,来查看此器件上所有可用的时钟引脚。由此,你可以看到有8个专用时钟引脚。在报告窗口中取消选中“Clock Pins”框以移除高亮显示。
回到“All Pins”窗口,clock1 节点现在已用I/O Bank 6的颜色着色,并且位置也已显示。你还需要设置I/O标准和驱动强度。
在“I/O Standard”列中,双击 clock1 条目,会出现一个下拉菜单。选择 3.3-V LVCMOS,因为原理图中使用的就是这个电压。双击 clock1 的“Current Strength”条目,从菜单中选择 2 mA。
另一个全局信号是 reset。引脚D9连接到一个全局复位网络。在“All Pins”窗口中向下滚动找到 reset(在“N”下),并将其拖放到芯片布局图的D9引脚上。将I/O标准更改为 3.3-V LVCMOS。
批量分配I/O标准与总线引脚 🚌
与其逐个更改I/O标准分配,不如在“Groups”窗口中点击I/O标准,一次性为整个总线设置标准。在“Groups”窗口中,滚动到“I/O Standard”列,选择 3.3-V LVCMOS。
引脚规划器会在你操作时保存更改。你不能认为退出时更改未保存,因为它们在你操作时就已经保存了。现在,通过将所有I/O总线分配给 3.3-V LVCMOS 来重复分配I/O标准。
要为总线分配引脚,请从“Groups”窗口中选择总线,并将其拖放到芯片布局图外部的I/O Bank框上。如果看不到I/O Bank,请在空白处右键单击并选择“Show I/O Banks”。
将 A 总线分配到一个I/O Bank:将其拖到I/O Bank 8,释放,然后在空白处单击以完成此总线的放置。这允许适配器在Bank内分配各个引脚。如果将鼠标悬停在Bank框上,可以看到I/O使用情况。在“All Pins”窗口中,位置被列为 IOBANK_8。
继续为剩余的总线分配引脚:
- 将
ALU_out总线拖到Bank 7。 - 将
B总线拖到Bank 6。 - 将
C_out拖到Bank 7。 - 将
Data_A和Data_B拖到Bank 5。 - 将
IR拖到Bank 6。 - 将
Q拖到Bank 4。 - 将
Sum拖到Bank 3。
要查看所有这些工作的结果,请从“View”菜单中选择“IO Banks”。你还可以通过右键单击空白处并选择“Rotate”或“Top/Bottom View”来更改器件的视图,例如旋转芯片或从顶部/底部查看。
使用分配编辑器进行分配 📝
我们也可以使用分配编辑器进行引脚分配。要启动分配编辑器,请返回Quartus,从顶层菜单点击“Assignments”,然后选择“Assignment Editor”。分配编辑器应出现在中心窗口。
分配编辑器看起来像一个电子表格。每一行代表一个分配。可以在分配编辑器中进行许多类似电子表格的操作,如复制和粘贴等。条目可以直接输入或从下拉菜单中选择。
你可以输入信号名称,或使用节点查找器查找信号。滚动到底部并双击“To”列。点击双筒望远镜图标打开节点查找器。你可以使用通配符:问号 ? 代表单个字符,星号 * 代表多个字符。在“Named”框中输入 RD* 并按回车。在“Matching Nodes”中,RD_address 应该出现,点击它,然后点击右箭头将其移动到“Nodes Found”框中,点击“OK”。
双击“Assignment Name”并向下滚动选择 Location。双击“Value”,为“Element”选择 IOBANK,然后为“Location”选择 BANK 5。点击“OK”。
你也可以从其他窗口交叉探查,以在分配编辑器中获取特定信号或实体。点击 Pipeline.bdf 原理图选项卡。右键单击 WR_address 信号端口,然后选择“Locate Node”,再选择“Locate Node in Assignment Editor”。WR_address 信号会单独出现在分配编辑器中,因为它被自动过滤出来了。
点击“To”列顶部的 WR_address。按 Ctrl+C,然后点击底部“To”列中显示“new”的行。在此旁边的“Assignment Name”中,输入 Location。在此旁边的“Value”列中,双击并为“Element”选择 IOBANK,为“Location”选择 IOBANK_5。
清除“Filter on node name”复选框以查看分配编辑器中的所有信号。在下一行的“To”列中输入 WREN。在此旁边的“Assignment Name”中,输入 Location。在此旁边的“Value”列中,双击并为“Element”选择 IOBANK,为“Location”选择 IOBANK_5。
我们还有两个引脚要分配:C_in 和 C_out。在接下来两行的“To”列中,输入 C_in 和 C_out。向上滚动到 Sum 的 Location 条目,点击并选择 Location 和 IOBANK_3 条目,然后按 Ctrl+C。选择 C_in 右侧的两个单元格,按 Ctrl+V 粘贴 Location 为 IOBANK_3。对 C_out 重复此操作。
在“File”菜单中,选择“Save”以保存在分配编辑器中所做的分配。分配可以直接保存,或者在执行编译时会自动保存到 .qsf 文件中。你也可以直接在Quartus设置文件(.qsf)中输入引脚分配,或者创建一个包含所有引脚分配的单独Tcl文件,然后在 .qsf 文件中引用此文件。
你可以将引脚分配导出到Excel CSV文件,以供当前或其他设计以后使用。为此,从“File”菜单点击“Export”,并保存为 .csv 文件。如果进行了更改,你可以在Quartus中更新约束。
检查与验证引脚分配 ✅
现在I/O分配已完成,你可以进行I/O分析,以检查所有引脚分配相对于彼此和器件是否合法。你可以在Quartus中,通过点击“Analysis & Synthesis”下的任务窗口中的“I/O Assignment Analysis”来完成此操作,或者从引脚规划器的“Processing”菜单中执行。
分析完成后,你可能会看到一个关于I/O Bank 8中引脚过多的错误消息。让我们回到引脚规划器修复这个问题。在引脚规划器中,通过点击下拉菜单,将 A[31] 的位置更改为 IOBANK_6。
现在你必须通过将 A[30] 更改为 IOBANK_8,然后按 Ctrl+C,选择其余的 A 信号并按 Ctrl+V 粘贴 IOBANK_8 给它们,来重置总线 A 的其余部分为 IOBANK_8。
完成后,从引脚规划器的“Processing”菜单中,选择“Start I/O Assignment Analysis”。成功!你现在已经为FPGA完成了完整的引脚分配。
引脚分配也记录在 .pin 文件中。通过查看Quartus中编译报告下的“Fitter” -> “Pin-Out File”,你可以看到 .pin 文件,其中列出了每个引脚的分配。
课程总结 📚


总结本视频,在Quartus Prime中,可以轻松地使用引脚规划器图形工具或分配编辑器电子表格进行引脚分配。将时钟和复位等全局信号分配到全局网络引脚非常重要。I/O分配分析器可以检查引脚分配,确保其完整且正确。
在本节课中,我们一起学习了:
- 如何使用引脚规划器和分配编辑器进行引脚分配。
- 如何使用分配编辑器满足I/O标准并控制I/O属性。
- 如何使用I/O分配分析器检查引脚分配。


034:FPGA编程配置 🚀

在本节课中,我们将学习如何对FPGA进行编程和配置,使其能够在硬件中运行。你将了解FPGA的各种配置方案、所需的硬件设计与软件、不同场景下使用的编程文件类型,以及如何使用Quartus Prime Programmer工具来检查和编程链式连接的FPGA与PLD设备。
配置与编程的基本概念
上一节我们介绍了FPGA的逻辑设计流程。完成设计后,自然希望将其在硬件中实现。为此,你需要对FPGA进行编程或配置。
- 编程通常指将定义设备行为的文件内容存入存储器的过程,无论设备是微控制器还是可编程逻辑器件。
- 配置则是将该存储器内容加载到设备中,以建立其特定行为的过程。
FPGA的配置模式
为了适应不同的配置场景和需求,FPGA支持多种配置模式。对于Altera FPGA,配置存储器通常通过JTAG编程电缆直接加载,或通过板载的、连接到FPGA的存储器加载。
以下是Cyclone V器件支持的几种配置模式示例:
| 模式 | 描述 |
|---|---|
| JTAG | 必须使用编程电缆。 |
| 主动串行 (AS) | FPGA从板载串行闪存加载配置镜像。 |
| 被动串行 (PS) | 外部主机(如微处理器)通过串行接口配置FPGA。 |
| 快速被动并行 (FPP) | 外部主机通过并行接口高速配置FPGA。 |
| 配置协议 (CVP) | 通过PCIe等协议进行配置。 |
JTAG模式必须使用电缆。其他模式通常从板载存储器、CPLD或微处理器加载FPGA。显然,并行模式比串行模式速度更快,但需要更多的板载资源。某些模式还支持特殊功能,如部分重配置和远程系统更新。
配置模式的硬件设计
每种配置模式的硬件设计各不相同。
JTAG配置接口
这里展示的部分原理图描述了JTAG配置接口的典型设计,这在评估板上很常见。JTAG配置可以与其他配置模式结合使用,但它始终具有最高优先级。
在JTAG配置中,JTAG命令和数据被直接发送到FPGA,以编程其内部配置存储器。传输完成后,FPGA即被配置并准备运行。
主动串行 (AS) 配置
在主动串行模式中,串行闪存器件存储配置镜像,FPGA在上电时将其加载到配置存储器中。
其原理图通常与JTAG电缆连接器一同展示,后者在此用于对存储器器件进行编程。通常,该连接器在生产板上可能不焊接,仅用于开发。生产用的闪存通常已预编程,无需通过电缆编程。有些板卡设计会采用单个大容量闪存存储多个镜像,以支持链式连接的多个FPGA。
快速被动并行 (FPP) 配置
另一种常见配置方案是快速被动并行模式,如图所示。连接到存储器器件的CPLD或微处理器在上电时主动将数据传输给FPGA。这允许对配置过程进行更多控制,且速度更快。
MAX 10 FPGA的独特配置
MAX 10是Altera的一款独特产品,它拥有用于配置的内部闪存,因此有两种编程方式:
- 使用JTAG,像其他FPGA一样,通过
.sof文件直接编程SRAM配置单元。 - 同样使用JTAG,但编程的是配置闪存,该闪存内容会在上电时传输到SRAM配置单元。

JTAG编程需要编程电缆,如USB-Blaster 2或Ethernet-Blaster 2。
编程文件类型
除了为特定配置方案正确设计硬件外,还必须拥有用于编程器件的编程文件。
编程文件有几种类型:
.sof(SRAM Object File):用于通过Quartus Prime软件和下载电缆直接配置FPGA。这是最常见的编程文件类型,在开发阶段通过JTAG电缆直接下载设计进行首次测试时使用。.pof(Programmer Object File):用于编程CPLD、闪存FPGA和配置闪存。.jam或.jbc(JAM Byte-Code):一种由处理器和测试设备通过JTAG编程器件时使用的ASCII文件。.jic(JTAG Indirect Configuration File):用于通过FPGA的专用配置连接来编程EPCS系列Altera串行配置器件,因为配置器件本身没有JTAG接口。
使用Quartus Prime Programmer
Quartus Prime Programmer是一个控制FPGA编程的软件工具。当你从工具栏的“Tools”菜单打开Programmer时,它会创建一个链描述文件 (.cdf),用于存储设备编程链信息,因为一个编程链中可以有多个FPGA。
编程窗口中会显示该链的图示。让我们看一个例子。
操作步骤示例
- 打开Programmer:打开Quartus Prime,选择
Tools->Programmer。编程器窗口将打开。 - 连接硬件:此时,应连接好待编程的板卡。演示中我们使用MAX 10板。注意,编程前板载LED以特定模式闪烁。
- 硬件设置:点击左上角的
Hardware Setup按钮,选择要使用的硬件(如USB-Blaster电缆),然后点击Close。编程设备必须已安装驱动并能被正确检测到才会出现在列表中。 - 选择编程模式:接下来选择编程模式,最常见的是JTAG。JTAG链可以包含非Altera和Altera设备。
- 使用工具栏命令:硬件设置完成后,编程器中的工具栏提供了控制设备编程所需的所有命令。例如,可以安排链上设备的编程顺序。其他常见操作包括:
Auto-Detect:扫描链并报告发现的设备。Change File:为选定的目标设备选择新的编程文件。
- 自动检测设备:点击
Auto-Detect,编程器将显示设备链。 - 其他操作:你还可以在编程后验证设备、进行空白检查、擦除设备或设置安全位(如果可用)。
- 选择编程文件:点击
Add File,选择文件(例如led_blinker.pof),然后点击文件名。可能需要删除列表中已有的其他文件。 - 开始编程:当所有设备定义完毕且选项设置正确后,点击左上角的
Start。进度条显示编程状态,信息窗口提供详细状态和可能出现的错误信息。 - 完成与观察:当进度条达到100%时,编程完成。观察板卡,在编程期间LED停止闪烁,编程完成后重新开始闪烁。
- 上传编程文件:你还可以通过选择
Examine来上传编程文件。在上传过程中,注意LED会停止闪烁,因为它处于上传状态。上传后,可以保存此文件并用于编程其他板卡。

总结

本节课中,我们一起学习了FPGA如何通过各种配置方案进行配置,从JTAG到主动串行,再到快速被动并行。每种方案都有其独特的硬件设计和所需的软件。我们还了解了在不同配置情况下应使用哪种编程文件类型,以及如何使用Quartus Prime Programmer工具来检查和编程链式连接的FPGA与PLD设备。
035:Qsys系统设计入门(第一部分)🚀

在本节课中,我们将学习如何使用Altera的Qsys系统设计工具,在FPGA内部快速构建一个包含Nios II软核处理器的完整系统。我们将从创建项目模板开始,逐步添加时钟源和处理器核心。
概述 📋
在之前的课程中,我们学习了如何设计逻辑来创建一个原型ALU。然而,我们可以利用Qsys的强大功能,非常快速地创建一个真正的ALU,甚至可以在FPGA中使用Qsys设计工具构建一个完整的片上系统CPU。
在本演示中,你将学习如何使用系统设计工具Qsys在FPGA内设计一个系统。完成学习后,你可能会被误认为是Qsys专家。
你将学习:
- 如何使用项目模板加速设计工作的开始。
- 如何创建一个Qsys系统。
- 如何添加时钟。
- 如何添加一个Nios II处理器。
系统设计流程概览 🔄
上一节我们介绍了课程目标,本节中我们来看看典型的Nios II系统设计流程。
下图描绘了Nios II系统设计的典型流程。它包含硬件分支和软件分支。在本视频中,我们将专注于硬件开发。

硬件系统定义使用Qsys完成。Qsys系统生成的HDL文件由Quartus FPGA设计软件使用,用于映射、适配并将硬件映像下载到FPGA器件中。
Quartus还会生成描述Qsys中系统配置的信息,以便Nios II软件开发工具能够创建一个与硬件系统匹配并包含所有正确外设驱动程序的软件库。
硬件流程的输出是一个用于配置FPGA的映像文件。软件流程的输出是一个可执行文件,Nios II处理器将执行其中的指令。
目标系统框图 🎯
以下是我们要构建的系统框图。它包括:
- 由开发板上外部50 MHz振荡器驱动的锁相环。
- Nios II片上CPU。
- 用于程序和数据存储的片上RAM和闪存。
- 一个1毫秒的系统定时器。
- 系统ID模块。
- LED和按键接口。
- 连接到软件开发和FPGA配置工具的JTAG连接。


所有这些组件都通过Avalon总线或总线桥连接在一起。
第一步:创建新项目 📁
现在,我们开始动手创建项目。以下是创建新项目的具体步骤。
- 在你的Altera项目目录下创建一个名为
Qsys_intro的文件夹。 - 下载文件
Qsys_intro.sdc并存储在此处。 - 启动Quartus Prime,选择 File -> New Project Wizard。
- 在工作目录中,输入
C:\Altera_Project\Qsys_intro,并将项目命名为Qsys_intro。点击 Next。 - 在项目类型对话框中,选择 Project template。这与我们之前的操作不同。点击 Next。
- 在下一个框中,为系列选择 MAX 10,为开发套件选择 BeMicro MAX 10 FPGA Evaluation Kit。
安装设计模板(如需) ⚙️
如果“BeMicro MAX 10 FPGA Evaluation Kit”未出现在选项中,你可能需要从设计商店下载设计模板。如果需要这样做,此对话框底部提供了一个链接。
- 点击 Design Store,链接将带你进入设计商店网页。
- 确保选择 Design Examples。
- 为系列选择 MAX 10,为类别选择 Design Example,然后为套件选择 BeMicro MAX 10 FPGA Evaluation Kit。
- 选择 BeMicro MAX 10 Baseline Pinout for Qsys version 16.1。下载安装包。
- 将
.par文件保存在项目目录中。 - 下载后,返回Quartus,按照指示第二步安装设计模板。
- 点击 Install a Design Template,在对话框中指定
.par文件的位置。 - 点击 OK,从设计模板列表中选择 BeMicro MAX10 Kit Baseline Pin Out,然后点击 Next。
- 在摘要框中点击 Finish。
项目基础文件 📄
项目创建完成后,我们来看看生成的基础文件。
当你的项目在项目导航器的“Files”下打开时,你会看到两个文件:一个 .sdc 文件和一个顶层 .v 文件。这是你设计的基础,它定义了所有外部信号并分配了引脚。
如果你打开引脚规划器,你将看到这些信号和引脚分配。关闭引脚规划器。
在项目导航器中双击 .v 文件。在其中,你将看到定义连接到FPGA的开发板上各种组件接口的代码。
我们现在准备好创建第一个Qsys系统了。
创建Qsys系统 🛠️
上一节我们准备好了项目环境,本节中我们来创建第一个Qsys系统。
要创建我们的Qsys系统,请选择 File -> New -> Qsys System File。Qsys系统集成工具在一个新窗口中启动。第一次启动可能需要一些时间。
在Qsys窗口的左侧,你会看到一个IP目录,其中包含可以导入到你的Qsys系统中的库函数。花些时间浏览一下,看看里面有什么。特别是,“University Program”基本函数下有许多有用的功能。
上述系统可以使用可重用IP块的标准库在Qsys中创建。系统互连结构由Qsys自动生成,并将各个模块绑定在一起。系统互连接口管理动态总线宽度匹配、中断优先级、仲裁和地址映射。当包含Nios II软核处理器时,该系统是一个功能齐全的处理器系统,能够运行诸如µC/OS-II或Linux等操作系统。
我们将指导你完成构建一个基本嵌入式系统的过程。你将逐步构建我们之前展示的系统框图的一个子集,一次一个模块,一步一个脚印。
添加锁相环作为时钟源 ⏰
对于第一步,添加一个Avalon alt PLL作为处理器、外设和存储器的时钟源。这个外设实例化了一个PLL,它将为系统生成时钟。
以下是添加和配置PLL的步骤:
- 从IP目录窗格中,展开 Basic Functions,然后展开 Clocks, PLLs and Resets。
- 接着展开 PLL,并双击 Avalon alt PLL。这将添加Avalon alt PLL模块。
- alt PLL MegaWizard打开,将输入时钟频率更改为 50 MHz,点击 Next 进入向导的下一页。
- 在下一页,取消选中 “Create an ‘areset’ input to asynchronously reset the PLL” 和 “Create ‘locked’ output” 两个选项。
- 点击 Next,并在带宽页面、切换页面和配置页面上也点击 Next。
- 你现在应该看到 c0 core/external output clock。
- 在 c0 core/external output 上,点击 “Enter output clock frequency” 按钮并输入 80 MHz。该时钟将用作处理器系统时钟,为Nios II处理器提供时钟。点击 Next。
- 选中 “Use this clock” 按钮。点击 “Enter output clock frequency” 按钮并输入 40 MHz。该时钟将用于为系统中的各种外设提供时钟。点击 Next。
- 对于时钟 c2,接受默认值并点击 Next,对 c3 和 c4 执行相同操作。
- 在摘要页面,点击 Finish。
现在,alt PLL(under_0)已添加到Qsys中。底部控制台将出现一些错误和警告,指示各种端口未连接。暂时忽略这些。我们将在接下来的步骤中处理这些连接。在添加每个组件后,你将继续看到这些消息。但不用担心,它们是提醒你还有哪些连接需要完成的好提示。
连接时钟和复位信号 🔌
接下来,我们将传入的时钟和复位信号连接到PLL。Qsys需要知道使用什么时钟和复位源作为PLL组件的输入。时钟和复位源可以来自外部源,也可以来自Qsys系统内的另一个组件。在我们的例子中,我们将把它们连接到外部时钟和复位。
- 点击 System Contents 选项卡,查看系统中组件的视图。此时,有两个组件:一个是Qsys首次启动时默认存在于系统中的时钟源组件,另一个是我们在第一步中添加的Avalon alt PLL组件。
- 时钟源组件是一个Qsys组件,它从Qsys系统外部引入时钟和复位源。我们将把它的节点连接到Avalon PLL组件上的相应节点。
- 在 Connections 列中,将鼠标悬停在连接点上,你将能够填充连接点以建立连接。
- 将时钟源的 clk_in 输出端口连接到alt PLL组件的 inclk 接口。
- 类似地,将时钟源的 clk_in_reset 输出端口连接到Avalon alt PLL组件的 areset 接口。
你完成的连接应如下所示。我们尚未保存系统,让我们借此机会保存工作。从文件菜单中点击 Save As,并将系统保存为 Nios2_intro.qsys。保存完成后关闭窗口。
添加Nios II处理器 🧠
接下来,我们要添加一个Nios II处理器。需要一个CPU来运行控制算法。Nios II是一个用FPGA可编程逻辑构建的32位CPU,具有许多独特的优势。显然,它可以轻松配置,并且可以定制为仅包含你所需的功能。正如我们将看到的,该核心的许多功能是可选的。此外,结合Qsys中可用的总线互连,可以非常容易地扩展处理器系统以包含广泛的内存和外设。你可以只包含你需要的部分,因此资源使用可以非常高效。性能经过优化,因此速度合理,尽管不如硬核处理器。然而,与硬核处理器不同,过时不是问题,一旦设计完成,软核系统现在和将来都可以应用于FPGA。
以下是添加和配置Nios II处理器的步骤:
- 从IP目录窗格中,在 Library 下展开 Processors and Peripherals,然后展开 Embedded Processors,并双击 Nios II Processor。
- Nios II处理器配置窗口打开。在 Core Nios II 选项卡中,确保选择了 Nios II/f (fast)。点击 JTAG Debug Module 选项卡,将硬件断点数量从 0 更改为 2。
- 在 Caches and Memory Interfaces 选项卡中,将指令缓存大小减少到 2 KB。
- 在 Vectors 选项卡中,将复位向量存储器设置为
nios2_cpu.debug_mem_slave,并对异常向量存储器执行相同操作。 - 对话框的各个页面上还有许多其他选项,包括添加MMU和硬件除法器等。我们现在保持简单,接受所有剩余的默认设置,点击 Finish。
你可能会看到两条错误消息,要求将Nios II连接到时钟和复位。
- 将 Nios II 的时钟输入连接到 alt PLL 的 c0 输出。
- 将 Nios II 的复位输入连接到 clock source 的 clk_reset 输出。
错误消息现在应该消失了。看,这有多简单。
3. 右键单击名称字段,将Nios II组件从 nios2_gen2_0 重命名为 nios2_cpu。
4. 你可能需要双击Nios II CPU,在参数窗口中修改复位和异常向量。将它们更改为 nios2_cpu.debug_mem_slave。
5. Nios II可以通过Avalon内存映射总线接口动态重新配置PLL,将 Nios II 的 data_master 连接到 alt PLL 的 s1。
此时,系统应该看起来像这样。我们已经创建了构成一个CPU系统所需的基本组件:复位、时钟和处理器。
在下一个视频中,我们将学习如何添加内存和外设,然后编译该系统并分析结果。
点击 File -> Save。关闭保存框。然后点击 File -> Exit 关闭Qsys。保存项目,保存所有并关闭Quartus。

总结 🎓
本节课中我们一起学习了Qsys系统设计的第一部分。
总结本视频,Qsys是一个功能强大且易于使用的工具,可以使用框图概念和详细连接来创建完整的系统。与其从头开始设计CPU和片上逻辑,更好的替代方案是使用现有的CPU设计,如Altera的Nios II。设计可以非常快速地完成,并且针对性能和资源使用进行了优化。

在本视频中,我们学习了:
- 如何使用项目模板加速设计工作的开始。
- 如何创建一个Qsys系统。
- 如何添加锁相环作为时钟源。
- 如何创建一个Nios II软核处理器。
036:Qsys 系统设计精修(第二部分)🔧
在本节课中,我们将继续完成一个基于 Nios II 软核处理器的 Qsys 系统设计。上一节我们介绍了 Qsys 设计工具并创建了处理器。本节中,我们将为嵌入式系统添加内存和外设,并对最终设计进行分析。你将学习如何为 Nios II Qsys 设计添加内存与外设、总线桥的作用及其在 Qsys 中的实现方法,以及如何将 Qsys 设计集成到顶层模块中进行编译。

以下是本视频将要涵盖的内容:
- 我们将通过添加内存和几个简单外设(包括 UART 和定时器)来完成 Qsys 项目。
- 我们将通过创建原理图符号,在顶层实例化 Qsys 设计。
- 我们将编译 Qsys 设计,并使用 RTL 查看器分析设计。
下图描绘了典型的 Nios II 系统设计流程。我们正处于 Qsys 中“定义系统”阶段的中间,我们将完成此阶段,然后进入 FPGA 设计阶段。通过使用项目模板,引脚分配已为我们处理妥当,时序约束则由包含的 SDC 文件提供。

这是我们正在构建系统的框图。我们已经完成了左上角的两个模块,现在我们将继续完成其余部分。


启动 Qsys 并添加片上 RAM
启动 Quartus,打开 Cusis_under_control 项目,它应该会列在最近的项目中。通过选择 Tools 菜单,然后选择 Qsys 来启动 Qsys。选择 Nios_II_under_control.qsys 并点击 Open。
我们之前在 Qsys 中已经完成了四个步骤,现在进行第五步:添加片上 RAM。Altera FPGA 提供了内部片上存储器块,可用于构建内部 RAM 或 ROM 内存块。这为处理器提供了访问极低延迟、高速内存的途径,用于存储代码或变量。
在左侧的 IP 库中,展开 Basic Functions,然后展开 On-Chip Memory,双击 On-Chip Memory (RAM or ROM)。在出现的对话框中,取消勾选 Initialize memory content 框,接受所有其他默认设置,然后点击 Finish。
回到 Qsys 窗口,右键单击名称字段,从弹出菜单中选择 Rename。将此 RAM 组件命名为 onchip_under_RAM。将内存的 clk 输入连接到 altpll_under_0 的 c0 时钟。同时,将内存的 reset1 信号连接到 clk_under_reset 输出。
在 Connections 列,将 onchip_under_RAM 的 s1 Avalon 内存映射从接口连接到 nios2_under_cpu 的 instruction_master 和 data_master。将 onchip_under_RAM 的 s1 基地址设置为 0x10000。
添加片上 Flash
下一步,添加片上 Flash。MAX 10 FPGA 包含一个片上 Flash,用于存储 FPGA 配置,也可用于存储 Nios II 代码或其他非易失性数据。
在库中,展开 Basic Functions,展开 On-Chip Memory,双击 Altera On-Chip Flash。将时钟频率更改为 80 MHz。将 CFM access mode 更改为 Read and Write,然后点击 Finish。
在 Clock 列,选择 altpll_under_0.c0 作为 onchip_flash 的时钟。将 onchip_flash 的 reset 连接到 clk_under_resets 信号。将 data 接口连接到 nios2_under_cpu 的 data_master 和 instruction_master。将 csr(控制和状态寄存器)接口仅连接到 nios2_under_cpu 的 data_master。
将 onchip_flash 的 data 基地址更改为 0x00200000。将 onchip_flash 的 csr 基地址更改为 0x00300000。
为慢速外设添加 Avalon 内存映射时钟交叉桥
下一步,我们将为慢速外设添加一个 Avalon 内存映射时钟交叉桥。我们将把几个慢速外设放在与 Nios II 处理器不同的时钟域中。通过使用桥接器,系统为所有慢速外设构建了一个单一的时钟交叉桥。
外设通常需要工作在不同的时钟下,为它们创建一个桥接器是处理不同时钟域的通用技术。桥接器接收 Avalon 总线上的数据、地址和控制信号,并将其转换为外设所需的信号,以便在设备之间交换数据。
从 IP 目录菜单,展开 Basic Functions,展开 Bridges and Adapters,展开 Memory Mapped,双击 Avalon-MM Clock Crossing Bridge。将地址单位更改为 Words。将命令 FIFO 深度更改为 8,响应 FIFO 深度更改为 32。点击 Finish。
将内存映射桥的 m0 时钟连接到 PLL.c1 时钟,s0 时钟连接到 PLL.c0 时钟。像往常一样,将两个复位都连接到 clk_under_reset。将 nios2_under_cpu 的 data_master 端口连接到此桥的 s0 Avalon 内存映射从端口。m0 主端口将在后续步骤中连接。
将 Avalon_MM_Clock_Crossing_Bridge 的 s0 基地址更改为 0x00002000。
添加用于 LED 的 GPIO 外设
现在是第八步,添加用于 LED 的 GPIO 外设。DE10-Max 10 开发板有 8 个 LED。你可以使用输出 PIO 外设来集体或单独驱动这些 LED。
从 IP 目录菜单,展开 Processors and Peripherals,展开 Peripherals,双击 PIO (Parallel I/O)。将宽度设置为 8 位。确保方向设置为 Output only,点击 Finish。将此外设重命名为 LED_PIO。
将此外设 s1 从端口的连接更改为连接到 slow_peripheral_bridge 的 m0 主端口。在 Clock 列,选择 altpll_under_0.c1 作为其 clk 输入时钟。使用 clk_under_reset 作为其复位输入。将其基地址更改为 0x00000050。
最后,双击 external_connection 端点旁边的 click to export 字段,将名称更改为 LED_PIO_external。
添加用于按钮开关的 PIO 外设
第九步,添加用于按钮开关的 PIO 外设。DE10-Max 10 有四个标记为 SW1、SW2、SW3 和 SW4 的按钮开关,连接到 FPGA 的四个 I/O 引脚。你可以使用输入 PIO 外设来检测这些按钮何时被按下,并向处理器发出中断信号。按下时,这些信号是低电平有效的。
从 IP 目录菜单,展开 Processors and Peripherals,展开 Peripherals,双击 PIO (Parallel I/O)。将宽度设置为 4 位,方向设置为 Input。在 Edge Capture Register 部分,勾选 Synchronously capture 和 Rising Edge 选项。在 Interrupt 部分,勾选 Generate IRQ 和 Edge 选项。在 Test Bench 选项中,勾选 Hardwire PIO inputs 并将输入驱动为 0xF。点击 Finish。
将此外设重命名为 button_PIO。将此外设 s1 从端口的连接更改为连接到 slow_peripheral_bridge 的 m0 主端口。在 Clock 列,选择 altpll_under_0.c1 作为其 clk 输入时钟,clk_under_reset 作为其复位输入,如前所述。将其基地址更改为 0x00000040。
最后,双击 external_connection 端点旁边的 click to export 字段,命名为 button_PIO_external。
添加 1 毫秒间隔定时器外设
下一步是第十步,添加一个 1 毫秒间隔定时器外设。许多软件应用程序需要周期性中断来维护应用程序内的各种时间基准和时序要求,定时器是大多数处理器系统中常见且必不可少的外设。
从 IP 目录菜单,展开 Processors and Peripherals,展开 Peripherals,双击 Interval Timer。确认间隔时间为 1 毫秒。点击 Finish。
将此外设的 s1 从端口连接更改为连接到 slow_peripheral_bridge 的 m0 主端口。在 Clock 列,选择 altpll_under_0.c1 作为其 clk 输入时钟,并将复位连接到 clk_under_reset。将其基地址更改为 0x00000020。当鼠标光标移开时,连接应如图所示,请仔细检查这些连接。
添加 JTAG UART 外设
现在是第十一步,添加 JTAG UART 外设。许多软件开发人员希望从目标设备访问调试串口,以便利用 printf 调试、输入控制命令、记录状态信息等。JTAG UART 外设连接到调试控制台,对于这些目的非常有用。
从 IP 目录菜单,展开 Interface Protocols,展开 Serial,双击 JTAG UART。默认设置可以接受,点击 Finish。
将此外设的 avalon_jtag_slave 端口的连接更改为连接到 slow_peripheral_bridge 的 m0 主端口。在 Clock 列,选择 altpll_under_0.c1 作为其 clk 输入时钟。将复位连接到 clk_under_reset。将其基地址更改为 0x00000060。
添加系统 ID
好的,现在是第十二步,添加系统 ID。原因在于,这是系统中一个非常重要的外设,它允许 Nios II 开发工具验证软件应用程序是否正在为正确的硬件系统构建。
从 IP 目录菜单,选择 Basic Functions -> Simulation; Debug and Verification -> Debug and Performance,然后选择 System ID Peripheral。双击将其添加到系统中。出现 System ID 对话框,点击 Finish。
将其重命名为 sysid。该组件必须命名为 sysid 才能与 Nios II 软件驱动程序和构建工具兼容。将此外设 control_slave 端口的连接更改为连接到 slow_peripheral_bridge 的 m0 主端口。
在 Clock 列,选择 altpll_under_0.c1 作为其 clk 输入时钟。将复位输入连接到 clk_under_reset。将其基地址更改为 0x00000068。
确认系统配置
我们现在已经完成了构建系统的第一部分,现在是第二部分:确认系统配置。
对于时钟,只有 PLL 应该有 clk_under_0,外部时钟在 Clock 列有一个输入。只有 Nios II CPU、桥接器和片上存储器应使用 altpll_under_0.c0 作为时钟。所有其他组件应使用 altpll_under_0.c1。
在右侧的 IRQ 列,点击定时器 IRQ 旁边的圆圈将其连接到处理器,然后连接 JTAG UART IRQ,最后连接按钮 PIO IRQ。
接下来,创建全局复位网络。Qsys 提供了一个简单的菜单项来完成此操作,这将使我们免于手动将复位输入连接到每个组件。从 System 菜单中,选择 Create Global Reset Network。该工具将自动连接系统中的所有复位,此复位由处理器以线或方式生成,并与外部复位结合。
设置基地址和中断优先级
接下来,我们将设置基地址和中断优先级。Qsys 提供了两个简单的菜单项,有助于清理地址映射问题和中断优先级问题。虽然我们可以手动输入,但我们也可以跳过此步骤,让 Qsys 自动分配,两种方式都可以。
从 System 菜单中,选择 Assign Base Addresses。该工具将根据组件的宽度为其分配适当的基地址。我使用了撤销(Ctrl+Z)来恢复到手动分配。从 System 菜单中,选择 Assign Interrupt Numbers。该工具将相应地更新 IRQ 映射,在本例中,与手动分配相比没有变化。
建立 Nios II 启动配置
现在,我们将建立 Nios II 启动配置。在复位事件发生时,软件必须从预定义的内存位置开始执行。这是通过设置复位向量来完成的。同样,当发生软件异常事件时,软件必须跳转到预定义的位置,该位置存放着异常处理软件。此位置通过设置异常向量来定义。
双击 CPU 外设以启动 Nios II Gen2 处理器参数设置 GUI。点击 Vectors 选项卡。将复位向量设置为指向 onchip_under_RAM,偏移量为 0x0。当 Nios II 处理器退出复位时,它将从此内存位置开始执行软件。将异常向量设置为指向 onchip_under_RAM 内存,偏移量为 0x20。当 Nios II 处理器遇到软件异常或中断时,它将跳转到内存中的此位置。最终结果应如下图所示。
选择 File 并点击 Save 以保存此时的设计。选择 Generate -> Generate HDL...,然后点击 Generate 按钮。如果询问是否保存,请选择 Yes。
Qsys 现在将创建:第一,系统中各种组件的 HDL(Verilog 或 VHDL,默认为 Verilog);第二,连接组件的系统互连;第三,用于包含在原理图中的块符号文件;第四,供 Nios II 软件开发工具(Nios II SBT)用于构建软件项目的系统描述文件。
HDL 生成过程将需要几分钟。一旦系统成功生成,你将看到信息消息 System generation was successful。点击 Close,然后点击右下角的 Finish。恭喜,你刚刚构建了你的第一个 Qsys 系统!

你已经完成了本视频的 A 部分,保存 Quartus 项目,因为我们将在本视频 B 部分开始时再次打开它,届时我们将把你的 Qsys 设计添加到顶层系统中。


总结

本节课中,我们一起学习了如何在一个 Nios II Qsys 系统中逐步添加关键组件。我们添加了片上 RAM 和 Flash 作为内存,引入了时钟交叉桥来处理不同时钟域的外设,并具体添加了 LED 控制、按钮输入、定时器、JTAG UART 和系统 ID 等多个外设。最后,我们配置了处理器的启动向量并生成了整个系统的 HDL 描述。通过这个过程,我们构建了一个功能完整的嵌入式处理器子系统,为后续的软件开发和系统集成打下了坚实的基础。
037:Qsys 系统设计完善(第三部分)🏗️


在本节课中,我们将学习如何将 Qsys 中生成的 Nios II 处理器系统集成到顶层的 FPGA 项目中,并进行编译,最终生成可下载到 FPGA 的配置文件。我们将通过两种方法实现:一种是使用原理图符号,另一种是使用 Verilog 代码实例化。
概述 📋
上一节我们完成了 Qsys 系统中处理器、外设和总线的配置。本节中,我们将把生成的 Qsys 系统添加到 Quartus Prime 项目中,设置必要的时序约束文件,并通过原理图或 Verilog 代码将其与顶层设计连接,最终完成整个 FPGA 设计的编译。
步骤一:添加 .qip 文件到项目
首先,打开你上次工作的 Qsys 项目。在 Quartus Prime 软件中,需要将 Qsys 生成的 .qip 文件添加到项目中。.qip 文件记录了生成系统所需的所有文件,确保 Quartus 在编译时能找到它们。
以下是具体操作步骤:
- 在 Quartus 菜单栏,点击 Project,然后选择 Add/Remove Files in Project。
- 在弹出的对话框中,点击 File name 右侧的 ... 按钮。
- 导航到你的 Qsys 项目目录(例如
Qsys_control),进入synthesis子文件夹。 - 选择
nios2_control.qip文件,点击 Open。 - 点击 Apply,然后点击 OK。
现在,Qsys 系统已成为 Quartus 项目的一部分。
步骤二:设置时序约束文件 (.sdc)
Qsys 会自动为某些组件(如 Nios II CPU)生成时序约束文件。此外,实验文件还提供了一个顶层 SDC 文件,用于指导时序分析器通过分析 PLL 来确定时钟速率。
我们需要在 Quartus 项目中指定这些 SDC 文件:
- 从菜单栏选择 Assignments -> Settings。
- 在设置窗口中,展开 Timing Analysis Settings。
- 在 SDC File List 区域,点击 ... 按钮。
- 在弹出的文件选择对话框中,导航到你的项目目录。
- 选择
bemicro_max10_top.sdc和Qsys_control.sdc文件,然后点击 Open。
步骤三:将 Qsys 系统集成到顶层设计
有两种主要方法可以将 Qsys 系统集成到顶层 FPGA 设计中。我们将分别介绍。
方法 A:使用原理图符号(推荐初学者)
这种方法利用 Quartus 的图形化原理图工具,操作直观。
- 创建原理图文件:点击 File -> New -> Block Diagram/Schematic File。
- 添加 Qsys 符号:在原理图空白处双击,打开符号编辑器。点击左下角的 Name 输入框旁的 ... 按钮。
- 选择符号文件:导航到你的 Qsys 项目目录,选择
nios2_control.bsf文件,点击 Open。将生成的符号块放置在原理图中。 - 添加输入/输出引脚:
- 使用 Pin Tool 添加两个输入引脚,分别连接到符号的
button_pio_external_connection和clk_clk端口。 - 添加一个输出引脚,连接到符号的
led_pio_external_connection端口。
- 使用 Pin Tool 添加两个输入引脚,分别连接到符号的
- 正确命名引脚:参考顶层 Verilog 文件
bemicro_max10_top.v中的端口名称。- 将按钮输入引脚命名为:
PB[4:1] - 将时钟输入引脚命名为:
CLOCK_50 - 将 LED 输出引脚命名为:
USER_LED[8:1]
- 将按钮输入引脚命名为:
- 连接引脚:将引脚连线到符号对应的端口。
- 创建复位电路:我们需要一个复位信号,它由两个按键(PB1 和 PB4)的“或”逻辑产生。
- 使用 Symbol Tool,从库
Primitives->Logic中选择一个 or2 门。 - 将其放置在复位输入附近。
- 将其两个输入端分别连接到
PB[1]和PB[4]。 - 将其输出端连接到 Qsys 符号的
reset_reset_n端口。
- 使用 Symbol Tool,从库
- 保存并设置顶层实体:
- 点击 File -> Save 保存原理图文件(例如
Qsys_control_top.bdf)。 - 在 Project Navigator 的 Files 标签页,右键点击该
.bdf文件,选择 Set as Top-Level Entity。
- 点击 File -> Save 保存原理图文件(例如
- 移除旧的顶层文件:由于一个项目只能有一个顶层实体,需要移除旧的 Verilog 顶层文件。
- 点击 Project -> Add/Remove Files in Project。
- 在文件列表中,选择
bemicro_max10_top.v,点击 Remove,然后点击 OK。
方法 B:使用 Verilog 代码实例化
这种方法直接修改 Verilog 代码,适合熟悉硬件描述语言的设计者。
- 准备顶层 Verilog 文件:
- 将
bemicro_max10_top.v重新添加到项目中,并另存为Qsys_control_top.v。 - 将其设置为新的顶层实体。
- 移除文件中除时钟、按键和 LED 部分外的所有代码。
- 将
- 添加复位逻辑:在模块内部,添加复位信号的生成逻辑。
wire reset_n; assign reset_n = PB[1] | PB[4]; // 复位信号低电平有效,这里生成的是 reset_n - 实例化 Qsys 系统:
- 打开 Qsys 生成的
nios2_control_inst.v文件。 - 复制其内部的模块实例化代码。
- 将其粘贴到
Qsys_control_top.v文件的endmodule语句之前。
- 打开 Qsys 生成的
- 连接端口:修改实例化语句中的端口连接,使其对应顶层模块的信号。
nios2_control u0 ( .button_pio_external_connection_export (PB[4:1]), // 连接到按键 .clk_clk (CLOCK_50), // 连接到50MHz时钟 .led_pio_external_connection_export (USER_LED[8:1]), // 连接到用户LED .reset_reset_n (reset_n) // 连接到生成的复位信号 ); - 修改模块名:将顶层模块的名字改为
Qsys_control_top。 - 保存文件。
步骤四:编译设计并分析结果
无论使用哪种方法,集成完成后,即可进行编译。
- 启动编译:在 Tasks 窗口中,双击 Compile Design。
- 查看编译报告:编译完成后,查看报告。对于一个包含 Nios II 处理器的系统,逻辑资源使用率可能会较高(例如达到器件容量的 60%),这属于正常现象。
- 查看 RTL 视图(可选):通过 Tools -> Netlist Viewers -> RTL Viewer 可以查看综合后的电路结构。你可以展开实例,观察 Nios II 处理器及其外设在设计中的连接情况。
总结 🎯

本节课中,我们一起学习了如何将 Qsys 设计的处理器系统集成到 FPGA 顶层项目中。我们掌握了两种集成方法:
- 使用原理图符号:通过图形化界面连接,易于理解和操作。
- 使用 Verilog 实例化:通过代码直接连接,更灵活,适合复杂设计。
关键操作包括:添加 .qip 文件、配置时序约束 .sdc 文件、在原理图中使用符号块或是在 Verilog 中实例化组件,以及最终编译生成 FPGA 配置文件(.sof)。完成这些步骤后,你的定制处理器系统就已在 FPGA 硬件上准备就绪。

通过 Qsys 工具,设计者能够快速创建并定制功能强大的 Nios II 软核处理器系统,极大地提高了嵌入式系统开发的效率。

浙公网安备 33010602011771号