适用于 Linux 的 Xilinx FPGA 设计工具
现场可编程门阵列 (FPGA) 是一种用户可编程的硅芯片,采用超大规模集成 (VLSI) 技术构建。VLSI 晶体管级细节在 FPGA 中是绝对预定义的。在内部,FPGA 由逻辑和互连元素的矩阵状结构组成,这些元素本质上是灵活的。灵活性是通过可编程 SRAM 存储单元实现的,这些单元定义了硅资源。FPGA 是标准商品部件,具有数万亿种可能的用户配置。FPGA 的这种基本组织结构在 VLSI 技术发展的二十年中一直存在。然而,今天的 FPGA 与往日的 FPGA 完全不同。
FPGA 正在模糊系统中硬件和软件之间的界限。FPGA 器件本质上是软编程的,可以在系统运行期间动态更改。更引人注目的是,FPGA 器件现在还在逻辑结构中包含嵌入式微处理器,这些微处理器可以运行 Linux。想象一下一台 Linux 计算机,周围有多达数百万门的灵活逻辑。理解这种新范式的一种方法是思考以下内容:“软件是硬件的配置位。”
FPGA 设计是定制硅设计,比全定制 VLSI 设计工作量更少。除了处理器内核,今天的 FPGA 不仅具有逻辑门和触发器,还具有大型块 RAM、嵌入式硬件乘法器、算术加速逻辑、用于频率合成的数字时钟管理器 (DCM) 、具有可编程线路终端的多标准系统 I/O 单元和多千兆位收发器 (MGT)。这些面向系统的资源,以及器件封装类型和用户 I/O 计数,在图 1 中列出,该图显示了最先进的 FPGA 器件,即 Xilinx Virtex-II Pro 系列。
VLSI 存储器技术是这个等式中的一切——FPGA 属于商品硅制造领域,并且通常比定制 VLSI 具有更好的硅晶圆良率。遵循摩尔定律,FPGA 就像 DRAM 和其他先进的存储器产品一样,是主要的硅技术驱动因素,推动了最先进的深亚微米密度 300 毫米晶圆技术。
在本文中,我们介绍最新的 Xilinx FPGA 设计工具。设计工具称为集成软件环境,或 ISE。这些设计工具现在以适用于 Linux 的 Xilinx ISE 6.1i 工具的形式发布,用于 Linux 平台。这允许在总体拥有成本非常低的平台上进行 FPGA 设计。
使用 FPGA 器件进行设计既不同于又类似于使用 C 等语言对微处理器进行编程。硬件描述语言 (HDL) 用于在高层次上设计逻辑。Verilog 和 VHDL 是工业实践中最流行的 HDL,ISE 6.1i 同时支持这两种语言。这些语言允许以结构或行为术语,或者两者混合的方式描述硬件。HDL 是专用编译器的输入源代码,这些编译器要么合成目标逻辑,要么允许对其进行仿真。在这里,我们的重点是逻辑综合,深入了解 FPGA,最后,使用 ISE 6.1i 工具生成配置比特流。
逻辑与软件不同的一个方面是它本质上是并行的。HDL 可以直接描述许多并发更改,这与主要的编程语言不同,例如,当基于时钟信号的上升沿指定逻辑电路中的同步更改时。在逻辑设计中,与编程相反,人们通常描述的是占用面积的东西,而不是内存。逻辑和程序都需要在操作期间经过时间,而我们通常希望时间非常短。正如我们将看到的,ISE 6.1i 设计工具可以帮助进行面积和时间优化。
本文涵盖了在 Verilog 中输入一个简单但有趣的设计的基本步骤,并探讨了该工具的一些功能。我们还深入了解 FPGA 器件配置。有关 Verilog HDL 的更多信息,请参阅“资源”部分。此外,请参阅 2002 年 7 月的 LJ 杂志(/article/6001),其中有一篇关于免费 Verilog 工具的文章,其中还包含 Verilog 教程。
对于本次导览,我们通过使用行为 Verilog 指定一个 16 位流水线并行乘法器来合成它。我们使用综合来创建和评估此结果。然后,我们使用 ISE 6.1i 中的实现工具为特定的 Virtex-II Pro FPGA 器件创建配置。在此过程中解释了工具链的各种选项,包括查看已实现的 FPGA 内部结构的方法。
安装软件后,我们打开一个 shell 并开始。该过程从键入ise在命令行中。这将打开 Project Navigator,即图 2 中显示的屏幕。要启动新的 FPGA 设计项目,请在“文件”菜单下选择新项目。这将打开图 3 中显示的窗口。在这里,我们输入项目名称 MPY-TEST,并指示我们将为此项目使用的顶层模块的类型。我们对本次导览的 HDL 顶层模块感兴趣,但 ISE 6.1i 允许使用其他几种顶层模块类型。
现在我们已经选择了 HDL,下一步是让工具知道我们将要使用哪种 FPGA 进行设计。为了说明,我们使用最先进的 FPGA 器件 Virtex-II Pro 系列。如图 4 所示,其中选择了 xc2vp7 器件以及 fg456 封装。该器件是较小的 Virtex-II Pro 部件之一,但它仍然具有大量资源。在这里,我们仅使用器件的一小部分。
图 4 中的菜单窗口还允许其他选择。您可以选择部件速度等级,在这里我们接受默认值 -6。Project Navigator 可用于组织您的整个项目流程。例如,您可以执行行为仿真和功能仿真。第一种类型的仿真检查您是否具有逻辑上正确的设计——即设计是否执行其应执行的操作。第二种类型的仿真是在 FPGA 实现之后进行的,用于完成芯片的设计验证。图 4 中的器件选择屏幕还包括其他选项,例如您要用于 HDL 仿真的特定模拟器以及用于模拟已实现 FPGA 的语言。这可能分别包括 Xilinx 合作伙伴提供的一些行业标准工具,或其他模拟器,以及 Verilog 或 VHDL。
接下来,我们为设计选择一个新的源文件,并为设计指定文件名。在此过程中,我们告诉工具我们要创建的 CAD 文档类型;在本例中,它是 Verilog 模块。我们输入文件名 mpy16.v,其中 .v 是 Verilog 的标准文件名后缀。习惯上(但不是必需的)使顶层模块的文件名与模块相同,或者使用像 toplevel.v 这样的名称。
可以为该工具输入并添加到项目的其他几种文档。我们没有时间检查所有这些功能,其中包括替代输入模式(原理图)以及包含用户制作的标准和自定义 HDL 库。
为了定义设计的(第一个)Verilog 源代码,Design Manager 提供了一些帮助。对于顶层模块 mpy16,我们使用表格输入工具填写模块端口表(图 5)。在这里,我们定义了进入和退出顶层模块的连线,这些连线最终将成为 FPGA 上的外部 I/O 引脚。输入的端口名称为 p、x、y 和 clk。
我们将 p 指定为 32 位宽的输出,并将主输入 x 和 y 指定为 16 位宽。由于此乘法器将是流水线的,因此我们还包括一个名为 clk 的端口,该端口将为乘法器提供同步时序源。端口 clk 仅是一根连线或网络,因此我们在表中省略了 MSB 或 LSB 的内容。这意味着 clk 将是标量。在 Verilog 中,向量是连线或网络的组,这些向量是基于零索引的。
完成顶层模块的表格输入后,我们将获得一个摘要对话框。然后,在设置好项目后,Project Navigator 会调出所有工具以及我们的 Verilog 模块的初始轮廓。如图 6 所示,骨架源代码位于右上角。ISE 6.1i 随附了一个编辑器,您也可以导入使用您选择的 Linux 编辑器创建的 HDL 源代码。
列表 1. 16 位流水线乘法器的 Verilog 源代码
module mpy16(p,x,y,clk); output [31:0] p; input [15:0] x; input [15:0] y; input clk; // inferable storage via synthesis reg [31:0] p; reg [15:0] xq; reg [15:0] yq; // 16x16 unsigned multiplier specified // behaviorally always @(posedge clk) begin xq <= x; yq <= y; p <= xq * yq; end endmodule // mpy16
列表 1 是 16 位流水线乘法器的 Verilog 源代码。此代码以行为方式完成,我们将允许 Xilinx Synthesis Technology (XST) 弄清楚如何实现我们通过代码表达的含义。如今,综合非常强大,我们可以简单地推断乘法器硬件,而无需详细指定其逻辑设计。
输入 Verilog 后,如列表 1 所示,我们通过双击 Project Navigator 工具滚动列表中的“综合 - XST”按钮来启动综合。我们输入的这个设计很容易综合,只需片刻时间。可以通过读取综合报告文件来查看综合结果(图 7)。左侧工具滚动列表中的复选标记指示 Project Navigator 完成的工作。综合报告文件位于右上角。您可以通读此文件,了解 XST 如何决定将您的逻辑推断到目标 FPGA,并了解该 FPGA 中生成的设计的估计时钟速率性能。
RTL 是将您的逻辑视为位于触发器寄存器之间的各种黑盒或逻辑门的视图。RTL 是同步设计中逻辑的主要视图。ISE 6.1i 工具中的“查看 RTL 原理图”按钮提供了一种很好的方式来获得图形化概述(图 8)。您可以使用动态重新生成的 RTL 原理图在设计中的任何模块层次结构中导航。我们现在准备运行 FPGA 实现工具。
我们通过单击 Project Navigator 左侧工具列表中的“实现设计”来启动实现。对于 FPGA 实现,工具自动执行的通用过程如下:转换、映射以及布局和布线。
在大多数 FPGA 设计情况下,您不需要了解这些步骤操作的具体细节,除非您要从 FPGA 中寻求极高的性能。但了解正在发生的事情可能会有所帮助。例如,映射确定推断的综合结果如何“映射”到您选择的目标 FPGA。查看映射报告文件可以提供有关资源分配的有用信息。同样,有时阅读布局和布线 (PAR) 报告文件可能有助于了解是否有可用的选项来提高设计的速度或更仔细地限制工具链中更早阶段的资源利用率。
ISE 6.1i 中未在本文中遇到的其他工具为性能工程和创建约束(例如,锁定 FPGA I/O 引脚以供后续与 PCB 板一起使用)提供了很大的灵活性,从而可以进行迭代 FPGA 实现以修复错误。
此设计仅使用了 xc2vp7 FPGA 上 44 个可用乘法器中的一个。还指示了为此逻辑请求的 65 个 I/O 引脚。该工具生成的 Pad 报告将告诉您在实现中选择了哪些 FPGA 引脚。如上所述,您也可以为电路板设计预选这些引脚,这可以通过工具中的约束编辑器或通过创建约束文件来完成。
FPGA 是快速 CMOS 器件。了解其速度对于根据系统要求验证静态时序目标非常重要。系统设计的其他重要信息可能包括了解建立时间信息或时钟到引脚的延迟。ISE 6.1i 提供了一个集成的时序分析器。可以根据目标 FPGA 中已完成实现的所有布线和传播延迟自动生成时序报告文件。
您还可以在实现后通过单击 FPGA 编辑器工具来查看 FPGA 器件内部结构。此工具将打开一个单独的屏幕(图 9)。初始视图称为全景图,您可以在其中一次看到整个 FPGA。正如您可能在中心视图中看到的那样,仅使用了 2vp7 的一小部分。此视图在高度利用率的设计中变得非常密集。视图中的大块是 PowerPC 微处理器。还可以看到 FPGA 中的其他乘法器块、块 RAM 和许多其他元素。可以有选择地突出显示设计中的各个块。
FPGA 实现的最后一步是 bitgen,或 FPGA 配置比特流的比特生成,以便可以在系统中对器件进行编程。按下“生成编程文件”后,将从 FPGA 实现数据自动创建比特流。bitgen 工具创建一个报告文件,如图 10 右上角所示。
创建 FPGA 比特流后,有许多选项可用于使用它来创建编程文件。这些很大程度上取决于您要用于编程 FPGA 的硬件机制。选项包括 PROM 文件、ACE 文件、JTAG 文件和 FPGA 的直接配置。
PROM 文件用于传统的 PROM 编程器,例如,制作一个放入系统中的 EPROM。ACE 文件与 Xilinx SystemACE CF 编程解决方案一起使用。SystemACE CF 是一种在系统中嵌入 CompactFlash 器件的低成本方法。使用 ACE 文件,您可以在传统的 CompactFlash 卡上创建数据,这些数据可用于 FPGA 配置、动态重新配置和多器件配置。您也可以通过这种方式启动 PowerPC 处理器。
JTAG 文件与 Xilinx 下载电缆一起通过 JTAG 链用于系统中的 FPGA 器件。JTAG 支持配置、控制和比特流或调试反馈。特别是,JTAG 是 Xilinx ChipScope Pro 6.1i 工具的主要机制,该工具是一个集成逻辑分析仪,嵌入到您的片上逻辑中,用于实时原位硬件调试。您也可以使用 iMPACT 工具和下载电缆直接从 PC 配置 FPGA 的编程。
这些工具也可以在命令行中使用,而不是使用 GUI。一旦 Xilinx 二进制文件位于您的 Linux $PATH 中,您就可以使用批处理模式脚本、程序和 makefile 来驱动它们。如果您想从 shell 运行这些命令,您可以从 Project Navigator 生成的命令日志中抄写,并从那里即兴发挥。例如,可以修改这些命令以添加 shell 变量。对于本文中创建的设计,生成的命令日志文本如下所示
xst -intstyle ise -ifn __projnav/mpy16.xst \ -ofn mpy16.syr ngdbuild -intstyle ise \ -dd /home/mab/VERILOG/MPY-TEST/_ngo -i \ -p xc2vp7-fg456-6 mpy16.ngc mpy16.ngd map -intstyle ise -p xc2vp7-fg456-6 -cm area \ -pr b -k 4 -c 100 -tx off \ -o mpy16_map.ncd mpy16.ngd mpy16.pcf par -w -intstyle ise -ol std -t 1 mpy16_map.ncd \ mpy16.ncd mpy16.pcf trce -intstyle ise -e 3 -l 3 -xml mpy16 mpy16.ncd \ -o mpy16.twr mpy16.pcf bitgen -intstyle ise -f mpy16.ut mpy16.ncd
我们介绍了现代半导体技术背景下的 FPGA,描述了软件和硬件界限是如何模糊的,并快速浏览了 Linux 上的 ISE 6.1i FPGA 实现工具。您还可以参考 2002 年 8 月的 LJ 杂志(/article/6073),该杂志首次介绍了 Xilinx ML300 开发板和 Virtex-II Pro FPGA 上的嵌入式 Linux。
资源
ChipScope Pro: www.xilinx.com/ise/verification/chipscope_pro.htm
设计工具: www.xilinx.com/ise/design_tools/index.htm
开发和参考板: www.xilinx.com/xlnx/xebiz/board_search.jsp
嵌入式开发套件: www.xilinx.com/ise/embedded/edk.htm
主链接: www.xilinx.com
Xilinx FPGA 器件: www.xilinx.com/xlnx/xil_prodcat_landingpage.jsp?title=Devices
有用的 Verilog 资源
Icarus Verilog: icarus.com/eda/verilog
IEEE Std. 1364-1995 (ISBN 1-55937-727-5): standards.ieee.org
IEEE Std. 1364-2001 (ISBN 0-7981-280606): standards.ieee.org
Verilog 快速入门,第三版,作者 James M. Lee,Kluwer Academic Publishers,2002 年。ISBN 0-7923-7672-2。
Verilog 是 Cadence Design Systems, Inc. 的注册商标。
Michael Baxter 是 Linux Journal 的技术编辑。