3 构建 Xillinux

3.1 概述

Xillinux 发行版旨在作为一个开发平台,而不仅仅是演示:在其为硬件运行做准备的过程中,会构建一个可直接用于定制逻辑开发和集成 的环境。因此,首次试运行的准备时间略长(通常约 30 分钟,其中大部分时间用于等待 AMD 工具完成)。然而,这种较长的准备工作会缩 短集成定制逻辑的迭代周期。

要使 Xillinux 发行版从(Micro)SD 卡成功启动,该卡必须包含两个组成部分:

  • 启动分区中的 FAT32 文件系统,其中包括启动加载程序、FPGA 部分(即 PL)的配置比特流,以及 Linux 内核启动所需的 二进制文件。

  • Linux 挂载的 ext4 根文件系统。

下载的 Xillinux 原始镜像已将几乎所有内容设置完毕。启动分区中只缺少三个文件,其中一个需要使用 AMD 工具生成,另外 两个从启动分区套件中复制。

本节将逐步详细介绍准备(Micro)SD 卡的各种操作。

该流程包括以下步骤,必须按照下面列出的顺序执行。

  • 解压启动分区套件。

  • 运行主 PL(FPGA)工程的实现。

  • 将 Xillinux 镜像写入(Micro)SD 卡。

  • 将三个文件复制到(Micro)SD 卡的启动分区。

关于如何配合其他开发板工作,请参见第 5.2 节。

3.2 解压启动分区套件

将之前下载的 xillinux-eval-board-XXX.zip 文件解压到一个工作目录中。

重要 的:
工作目录的路径不得包含空格。特别地,Windows 桌面不适用,因为其路径包含 “Documents and Settings”。

该套件包含以下目录(或其中部分):

  • verilog——包含主逻辑的工程文件以及一些 Verilog 源文件(位于 ‘src’ 子目录下)。

  • vhdl——包含主逻辑的工程文件以及一些源文件。需要编辑的 VHDL 文件位于 ‘src’ 子目录下。

  • cores——Xillybus IP 核的预编译二进制文件。

  • system——用于生成与处理器相关逻辑的目录。

  • bootfiles——包含两个与开发板相关的文件,需复制到启动分区。

  • vivado-essentials——供 Vivado 使用的定义文件和构建目录,用于处理器相关逻辑和通用逻辑。

有适用于 Z-Turn Lite、Zedboard、MicroZed 和 Zybo 的套件。如果使用其他开发板,除了第 5.2 节中列出的问题外,还需要 相应地编辑约束文件 vivado-essentials/xillydemo.xdc。

请注意,vhdl 目录中包含 Verilog 文件,但这些文件均不需要用户编辑。

与 Xillybus IP 核的接口位于各自 ‘src’ 子目录下的 xillydemo.v 或 xillydemo.vhd 文件中。如果您希望使用自己的数据源和数据 接收端来试用 Xillybus,则正是需要编辑此文件。

3.3 生成比特流文件

3.3.1 概述

Vivado 会生成大量中间文件,且目录结构较为复杂,这使得项目难以管理。为保持套件中文件结构的紧凑性,我们提供了一个 Tcl 脚本 用于创建 Vivado 工程。该脚本会新建一个名为 “vivado” 的子目录,并按需在其中填充各种文件。

该工程依赖于 src/ 子目录下的文件(不会复制这些文件)。处理器、其互连和外设,以及逻辑所使用的 FIFO,均在 vivado-essentials/ 中定义;在工程实现过程中,Vivado 也会在该目录中填充中间文件。

工程的实现可基于 Verilog 或 VHDL。

3.3.2 选择目标 Zynq 器件(仅限 Z-Turn Lite)

此步骤适用于 Z-Turn Lite 的演示套件。

使用文本编辑器打开套件根目录下的 select_part.tcl 文件。该文件末尾四行是用于设置 Vivado 工程所面向 Zynq 器件的 Tcl 命令。这四行均以 “#” 字符注释掉了。

请从其中一行的行首去掉一个 “#” 字符,以选择您 Z-Turn Lite 开发板上的 Zynq 器件。

如果后续需要使用其他 Zynq 器件,请相应更改 Vivado 工程的设置并重新实现工程。select_part.tcl 仅在工程生成时被引 用,因此之后再对其修改不会产生任何影响。

3.3.3 准备 xillydemo.vhd(仅限 VHDL 工 程)

