FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章
  • 书籍
  • FreeBSD 中文期刊
  • 编辑日志
  • 2025-123 下游项目
    • FreeBSD 发布工程:新主管上任
    • GhostBSD:从易用到挣扎与重生
    • BSD Now 与将来
    • 字符设备驱动教程(第三部分)
    • 学会走路——连接 GPIO 系统
    • FreeBSD 中对 SYN 段的处理
    • FreeBSD 2024 年秋季峰会
  • 2024-1112 虚拟化
    • 字符设备驱动程序教程(第二部分)
    • 面向 Linux 和 Windows 用户的 bhyve
    • Xen 与 FreeBSD
    • Wifibox:一种嵌入式虚拟化无线路由器
    • 嵌入式 FreeBSD:Fabric——起步阶段
    • DGP:一种新的数据包控制方法
    • 会议报告:我在都柏林的 EuroBSDCon 体验
  • 2024-0910 内核开发
    • 字符设备驱动程序教程
    • VPP 移植到了 FreeBSD:基础用法
    • 利用 Kyua 的 Jail 功能提升 FreeBSD 测试套件的并行效率
    • FreeBSD 上的 Valgrind
    • 嵌入式 FreeBSD:探索 bhyve
    • TCP/IP 历险记:FreeBSD TCP 协议栈中的 Pacing
    • 实用软件:实现无纸化(Paperless)
  • 2024-0708 存储与文件系统
    • FreeBSD 中的 NVMe-oF
    • FreeBSD iSCSI 入门
    • 使用 ZFS 原生加密保护数据
    • 嵌入式 FreeBSD:打造自己的镜像
    • TCP LRO 简介
    • 基于 Samba 的时间机器备份
  • 2024-0506 配置管理对决
    • 基本系统中的 mfsBSD
    • rdist
    • Hashicorp Vault
    • 在 GitHub 上向 FreeBSD 提交 PR
    • 悼念 Mike Karels
    • 2024 年 5-6 月来信
    • 嵌入式 FreeBSD 面包板
    • TCP/IP 历险记:TCP BBLog
    • 实用软件:开发定制 Ansible 模块
  • 2024-0304 开发工作流与集成
    • FreeBSD 内核开发工作流程
    • FreeBSD 与 KDE 持续集成(CI)
    • 更现代的内核调试工具
    • 从零开始的 ZFS 镜像及 makefs -t zfs
    • 提升 Git 使用体验
  • 2024-0102 网络(十周年)
    • FreeBSD 中的 RACK 栈和替代 TCP 栈
    • FreeBSD 14 中有关 TCP 的更新
    • if_ovpn 还是 OpenVPN
    • SR-IOV 已成为 FreeBSD 的重要功能
    • FreeBSD 接口 API(IfAPI)
    • BATMAN:更优的可移动热点网络方式
    • 配置自己的 VPN——基于 FreeBSD、Wireguard、IPv6 和广告拦截
    • 实用软件:使用 Zabbix 监控主机
  • 2023-1112 FreeBSD 14.0
    • LinuxBoot:从 Linux 启动 FreeBSD
    • FreeBSD 容器镜像
    • 现在用 Webhook 触发我
    • 新的 Ports 提交者:oel Bodenmann (jbo@freebsd.org)
  • 2023-0910 Port 与软件包
    • 回忆录:与 Warner Losh(@imp)的访谈
    • 在你自己的仓库中定制 Poudriere 源
    • Wazuh 和 MITRE Caldera 在 FreeBSD Jail 中的使用
    • PEP 517
    • CCCamp 2023 旅行报告
  • 2023-0708 容器与云
    • 在 Firecracker 上的 FreeBSD
    • 使用 pot 和 nomad 管理 Jail
    • 会议报告:C 与 BSD 正如拉丁语与我们——一位神学家的旅程
    • 抒怀之旅:与 Doug Rabson 的访谈
    • 基于 Jail 的广告拦截教程
    • 我们收到的来信
  • 2023-0506 FreeBSD 三十周年纪念特刊
    • CheriBSD 近十多年的历程
    • AArch64:成为 FreeBSD 新的一级架构
    • 岁月如梭:我个人的时间线
    • 安装 FreeBSD 1.0:回顾 30 年前
    • ZFS 是如何进入 FreeBSD 的呢?
    • 我不是来自约克郡的,我保证!
    • 回忆录:采访 David Greenman Lawrence
    • FreeBSD 和早期的 Unix 社区
    • 早期的 FreeBSD 移植
    • FreeBSD 30 周年:成功的秘诀
    • FreeBSD 在日本:回忆之旅与今日之实
  • 2023-0304 嵌入式
    • CheriBSD port 和软件包
    • 让我们来试试 ChatGPT
    • GPU 直通
  • 2023-0102 构建 FreEBSD Web 服务器
    • ZFS 的原子 I/O 与 PostgreSQL
    • 虚拟实验室——BSD 编程研讨会
    • ZFS 简介
    • 会议报告:落基山庆祝女性计算机科学家
    • 进行中的工作/征求反馈:数据包批处理
    • 基金会与 FreeBSD 桌面
  • 2022-1112 可观测性和衡量标准
    • 在 FreeBSD 的 DDB 内核调试器中编写自定义命令
    • DTrace:老式跟踪系统的新扩展
    • 基于证书的 Icinga 监控
    • 活动监控脚本(activitymonitor.sh)
    • 实用 IPv6(第四部分)
    • EuroBSDCon 会议报道
    • 实用 Port:Prometheus 的安装与配置
    • 书评:《用火解决问题:管理老化的计算机系统(并为现代系统保驾护航)》Kill It with Fire: Manage Aging Computer Systems (and Future Proof Modern Ones)
  • 2022-0910 安全性
    • CARP 简介
    • 重构内核加密服务框架
    • PAM 小窍门
    • SSH 小窍门
    • 实用 IPv6(第三部分)
    • 书评:Understanding Software Dynamics(深入理解软件性能——一种动态视角)—— Richard L. Sites 著
    • 访谈:保障 FreeBSD 安全性
    • MCH 2022 会议报告
  • 2022-0708 科研、系统与 FreeBSD
    • 在 FreeBSD 上构建 Loom 框架
    • 教授本科生 Unix 课程
    • FreeBSD 入门研讨会
    • 实用 IPv6(第二部分)
    • 在 2022 年及以后推广 FreeBSD
    • 进行中的工作/征求反馈:Socket 缓冲区
    • FreeBSD 开发者峰会报告
    • 支持 Electromagnetic Field 2022
  • 2022-0506 灾难恢复
    • 使用 FreeBSD 构建高弹性的私有云
    • LLDB 14 —— FreeBSD 新调试器
    • 实用 IPv6(第一部分)
    • 利用 netdump(4) 进行事后内核调试
    • 进行中的工作/征求反馈:FreeBSD 启动性能
    • 实用 Port:在 OpenZFS 上设置 NFSv4 文件服务器
  • 2022-0304 ARM64 是一级架构
    • FreeBSD/ARM64 上的数据科学
    • Pinebook Pro 上的 FreeBSD
    • 嵌入式控制器的 ACPI 支持
    • 进行中的工作/征求反馈:Lumina 桌面征集开发人员
    • 实用 Port:如何设置 Apple 时间机器
  • 2022-0102 软件与系统管理
    • 为 FreeBSD Ports 做贡献
    • 使用 Git 贡献到 FreeBSD Ports
    • CBSD:第一部分——生产环境
    • 将 OpenBSD 的 pf syncookie 代码移植到 FreeBSD 的 pf
    • 进行中的工作/征求反馈:mkjail
    • 《编程智慧:编程鬼才的经验和思考》(The Kollected Kode Vicious)书评
    • 会议报告:EuroBSDCon 2021 我的第一次 EuroBSDCon:一位新组织者的视角
  • 2021-1112 存储
    • 开放通道 SSD
    • 构建 FreeBSD 社区
    • 与完美操作系统同行 27 年
    • 进行中的工作/征求反馈:OccamBSD
    • 通过 iSCSI 导入 ZFS ZIL——不要在工作中这样做——就像我做的那样
  • 2021-0910 FreeBSD 开发
    • FreeBSD 代码审查与 git-arc
    • 如何为 FreeBSD 实现简单的 USB 驱动程序
    • 内核开发技巧
    • 程序员编程杂谈
  • 2021-0708 桌面/无线网
    • 通往 FreeBSD 桌面的直线路径
    • FreeBSD 13 中的人机接口设备 (HID) 支持
    • Panfrost 驱动程序
    • 用 Git 更新 FreeBSD
    • FreeBSD 的新面孔
    • 想给你的桌面加点佐料?
  • 2021-0506 安全
    • 七种提升新安装 FreeBSD 安全性的方法
    • copyinout 框架
    • 使用 TLS 改善 NFS 安全性
    • Capsicum 案例研究:Got
    • 对 Jail 进行安全扫描
  • 2021-0304 FreeBSD 13.0
    • 展望未来
    • FreeBSD 13.0 工具链
    • FreeBSD 13.0 中有新加载器吗?
    • TCP Cubic 准备起飞
    • OpenZFS 中的 Zstandard 压缩
    • 会议报告:FreeBSD 供应商峰会
    • Git 不够吗?
  • 2021-0102 案例研究
    • Tarsnap 的 FreeBSD 集群
    • BALLY WULFF
    • Netflix Open Connect
    • FreeBSD 的新面孔
    • 写作学者的 FreeBSD
    • 在世界之巅
  • 2020-1112 工作流/持续集成(CI)
    • FreeBSD Git 快速入门
    • 使用 syzkaller 进行内核 Fuzzing
    • Mastering Vim Quickly 书评
    • 线上会议实用技巧
    • 在控制台上进行网络监控
  • 2020-0910 贡献与入门
    • 采访:Warner Losh,第 2 部分
    • 代码审查
    • 撰写良好的提交消息
    • 如何在不是程序员的情况下做出贡献——成为 FreeBSD 译者
    • 如何成为文档提交者
    • 谷歌编程之夏
    • 为 FreeBSD 期刊撰写文章
    • 你为什么使用 FreeBSD
    • FreeBSD 的新面孔
  • 2020-0708 基准测试/调优
    • FreeBSD Friday
    • 采访:Warner Losh,第 1 部分
    • 构建和运行开源社区
    • 在 FreeBSD 上轻松搭建我的世界(Minecraft)服务器
    • FreeBSD 的新面孔
  • 2020-0506 网络性能
    • 内核中的 TLS 卸载
    • 访谈:Michael W Lucas
    • FreeBSD 桌面发行版
    • 使用 Poudriere 进行 Port 批量管理
    • FreeBSD 的新面孔
