注:原文版权归作者所有,本翻译仅为爱好所作,与任职单位无关。

第一部分 引言:可重构计算硬件

PART1 Reconfigurable Computing Hardware

根本上来说,可重构计算可以最好地发挥可重构硬件的潜力。虽然一个完整的系统必须包括编译软件和高性能的应用程序,但了解可重构计算的最佳位置还是在芯片层面,因为芯片的性能以及局限性对系统的所有阶段都有着至关重要的影响。然而,反过来说也一样成立:既然可重构设备设计为针对那些发展迅速的应用程序的开发平台,如果芯片不能有效地支持重要的应用程序,或者芯片无法高效地应用自动设计映射流程,那么可重构计算将无从谈起。

可重构计算目前主要由现场可编程门阵列(FPGA)商用产品的发展推动。对于可重构计算领域而言,FPGA商用产品的发展喜忧参半。一方面,他们代表了目前商用可重构硬件的主要来源之一,可向任何应用提供采用最先进的工艺制造的,便宜且高速的可编程硅片。另一方面,它们并没有针对可重构计算进行优化,原因很简单,绝大多数 FPGA 客户只是将其用作专用集成电路(ASIC)的一种替代品,虽然性能较低,但是相对便宜并且能够缩短上市时间。因此,这些设备永远不是可重构计算用户理想中的硬件,虽然也足够接近了。

第一部分的第 1 章深入介绍了商用FPGA体系结构,概述了几乎所有通用可重构计算系统的底层技术。

由于FPGA并没有针对可重构计算进行优化,因此已经出现了许多尝试,为可重构社区构建更好的可重构器件。第 2 章详细介绍了其中的许多尝试。新体系结构的重点是包含更大的功能块以加速关键的计算、采用与主机处理器的更紧密的接口,便于建立协处理模型、快速的重新配置功能以减少更改配置的时间等等。然而,到目前为止,还没有商业上可行的系统,这主要是因为

  • 在对 FPGA 的整体需求中,对可重构计算芯片的需求比例并不大,降低了规模经济效应。
  • FPGA 产商可以使用最先进的制造工艺,而可重配置的计算芯片通常落后一到两代工艺。

基于这些原因,可重新配置的计算芯片与商用 FPGA 相比,在成本、性能和功耗方面都存在很大的劣势。因此,可重构计算专用设备的架构优势必须足够巨大,以弥补规模经济效应和制造工艺滞后所带来的问题。看上去最终某家设计可重构计算芯片的公司总归将获得成功;然而,到目前为止,似乎只有失败。

尽管可编程芯片本身的特性很重要,但大多数可重构计算用户所需的往往超过芯片本身。一个真正的系统通常需要:大容量内存、连接数据流的输入/输出(I/O)端口、协调操作的微处理器或微处理器接口,以及配置和重新配置设备的机制。第 3 章讨以完整的系统的角度讨论了可重构计算系统,记录了可重构计算板卡的发展。

第 1 章到第 3 章对大多数可重构系统硬件进行了很好的概述,但有一个主题需要特别考虑:器件内的重构子系统。在 FPGA 中,配置数据被有序而缓慢地加载,基于所设定的运算配置整个芯片。当 FPGA 用作胶水逻辑和 ASIC 替代品时,现有的配置加载速度是足够的,因为 FPGA 只需要在上电后配置一次即可;但是,在可重构计算的许多情况下,FPGA 可能需要更频繁地重配置。在极端情况下,一项运算的电路可能会被分解成多个配置文件,而 FPGA 需要在该电路的正常执行过程中依次加载新的配置,以完成整个运算过程。在这种情况下,重新配置的速度很重要。第 4 章重点讨论了FPGA中的重构子系统,提出实现快速重构的挑战,并阐述了一些能够明显提高重构速度的方法。

第一章:器件架构 Chapter 1 :Device Architecture

Mark L. Chang

Electrical and Computer Engineering

Franklin W. Olin College of Engineering

最好的赛车手知道他们的赛车是如何工作的。最好的建筑师知道木匠、瓦匠和电工是如何干活的。最好的程序员知道他们正在编程的硬件是如何进行计算的。了解硬件设备的底层原理(down to the metal),对于高效利用硬件资源至关重要。