仅当同时满足以下两个条件时才需执行此步骤:

  • 工程使用 VHDL。

  • 演示套件面向除 Z-Turn Lite 之外的任何开发板。

如果两个条件均满足,则需要编辑 vhdl/src/xillydemo.vhd: 删除 Xillydemo 实体端口列表开头处的以 下三行:

    PS_CLK : IN std_logic;
    PS_PORB : IN std_logic;
    PS_SRSTB : IN std_logic;

同时,取消注释 结构体定义中的以下行(去掉 “--” 注释 标记):

  -- signal PS_CLK : std_logic;
  -- signal PS_PORB : std_logic;
  -- signal PS_SRSTB : std_logic;

任何 Verilog 源文件均无需修改。

3.3.4 生成 Vivado 工程

启动 Vivado 2014.4 或更高版本

在未打开任何工程的情况下,选择 Tools > Run Tcl Script...,然后根据您的偏好,在 verilog/ 或 vhdl/ 子目录中选择 xillydemo-vivado.tcl。 一系列操作将在一分钟之内完成。可以通过查看 Vivado 窗口底部的 “Tcl Console” 选项卡,并确认其最后一行显示以下内容来验证工程部署是否成功:

INFO: Project created: xillydemo

如果 Tcl 控制台输出的最后一行不是上述内容,则表示出了问题。

此阶段可能会出现 Critical Warning(严重警告),但不应有错误。然而,如果工程已经生成过(即该脚本已运行过),再次 尝试运行该脚本将导致以下错误:

ERROR: [Common 17-53] User Exception: Project already exists on disk,
   please use '-force' option to overwrite:

3.3.5 工程的实现

工程创建完成后,运行实现流程: 点击左侧 Flow Navigator 栏中的 “Generate Bitstream”。

可能会弹出一个窗口,询问是否允许启动综合和实现——请选择 “Yes”。

Vivado 会依次运行一系列进程,通常需要几分钟时间。期间会发出若干警告,其中部分可能被归类为严重警告,但不应出现错误。

之后会弹出一个窗口,告知比特流已成功生成,并让您选择下一步操作。任何选项均可,包括选择 “Cancel”。

生成的比特流文件 xillydemo.bit 位于 vivado/xillydemo.runs/impl_1/ 目录下。

实现流程通常不应失败,但仍有几种值得注意的错误情况:

  • 在 VHDL 设计中,布局器(Placer)失败并报 “IO placement is infeasible”。如果在 VHDL 实现中遇到此问题,请确保已按 上述要求编辑了 xillydemo.vhd。

  • write_bitstream 失败,并报 DRC 错误,提示 PS_CLK、PS_PORB 和 PS_SRSTB 未指定、未布线和未约束——同样,请确保已按上述 要求编辑了 xillydemo.vhd。

  • 报错 “Timing constraints weren’t met”(时序约束未满足)。当集成了定制逻辑后,可能导致工具无法满足时序要求。这意味 着设计在语法上是正确的,但需要修正以确保某些路径在给定的时钟速率和/或 I/O 要求下足够快。为改善时序而修正设计的过程通常称为 时序收敛(timing closure)。

    时序约束失败通常会以严重警告的形式发出,此时允许用户生成比特流,但无法保证 FPGA 的行为正确。为防止生成此类不 可靠的比特流,我们通过一个小型 Tcl 脚本 “showstopper.tcl” 将时序失败提升为错误级别;该脚本会在布线运行结束时自动执行。若要关闭 此安全措施,请点击 Flow Navigator 中 “Project Manager” 下的 “Project Settings”,选择 “Implementation” 选项卡,向下滚动找到 “route_design” 的设置,然后从 tcl.post 中移除 showstopper.tcl。

  • 任何其他错误很可能是由用户更改所致,应根据具体情况进行处理。

3.4 将镜像写入(Micro)SD 卡

3.4.1 概述

本任务的目标是将镜像文件写入(Micro)SD 卡。该文件名为 xillinux-2.0a.img.gz,是以压缩文件(gzip 格式)下载 的。

该(Micro)SD 卡镜像已准备好启动,但还缺少三个文件,需要在写入卡中之后添加。

该镜像应解压缩后写入(Micro)SD 卡的第一个扇区及之后的位置。有多种方法和工具可以完成此操作,下面推荐几 种。

镜像中包含分区表、一个部分填充的 FAT 文件系统(用于放置初始启动文件)以及 ext4 类型的 Linux 根文件系统。几乎所有 Windows 计算机都会忽略第二个分区,因此(Micro)SD 卡可能显示容量很小(约 16 MB)。