由 GitBook 提供支持
LogoLogo

FreeBSD 中文社区(CFC) 2025

在本页
在GitHub上编辑
导出为 PDF
  1. 2024-1112 虚拟化

嵌入式 FreeBSD:Fabric——起步阶段

上一页Wifibox:一种嵌入式虚拟化无线路由器下一页DGP:一种新的数据包控制方法

最后更新于1个月前

  • 原文地址:

  • 作者:Christopher R. Bowman

在之前的专栏中,我们简要地介绍了 Zynq 芯片,提及了它的结构。自那以后,我们对他没有太多讨论。但在上篇专栏中,我们成功地在 bhyve 上运行了 CentOS 镜像,现在是时候来看我们的第一个结构电路了。本篇专栏将专注于电路,不涉及 FreeBSD,但在接下来的几期中,我们将开始研究结合这两者的系统。

除了 ,该手册记录了构成 Arty Z7-20 功能核心的 Zynq 芯片外,Digilent 的 提供了大量关于 Zynq 芯片如何在板上连接的有价值的信息。查看第 12 节,我们可以看到该板上有 4 个 LED 直接连接到 ZYNQ 芯片(R14、P14、N16、M14)。如果我们将这些引脚设置为逻辑 1 或高电平电压,则这些引脚将源源不断地提供电流,电流通过 LED,再通过限流电阻流向地线,导致 LED 点亮。