在本章中,我们将对构成一个典型的现场可编程门阵列(FPGA)的基本硬件单元一探到底。我们将讨论 FPGA 器件中的计算是如何进行的,包括真正的计算单元,以及在这些计算单元之间传输数据的互连结构。我们将从 FPGA 架构的角度讨论这些硬件单元是如何组合到一起的。当然,由于可编程性(以及可重编程性)是 FPGA 的关键特性之一,我们也将在花一些篇幅讨论实现可编程特性的硬件结构。最后,我们将在第 1.5 节的“案例研究”中深入了解一些商用 FPGA 的体系架构。

我们不会涉及大学和工业届的许多研究架构,这个会留到以后再说。我们也不会讨论如何高效地编程 FPGA,构成一个计算平台,这也是本书后面的内容。

本章中读者将学到的是一个典型的商用 FPGA 的“底层”(under the hood)结构,这样读者就可以更自如地使用它作为解决问题和执行计算的平台。我们旅程的第一步从如何在FPGA中完成计算这一问题开始。

1.1逻辑——运算结构 logic——the computational fabric

在我们的台式电脑中,在这个机箱里,除去那些与电子不相关的其他东西,有存储和通信设备(硬盘和网卡)、内存,还有就是执行大部分计算的中央处理器(CPU)。FPGA 在可重构计算平台中扮演着类似 CPU 的角色,但我们将对其进行分解,不仅仅讨论执行运算本身。

一般来说,FPGA中只有两种类型的资源:逻辑(logic)单元互连(interconnect)结构。逻辑是进行算术运算(1+1=2),逻辑函数( if (ready) x=1 else x=0)的硬件单元。互联结构用于组织数据(比如先前一次计算的结果),将数据从一个计算单元传输至另一个单元。这里首先来关注逻辑单元。

1.1.1逻辑单元 Logic Elements

假设读者有数字逻辑和计算机体系结构背景,将知道计算机中的任何计算都可以表示为布尔方程(Boolean equation)(在某些情况下,布尔方程的输入为先前的结果,因为 FPGA 可以实现状态保持,所以不用担心这点)。而任何布尔方程又都可以以真值表(truth table)的形式表示。

基于真值表,我们可以构建复杂的运算逻辑结构,例如加法器和乘法器。也可以实现条件判断语句,例如经典的 if-then-else 分支结构。结合运算逻辑与条件分支结构,我们可以简单地用真值表来描述复杂的算法。

通过上述对数字逻辑本质的简单描述,可以发现真值表是 FPGA 计算核心的实现方式。更具体地说,通过查找表(LUT)这一硬件可以轻松实现真值表。从电路构成上来看,可以简单地由 N:1(N-to-one,N 选 1)多路复用器和 N 位存储器构成一个 LUT。LUT 可以通过枚举的方式实现任意的真值表。因此基于 LUT, FPGA 具有实现任意数字逻辑的通用性。图1.1 显示了一个典型的N输入查找表的结构,这在现代 FPGA 中随处可见。事实上,几乎所有的商用 FPGA 都将 LUT 作为其基本硬件构成。

LUT 可以通过将待实现函数的真值表,编程至 LUT 的 N 个输入,来实现任何函数。其中,每一路输入对应真值表的某一种情况。如图 1.1 所示,如果我们想用 3输入LUT(通常写作 3-LUT)来实现一个 3 输入异或(XOR)函数。可基于查找表为 LUT 内存赋值,以便 LUT 选择信号根据三输入的情况选择正确的 LUT 行得到“答案”。因此除了输出为 “1” 的四种情况,其他“行”将存储 “0” 作为异或的结果。

当然,可以通过整合几个查找表,一起实现更复杂的函数或者拥有更多输入的函数。例如,可以将一个 3-LUT 组织成一个 8×1 rom,如果查找表的值是可重编程的,则转换为一个 8×1 ram。但是基本结构以及查找表,保持不变。

(译注:原文如此,似乎这个 for example 并没有提供整合查找表的例子,这里译注一个例子,基于 3-LUT 实现一个四输入异或逻辑函数)

虽然商用 FPGA 已经或多或少将 LUT 作为最小的逻辑运算单元,但是每个逻辑块(logic block),由 LUT 组成的上层逻辑单元中,查找表输入数量大小需要权衡,并已经被广泛地研究[1]。一方面,较大的查找表将允许在单个逻辑块中实现更复杂的逻辑函数,从而减少块的数量,因此逻辑块之间的布线延迟也被减少了。然而,由于需要位宽更大的多路复用器,因此将导致 LUT 的速度降低。并且如果越大的 LUT,将导致更多的浪费可能,因为函数输入可能小于 LUT 的输入。而较小的查找表可能需要更多逻辑块,从而增加块之间的布线延迟,但 LUT 的速度将更快,从而可以减少每个逻辑块内部的延迟。