写入完整磁盘镜像并非普通电脑用户的操作,因此在 Windows 上需要特殊软件,在 Linux 上也需要格外小心。以下段落将分 别说明如何在两种操作系统上执行此操作。

如果没有(Micro)SD 卡 USB 读卡器(或电脑没有专用插槽),也可以使用开发板本身来写入镜像,如第 3.4.4 节所述。

重要 的:
将镜像写入(Micro)SD 卡将不可恢复地删除卡上原有的任何内容。强烈建议您先复制卡中的现有内容(可使用同样的写 入工具)进行备份。

3.4.2 写入镜像(Windows)

在 Windows 上,需要使用专用应用程序来复制镜像,例如 USB Image Tool。当使用 USB 读卡器访问(Micro)SD 卡时,此工具适用。

某些电脑(尤其是笔记本电脑)自带(Micro)SD 卡插槽,可能需要使用其他工具,例如 Win32 Disk Imager。在运行 Windows 7 时也可能如此。

这两个工具均可从网上多个站点免费下载。以下操作步骤假设使用 USB Image Tool。

对于图形界面,请运行 “USB Image Tool.exe”。主窗口出现后,插入 USB 读卡器,选择左上角出现的设备图标。确保左上 角下拉菜单中处于 “Device Mode”(而非 “Volume Mode”)。点击 Restore,并将文件类型设置为 “Compressed (gzip) image files”。选择下 载的镜像文件(xillinux-2.0a.img.gz)。整个过程大约需要 4-5 分钟。完成后,卸载设备(“安全移除硬件”)并拔掉读卡器。

在某些机器上,GUI 可能无法运行并报错,提示软件初始化失败。此时可使用命令行替代方案,或者需要安装 Microsoft .NET framework 组件。

另外,也可以从命令行执行此操作(如果 GUI 尝试失败,这是一个快捷的替代方案)。这分两步进行。首先,获取设备编 号。在 DOS 窗口中,切换到应用程序解压后的目录并执行(典型会话如下):

C:\usbimage>usbitcmd l

USB Image Tool 1.57
COPYRIGHT 2006-2010 Alexander Beug
http://www.alexpage.de

 Device | Friendly Name                     | Volume Name | Volume Path | Size
------------------------------------------------------------------------------
    2448 | USB Mass Storage Device |                           | E:\        | 4024 MB

(注意 “usbitcmd” 后面的字符是字母 “l”,不是数字 “1”)

现在有了设备编号,即可执行写入(“restore”)操作:

C:\usbimage>usbitcmd r 2448 \path\to\xillinux-2.0a.img.gz /d /g

USB Image Tool 1.57
COPYRIGHT 2006-2010 Alexander Beug
http://www.alexpage.de

Restoring backup to "USB Mass Storage Device USB Device" (E:\)...ok

同样,这大约需要 4-5 分钟。请务必把编号 2448 替换为第一步中获得的实际设备编号,并将 \path\to 替换为您电脑上存储(Micro)SD 卡镜像的路径。

3.4.3 写入镜像(Linux)

重要 的:
向设备进行原始复制是一项危险的操作:一个简单的人为错误(通常是选错目标磁盘)可能导致电脑硬盘上的所有数据不 可恢复地丢失。按下 Enter 之前请三思,如果您不熟悉 Linux,建议在 Windows 上完成此操作。

如上所述,正确识别(Micro)SD 卡对应的设备非常重要。最佳方法是插入 USB 读卡器后,查看主日志文件 (/var/log/messages 或 /var/log/syslog)中类似如下的内容:

Sep 5 10:30:59 kernel: sd 1:0:0:0: [sdc] 7813120 512-byte logical blocks
Sep 5 10:30:59 kernel: sd 1:0:0:0: [sdc] Write Protect is off
Sep 5 10:30:59 kernel: sd 1:0:0:0: [sdc] Assuming drive cache: write through
Sep 5 10:30:59 kernel: sd 1:0:0:0: [sdc] Assuming drive cache: write through
Sep 5 10:30:59 kernel: sdc: sdc1
Sep 5 10:30:59 kernel: sd 1:0:0:0: [sdc] Assuming drive cache: write through
Sep 5 10:30:59 kernel: sd 1:0:0:0: [sdc] Attached SCSI removable disk
Sep 5 10:31:00 kernel: sd 1:0:0:0: Attached scsi generic sg0 type 0