既然我们刚刚开始,让我们尝试构建最小且最简单的电路来点亮这些引脚。最简单的电路就是将这些引脚静态地接高电平到结构中。好吧,我们怎么做呢?我们需要引入 Verilog 来实现这一点。

就像编程早期,程序是用机器码、汇编语言编写的,最终发展到使用像 C 这样的高级语言一样,集成电路最初也是手工绘制或用 Mylar 膜带布置的。随着电路规模的增大和 CAD 程序的发展,电路设计开始通过程序来完成——电子设计自动化(EDA)。原理图捕获程序可以通过图形化方式将设备(最初是晶体管,后来是门电路)连接起来,使用图形用户界面(GUI)进行设计。最终,出现了可以用文本描述电路的语言。我在 1.2 微米时代使用过一种早期的语言 SFL 来设计我前 3 个芯片中的两个。但在过去十年中,VHDL 和 Verilog 两种语言真正主导了芯片设计。这些语言在许多概念上类似于 Ada 和 C。Ada 和 VHDL 语言冗长,并具有强类型检查。它们都被指定为美国国防部工作的首选语言,尽管两者仍然存在,但它们在各自的领域中今天的受欢迎程度差不多。另一方面,Verilog 就像 C 一样,已经成为电路设计中最流行的语言。它不像 VHDL 那样强类型,就像 C 不像 Ada 那样强类型一样。总之,现如今,如果你想设计一个数字(非模拟)电路,超过几门门电路,你将使用 VHDL 或 Verilog,而大多数新的设计都使用 Verilog。