目前基于大量基准电路(benchmark circuits)的经验表明,4-LUT 结构在面积和延迟之间取得了最佳的平衡。当然,随着 FPGA 计算包括更多的应用领域,这个研究结果可能需要重新审视。事实上,在撰写本文时,Xilinx 已经发布了 Virtex-5 FPGA,采用 6-LUT 架构

(译注:截止 2020 年,主流 FPGA 均采用 6-LUT,目前国产 FPGA 因为容量较少,多使用 4-LUT 或者 5-LUT 结构)。

每个逻辑块中的 LUT 数量问题也是一个值得权衡的问题,并进行了相关研究[2]。经验证据表明,将多个 4-LUT 组合在单个逻辑块中可以改善面积和延迟。基于该项目研究成果,目前许多商用 FPGA在每个逻辑块中加入了多个 4-LUT。

(译注:在 Xilinx 7 系列架构中,LUT 上层的逻辑块称为 Slice,包括 4 个 6-LUT)

对 LUT 输入大小和每个块中 LUT 数量的研究都是为了解决 FPGA中的计算粒度(granularity)问题。从一个维度来看,结构简单的小位宽查找表(例如 2-LUT)细粒度的计算能力。从另一个维度来看,人们设想更大的计算块来实现粗粒度的计算能力,例如完整的 8 位算术逻辑单元(ALU),更典型的比如一个完整的 CPU。

与查找表输入大小的研究类似,细粒度块可能更擅长位级操作和算术,但需要组合多个细粒度块来实现更大的逻辑块。与至相反的粗粒度块可能更适用于标准“字”位宽大小(8/16/32位)的,面向数据路径的计算,但在实现非常简单的逻辑操作时会浪费多余的资源。当前的业界实践是以一定程度上细粒度的 4-LUT 结构为主,兼顾使用更粗粒度的异构元素(如乘法器)来实现粒度上的平衡,如本章后面的扩展逻辑单元节所述。

目前,逻辑块中已经包括了 LUT 这一硬件单元。此时,我们得考虑一个问题:目前的逻辑块是否足以实现在 FPGA 中所需的所有功能。事实上,并没有。若只有 LUT,FPGA 无法保持任何信号的状态,因此无法实现任何形式的时序逻辑,或者状态保持逻辑。为了解决这种情况,将在基本逻辑块中添加一个简单的单比特存储单元,即一个 D 触发器。

现在的逻辑块结构类似于图 1.2(译注:图中的 SRAM 部分为译者所加)。多路复用器从查找表生成的函数中以及 D 触发器中存储的值中选择一个结果作为输出。实际上,这个逻辑块与某些商用 FPGA 中的逻辑块结构非常相似。

1.1.2 可编程性 Programmability

识别图 1.2 的逻辑块结构中所有可编程点(programmable points)并不困难,这些可编程点包括 4-LUT 各路输入、输出多路复用器的选择信号以及 D 触发器的初始状态。目前大多数商用 FPGA 使用易失性静态 RAM(SRAM)中的数据输出端口连接至配置点,从而通过 SRAM 中的内容来配置FPGA。因此,向每个配置位所连接的 SRAM 写入一个值即可配置整个 FPGA。在我们的逻辑块中,4-LUT 将由 16 个 SRAM bit 组成,每个输出项使用一个;多路复用器使用 1bit SRAM 值;D 触发器初值也使用 1bit SRAM 值。至于 SRAM 中的数值是如何初始化的,将在后面的章节内容中讨论。