输出可能略有不同,但关键是查看内核为新磁盘分配了什么名称。上例中为 “sdc”。

解压镜像文件:

# gunzip xillinux-2.0a.img.gz

将镜像复制到(Micro)SD 卡的命令为:

# dd if=xillinux-2.0a.img of=/dev/sdc bs=512

当然,您应指向之前找到的 U 盘设备。

重要 的:
/dev/sdc 仅为示例。除非恰好与您电脑识别的设备匹配,否则请勿使用此设备。

然后进行验证:

# cmp xillinux-2.0a.img /dev/sdc
cmp: EOF on xillinux-2.0a.img

请注意响应信息:提示镜像文件达到 EOF,说明其余部分比较正确,且 U 盘容量大于实际使用的空间。如果 cmp 没有输出 任何内容(通常会被认为是好的),实际上反而表示出了问题——很可能是在 /dev/sdc 上生成了一个普通文件,而不是写入到设备。

3.4.4 使用 Zynq 开发板写入镜像

3.4.3 节描述了如何使用 Linux 电脑和 USB 读卡器写入镜像。也可以使用 Zynq 开发板本身,运行板子自带的示例 Linux 系统来进行此操作。基本 指令相同,只需将目标设备指定为 /dev/mmcblk0(而不是 /dev/sdc)。

当从 QSPI 闪存启动时,或者使用 SD 卡上的示例 Linux 系统(如果板子附带此类卡)时,此方法同样有效。这是因为与 Xillinux 不同,示例系统完全在 RAM 中运行,启动完成后不再使用 SD 卡。因此,如果使用 SD 卡启动,可以将其拔出,再插入另一张卡进 行镜像写入。

如何让 Zynq 开发板访问(Micro)SD 镜像和启动分区文件,取决于您的偏好和 Linux 知识。可以通过网络多种方式实现, 但最简单的方法是将这些文件写入 U 盘,然后连接到 USB OTG 端口。挂载 U 盘:

> mkdir /mnt/usb
> mount /dev/sda1 /mnt/usb

然后即可在 /mnt/usb/ 下读取 U 盘中的文件。

在 Zedboard 上,请确保安装 JP2 跳线,以便为 USB 端口提供 5V 电源。

3.5 将文件复制到启动分区

最后一步是放置启动所需的文件:

  • 将启动分区套件 bootfiles/ 子目录下的 boot.bin 和 devicetree.dtb 复制到(Micro)SD 卡的启动分区(第一个分区)。

  • 将第 3.3 节 生成的 xillydemo.bit(来自 verilog/ 或 vhdl/ 子目录,取决于所选语言)复制进去。

复制这些文件之前:如果刚刚将镜像写入(Micro)SD 卡,请先拔掉 USB 读卡器,再重新连接到电脑。如果是用 Zynq 开发 板写入原始镜像,则需将(Micro)SD 卡从卡槽中拔出并重新插入。

这是为了确保电脑能识别(Micro)SD 卡的最新分区表。

在 Linux 系统上,可能需要手动挂载第一个分区(例如 /dev/sdb1)。大多数电脑会自动完成此操作。

例如,如果使用 Zynq 开发板本身进行此操作,则输入:

> mkdir /mnt/sd
> mount /dev/mmcblk0p1 /mnt/sd

然后将文件复制到 /mnt/sd/。

在 Windows 系统上,插入(Micro)SD 卡后会显示一个 “磁盘”,其中只有一个文件 uImage。这就是复制文件的正确目标位 置。

完成后,请正确卸载(Micro)SD 卡,然后从电脑上拔下,例如:

> umount /mnt/sd

或在 Windows 上 “安全移除磁盘”。

3.6 启动分区中的文件

在尝试启动之前,请确认启动分区中已包含以下文件。

启动成功需要(Micro)SD 卡的第一个分区(启动分区)中存在四个文件:

  • uImage —— Linux 内核二进制文件。这是将 Xillinux(Micro)SD 镜像写入卡后,启动分区中已有的唯一文件。该内核与开发板无 关。

  • boot.bin —— 初始启动加载程序。该文件包含处理器初始化和 U-boot 工具,不同开发板之间差异显著。

  • devicetree.dtb —— 设备树二进制文件(Device Tree Blob),包含 Linux 内核所需的硬件信息。

  • xillydemo.bit —— PL(FPGA)配置文件,由第 3.3 节生成。