Verilog 中的电路设计会通过综合工具转化为电路,就像我们用编译器将 C 转换为可运行程序一样。这比编译还复杂一些。例如,除了将 Verilog 转换为实现设计的连接门电路外,在设计计算机芯片时,你还需要使用工具来放置门电路并布线。幸运的是,所有这些功能都包含在 Xilinx/AMD 的 Vivado 工具中。Xilinx/AMD 不仅提供 Vivado,而且它是免费下载安装的,你还可以免费获取一个许可证来解锁 Zynq 芯片的大部分功能。如果你想在你的 Arty Z7 开发板上做任何与编程以外的工作,你将需要下载并在 Linux/Windows 机器上安装此软件。在上一期专栏中,我们已经介绍了如何设置一个运行 Linux 的 bhyve 实例,以便在 FreeBSD 机器上的 bhyve 虚拟机中运行 Vivado。

现在,我们已经做好准备,让我们开始设计第一个简单电路来点亮板上的 LED。首先,我们需要 Verilog 描述来实现这个电路。我没法在一篇小文章中教会你 Verilog,因此我将展示设计并尽量介绍它的工作原理。

module top(
    output [3:0]led
);

wire [3:0]led;

assign led = {1'b1, 1'b0, 1'b1, 1'b0};

endmodule

首先,设计是通过模块进行捕获的,本设计包含一个名为 led 的 4 位总线。这条总线是通过一组 4 个连接常量来驱动的。这些常量是 1 位信号,其中一半是逻辑“高”或 1,另一半是逻辑“低”或 0。我选择了交替的值,以便可以分辨 LED 的连接方式:从最高位到最低位(msb to lsb)或从最低位到最高位(lsb to msb)。这样,我就不必通过板上的标记和文档来推测连接方式。

接下来,我们需要提供一个约束文件。约束文件有两个主要功能:它们传达时序信息,并且在 FPGA 领域,它们还传达一些布置信息。在我们的第一个实验中,我们需要告诉工具哪些芯片引脚连接到 led 总线的线,并且还需要告诉工具如何设置我们希望使用的 IO 引脚。Digilent 非常贴心地提供了一个包含此板和其他许多板信息的主 XDC 文件,存放在一个 GitHub 仓库中。不幸的是,他们没有在文件或 readme 中包含版权声明,因此我无法在我的项目中包含它。这里提供了几个相关的行,如果你使用我在 中为本文提供的 make 文件,它会从 GitHub 下载该文件并取消注释相关行。你需要在系统中安装 GNU make 和 wget。

set_property -dict { PACKAGE_PIN R14 IOSTANDARD LVCMOS33 } \
     [get_ports { led[0] }]; #IO_L6N_T0_VREF_34 Sch=LED0
set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } \
     [get_ports { led[1] }]; #IO_L6P_T0_34 Sch=LED1
set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } \
     [get_ports { led[2] }]; #IO_L21N_T3_DQS_AD14N_35 Sch=LED2
set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } \
     [get_ports { led[3] }]; #IO_L23P_T3_35 Sch=LED3

最后,我们需要运行 Vivado 将其转换为 BIT 文件,这是我们设计的电路的表示形式。遗憾的是,这并不像将这两个文件传递给 Vivado 那么简单。电路设计是一个复杂的过程,涉及许多选项。Vivado,像许多 EDA(电子设计自动化)工具一样,是一个基于 TCL 的工具,需要脚本来运行。在我的仓库中,我创建了最简单的 GNUMakefile,用于自动下载 XDC 文件,修补它并使用 TCL 脚本运行 Vivado。我建议你查看它,但如果你只是想继续进行,更新路径变量后,在 Linux 上运行简单的 make 命令,应该就能完成所有操作,并生成一个名为 implementation/static.bit 的文件,这是我们需要加载到 Zynq 芯片中的电路文件。