fpga加载程序慢_可重构计算:基于FPGA可重构计算的理论与实践 1.器件架构 译文(一)...相关推荐

  1. fpga加载程序慢_FPGA的DONE信号在加载程序后无法拉高 (已解答)

    在使用ISE进行FPGA的bit文件下载时,经常会遇到下载失败的问题,提示:"DONE did not go high". 在Xilinx官网上有对此问题的答复如下: 下面提供以下 ...

  2. spring 加载java类_在Spring中基于Java类进行配置的完整步骤

    在Spring中基于Java类进行配置的完整步骤 发布于 2020-7-7| 复制链接 基于Java配置选项,可以编写大多数的Spring不用配置XML,下面 前言JavaConfig 原来是 Spr ...

  3. 必备技能21:正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。

    出错提示: 正尝试在 OS 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起. 解决方案: 调试 -- 异常 选择Managed Debu ...

  4. 安装Keil537加载程序并编译后

    安装Keil5.37版本,加载程序,编译时终止,出现错误: *** Target 'Target 1' uses ARM-Compiler 'Default Compiler Version 5' w ...

  5. 【基础知识】~ 稳压二极管、三极管、放大电路、逻辑门晶体管数量、FPGA 器件结温范围、FPGA 加载方式、施密特触发器、C 语言结构化编程、中断向量地址、寄生效应、上拉电阻的作用

    1. 稳压二极管 稳压二极管,英文名称 Zener diode,又叫齐纳二极管.利用 PN 结反向击穿状态,其电流可在很大范围内变化而电压基本不变的现象,制成的起稳压作用的二极管.此二极管是一种直到临 ...

  6. 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码......

    当我在窗体初始化的时候,调用了一个外部的dill时,它就不知什么原因的 抛出一个"正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码&quo ...

  7. 引导加载程序之争: LILO 和 GRUB

    在不考虑他们的工作或专业情况下,所有 Linux 用户都会使用的是哪个工具?引导加载程序.通过本文了解引导加载程序的工作原理,认识两个流行的引导加载程序 LILO(LInux LOader)和 GNU ...

  8. FPGA加载bit文件可以工作,加载mcs不能工作的原因

    FPGA加载bit文件可以工作,加载mcs不能工作的原因 1: 使用ISE的MPACT用bit文件生成mcs的时候设置错了应该,检查一下FLASH型号,容量,位宽都有没有选对. 2: mcs文件的大小 ...

  9. 【技术分享】如何解锁高通骁龙660上的安卓引导加载程序

    本文是我们在DEF CON 29大会上的演示视频的配套文章,视频的链接地址为https://www.youtube.com/watch?v=z4gIxdFfJDg. 要想在安卓手机上获得root权限, ...

最新文章

  1. libxml2_ZC积累
  2. linux查看系统负载常用指标与命令
  3. oracle 12c dg新特性,Oracle 12c DG新特性---一键switchover
  4. .NET Core 2.0迁移技巧之MemoryCache问题修复
  5. jqgrid使用本地静态数据创建网格的例子_什么是网格布局?grid布局有哪些优势?开发过程中遇到什么问题?...
  6. (22)npm scripts 实践—构建样式文件
  7. 拖放获取文件信息的bat代码
  8. flask-limiter限制单个IP访问的频率和次数
  9. centos6.5最小化安装
  10. 最新web打印控件 破解版 下载地址
  11. 使用Python3进行身份证号码标准验证
  12. 渗透测试流程(一)(千峰学习笔记)
  13. 如何将矩阵化为约旦标准型_将矩阵化为约当标准型.doc
  14. office-word使用技巧——查找替换
  15. 手机OTG 我的世界_手机触摸失灵不更换屏幕,如何把手机里面的资料导出来,值得收藏...
  16. 编译akm小车底盘控制节点
  17. ssm毕设项目计件工资管理系统15ik6(java+VUE+Mybatis+Maven+Mysql+sprnig)
  18. TP5.1自定义创建命令(php think make:controller app\index\User)
  19. 【胖虎的逆向之路】02——Android整体加壳原理详解实现
  20. k8s 集群部署问题整理

热门文章

  1. 笔记本删除隐藏分区 释放固态硬盘空间
  2. 获取本地IP和端口号的指令
  3. CYYMysql 源码解读 2
  4. Vue强制绑定class和style_使用字符串_对象_素组的方式实现强制绑定---vue工作笔记0007
  5. k8s核心技术-配置管理_Secret_以变量形式使用Secret文件_以及以数据卷的形式使用Secret文件---K8S_Google工作笔记0036
  6. 微服务升级_SpringCloud Alibaba工作笔记0023---Nacos之Namespace空间方案
  7. slowfast 跑多卡的时候遇到问题
  8. ubuntu上装texlive
  9. 杭电4551生日猜猜猜
  10. AfxGetApp用法