那么,我已经有了我的电路文件,接下来怎么做?U-boot 包含一个 FPGA 比特流加载程序,我们将从这里开始。把 FPGA.bit 文件复制到 SD 卡的 MSDOS 分区,将卡插入板中并按下重置按钮。在 U-boot 提示符下,打断启动过程并运行以下命令:

Zynq> fatload mmc 0 0x4000000 static.bit
4045663 bytes read in 249 ms (15.5 MiB/s)
Zynq> fpga loadb 0 0x4000000 4045663

第一个命令将 static.bit 文件从 SD 卡的 FAT 分区加载到内存中。第二个命令告诉 U-boot 用当前在内存地址 0x4000000 中的文件内容来编程 FPGA。此时,你应该看到板上的四个 LED 中有两个亮起了红色。恭喜!你已经构建并加载了第一个 FPGA 设计!

我们可以在这里结束,但在我们结束之前,让我们再做两件事。首先,让我们让 LED 闪烁,而不仅仅是亮起;其次,让我们看看如何在 FreeBSD 下加载 FPGA。这将为更酷的事情打下基础。

module top(
    input clk,
    output [3:0] led
);

localparam cycles_per_second = 125000000;

reg [3:0]leds;
reg [31:0]counter;

always @ (posedge clk)
begin
  if (counter == 0) begin
    leds <= leds + 1;
    counter <= cycles_per_second;
  end else counter <= counter - 1;
end

assign led = leds;

endmodule

我们现在添加了一个时钟输入,它将驱动一个 31 位计数器,并且我们还添加了一个 4 位计数器。31 位计数器加载值 123,000,000,并递减到零。当它达到零时,4 位的 leds 计数器递增。我们选择 125,000,000,因为根据 Arty 参考手册第 11 节,我们看到以太网 PHY 在 H16 引脚上提供了一个 125MHz 的时钟。

接下来,我们需要告诉 Vivado H16 引脚上的时钟:

set_property -dict { PACKAGE_PIN H16 \
     IOSTANDARD LVCMOS33 } \
     [get_ports { clk }]; #IO_L13P_T2_MRCC_35 Sch=SYSCLK
create_clock -add -name sys_clk_pin -period 8.00 \
     -waveform {0 4} [get_ports { clk }];#set

同样,一个简单的 make 命令应该会构建出一个 implementation/blinky.bit 文件,该文件可以像上面一样转移到 SD 卡并加载到 FPGA 中。

现在,你应该能看到 LEDs 按二进制计数闪烁。

# xbin2bit blinky.bit

你运行了这个程序并看到 FreeBSD 系统停止了,但 LEDs 仍然在闪烁吗?没错,事实证明我们的 Verilog 设计需要稍微复杂一点,以确保处理器不会停止。我们将在下期专栏中进一步探讨这个问题。


Christopher R. Bowman 在 1989 年首次使用 BSD 系统,当时他在约翰霍普金斯大学应用物理实验室的地下两层楼工作。他随后在 90 年代中期使用 FreeBSD 在马里兰大学设计了自己的第一块 2 微米 CMOS 芯片。从那时起,他一直是 FreeBSD 用户,并对硬件设计以及驱动硬件的软件感兴趣。在过去的 20 年里,他一直在半导体设计自动化行业工作。

为了让 LED 闪烁,我们需要通过更改 Verilog 来修改电路。这个新的电路有一个新的 ,但我将在这里总结这些更改。首先是我们的新 Verilog:

好了,在我们结束本期专栏之前,让我们谈谈最后一件事。让我们看看如何从 FreeBSD 中编程 FPGA。事实证明,这很简单。有一个 /dev/devcfg 设备,最初是为了让你直接将 bit 文件 cat 到该设备上,但我认为对它的工作并没有完全完成。有一个简单的 C 程序 xbin2bit,它有自己的 。如果你有 root 权限(默认情况下 /dev/devcfg 是 root 所有),你可以直接运行它并传递你的 bit 文件:

如果你对这些内容有任何问题、评论、反馈或批评,我非常乐意听取。你可以通过 联系我。

Fabric – Baby Steps
Zynq-7000 SoC 技术参考手册
Arty Z7 参考手册
static_leds 仓库
仓库
git 仓库
articles@ChrisBowman.com