简介:DE1-Soc硬件原理图及开发手册面向使用DE1-Soc开发板的嵌入式工程师与高校学习者,聚焦ARM+FPGA异构平台的硬件认知与上板实践。手册从开发套件入手,依次讲解包装清单、系统光盘使用与求助途径,再深入剖析板卡布局、组件分布与块图结构,帮助读者建立处理器、内存与外设连接关系的整体认知。第三章重点覆盖FPGA配置模式设置、Cyclone V SoC FPGA配置流程,以及LED、按键、开关等状态元素与复位、时钟电路,并逐一说明7段数码管、GPIO扩展头、音频编解码器、I2C多路复用器、VGA、TV解码器与红外收发等外围接口。资源包为1个PDF文件,约7.1MB,内容完整、目录清晰,便于按章节检索。已有1313人学习下载,适合嵌入式硬件入门与FPGA开发进阶者作为案头参考。
1. 拿到 DE1-SoC 之后,先别急着写 Verilog
很多人拿到 DE1-SoC 开发板的第一反应是插上 USB Blaster,打开 Quartus,新建工程,写一个分频器点灯。灯亮了,任务完成。但如果你后面要做的是 HPS 与 FPGA 协同、AXI 总线互联、DDR 带宽分配,或者要基于这块板子做图像采集、视频通路,那么跳过硬件原理图和开发手册直接上手,几乎一定会卡在某个引脚约束或者时钟域上。
DE1-SoC 的核心是 Altera(现 Intel)Cyclone V SoC 芯片,型号 5CSEMA5F31C6,FPGA 逻辑和双核 Cortex-A9 硬核处理器封装在同一颗芯片里。这意味着它既有传统 FPGA 的引脚、时钟、电源域问题,又有 SoC 的存储器映射、外设地址、启动流程问题。硬件原理图告诉你「板子上每个器件连到了芯片的哪个引脚、走的是哪个 bank、电压是多少」,开发手册告诉你「这些引脚在软件侧对应哪个地址、怎么初始化、怎么用」。
这篇文章面向的是已经拿到板子、准备做实际项目的工程师,不是开箱评测。我会按「先看懂原理图里的关键页 → 再理解开发手册里的地址映射 → 然后落到引脚约束和实际配置 → 最后讲几个容易翻车的细节」这条线走。如果你只做纯 FPGA 点灯,前两章够用;如果你要做 HPS-FPGA 异构,四章都得看。
2. DE1-SoC 硬件原理图里必须看懂的几页
2.1 从页索引定位关键模块,而不是从头翻
DE1-SoC 的原理图是一份多页 PDF,常见做法是先看第一页的 block diagram 和页索引,直接跳到你要用的模块。不要从第一页顺序读到最后一页,那样效率极低,而且容易在电源页迷失。
我一般会先定位这几类页:
- FPGA 引脚分配页 :标明了每个 bank 的 IO 标准、电压、以及具体引脚号。做引脚约束时这是唯一权威来源。
- HPS 外设连接页 :DDR3、以太网 PHY、USB PHY、SD 卡、UART 这些挂在 HPS 侧的外设,原理图会标出它们连到 HPS 的哪个控制器。
- 时钟树页 :板载晶振频率、时钟分配器、以及哪些时钟进了 FPGA 的专用时钟引脚。
- 电源页 :各电压轨的来源和上电顺序,调试「板子上电没反应」时必看。
提示:原理图里的网络标号(net name)比引脚号更重要。同一个信号在 FPGA 侧和 HPS 侧可能叫不同名字,靠 net name 才能对上。
2.2 用引脚约束文件把原理图信息固化下来
看懂原理图之后,第一件要做的事是把用到的引脚写成 Quartus 的约束文件。DE1-SoC 常见的做法是维护一个 .qsf 文件,把引脚、IO 标准、电压都写死。下面是一个最小示例,假设你要用板上的 KEY0 和 LED0:
# DE1-SoC 引脚约束示例(.qsf 片段)
# KEY0 对应 FPGA 引脚,IO 标准 3.3V LVTTL
set_location_assignment PIN_AA14 -to KEY0
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to KEY0
# LED0 对应 FPGA 引脚
set_location_assignment PIN_V16 -to LED0
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED0
# 板载 50MHz 时钟输入
set_location_assignment PIN_AF14 -to CLOCK_50
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to CLOCK_50
逻辑说明: set_location_assignment 把顶层模块的端口绑定到芯片物理引脚, set_instance_assignment 指定该引脚的电气标准。参数上, PIN_AA14 这类引脚号必须和原理图完全一致,写错一个字符就会导致编译通过但板子无反应。IO 标准要和原理图标注的 bank 电压匹配,DE1-SoC 大部分 GPIO bank 是 3.3V,但如果你用到 HSMC 或 GPIO 扩展口,要确认对应 bank 的 VCCO 电压。
2.3 时钟和复位:原理图里最容易忽略的两条线
时钟和复位是原理图里最不起眼、但出问题最多的部分。DE1-SoC 板载有 50MHz 晶振接到 FPGA 专用时钟引脚,HPS 侧还有独立的 25MHz 晶振。如果你做 HPS-FPGA 互联,两个时钟域之间的跨时钟处理必须在设计早期就规划好。
复位方面,板上有一个手动复位按键,但它同时连到 FPGA 和 HPS。原理图会标明复位信号是否经过施密特触发器、是否有上拉。常见坑是:你在 FPGA 里用了一个异步复位,但没有做同步释放,导致 HPS 启动时 FPGA 逻辑处于不确定状态。
| 信号 | 典型来源 | 注意事项 |
|---|---|---|
| CLOCK_50 | 板载 50MHz 晶振 | 专用时钟引脚,可进 PLL |
| CLOCK2_50 | 第二路 50MHz | 部分版本才有,看原理图确认 |
| KEY[3:0] | 按键 | 按下为低,需消抖 |
| SW[9:0] | 拨码开关 | 直接电平输入 |
| HPS_RESET | 复位芯片 | 同时影响 HPS 和 FPGA |
3. 开发手册里的 HPS 地址映射与寄存器配置
3.1 存储器映射:软件侧看到的地址从哪来
开发手册(通常指 SoC 的 Technical Reference Manual 和板级手册)里最核心的一张表是 HPS 的存储器映射表。它告诉你每个外设控制器在 CPU 地址空间里的基地址。比如:
- 以太网控制器基地址
- SD/MMC 控制器基地址
- UART 控制器基地址
- GPIO 控制器基地址
- FPGA 侧通过 AXI bridge 映射到 HPS 的地址窗口
这些地址不是随便定的,是芯片设计时固定的。你在写裸机程序或者 Linux 驱动时,操作寄存器就是往这些基地址加偏移量写值。开发手册会给出每个寄存器的偏移、位域定义、读写属性。
3.2 用 devmem 在 Linux 下直接验证寄存器
DE1-SoC 跑 Linux 之后,最直接的验证方式是用 devmem 读写物理地址。假设你要确认某个 GPIO 控制器的方向寄存器:
# 读取 GPIO 控制器某个寄存器的值(地址仅为示例,实际以手册为准)
devmem 0xFF200000 32
# 写入方向寄存器,配置为输出
devmem 0xFF200004 32 0x000000FF
# 再次读取确认
devmem 0xFF200004 32
逻辑说明: devmem 第一个参数是物理地址,第二个是位宽(32 位),第三个是可选写入值。参数上,地址必须来自开发手册的映射表,不能凭记忆写。位宽要和寄存器定义一致,SoC 外设寄存器通常是 32 位。写入值要按位域拆解,比如低 8 位对应 8 个 GPIO 的方向。
注意:
devmem直接操作物理地址,绕过内核驱动,写错地址可能导致系统挂死。建议先在开发手册里确认地址范围,再操作。
3.3 从手册到设备树:让 Linux 认识你的外设
如果你要在 Linux 下用标准驱动框架,而不是裸写 devmem ,就需要改设备树。开发手册会给出外设的寄存器范围、中断号、时钟源,这些信息要翻译成设备树节点。下面是一个简化的设备树片段:
// 设备树节点示例:描述一个挂在 HPS 上的自定义外设
my_peripheral: my_peripheral@ff200000 {
compatible = "my-vendor,my-peripheral";
reg = <0xff200000 0x1000>; // 寄存器基地址和长度
interrupts = <0 40 4>; // 中断号,以手册为准
clocks = <&clk_0>; // 时钟源引用
status = "okay";
};
逻辑说明: reg 属性告诉内核这段物理地址范围,驱动 probe 时会做 ioremap。 interrupts 三个数字分别是中断类型、编号、触发方式,必须和开发手册的中断映射表一致。 clocks 引用时钟树节点,确保驱动能拿到时钟频率。参数上,地址长度 0x1000 表示 4KB 空间,实际大小看手册。
4. 把原理图和手册落到实际工程配置
4.1 Quartus 工程里必须对齐的三类设置
原理图和开发手册的信息最终要体现在 Quartus 工程设置里。我一般会检查这三类:
第一类是器件型号。DE1-SoC 是 5CSEMA5F31C6,选错型号会导致引脚不匹配。第二类是引脚约束,前面已经讲过。第三类是 HPS 配置,如果你要用 HPS,需要在 Platform Designer(原 Qsys)里配置 HPS 组件,包括 DDR3 参数、时钟、外设使能。
DDR3 参数尤其重要,开发手册会给出板载 DDR3 的型号、容量、时序参数。Platform Designer 里如果参数填错,HPS 可能启动不了或者运行不稳定。
4.2 用 Platform Designer 配置 HPS-FPGA AXI 互联
HPS 和 FPGA 之间的通信靠 AXI bridge。常见做法是在 Platform Designer 里添加 HPS 组件,使能 FPGA-to-HPS 和 HPS-to-FPGA 两个 bridge,然后把你自己的 IP 挂到 AXI 总线上。
配置时要注意地址分配。Platform Designer 会自动分配地址,但你要确认 FPGA 侧 IP 的地址落在 HPS 能访问的窗口内。开发手册会给出这个窗口的范围。如果地址冲突,编译会报错。
# Platform Designer 生成后,在 Quartus 里分配引脚
# 假设你的 IP 有一个输出端口 led_out
set_location_assignment PIN_V16 -to led_out
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to led_out
逻辑说明:Platform Designer 生成的系统会导出顶层端口,这些端口需要在 Quartus 里做引脚约束。参数上,端口名要和 Platform Designer 导出的名字一致,否则约束不生效。
4.3 启动流程:从 SD 卡到 U-Boot 到 Linux
DE1-SoC 的 HPS 启动流程通常是:片上 Boot ROM 读取启动引脚决定的启动介质(SD 卡或 QSPI),加载 U-Boot SPL,再加载 U-Boot,最后加载 Linux 内核。开发手册会给出启动引脚设置和分区布局。
常见做法是把 SD 卡分成两个分区:第一个是 FAT 分区放 U-Boot 和内核,第二个是 ext4 分区放根文件系统。烧录时要注意 U-Boot 的偏移量,不同版本可能不同,以手册为准。
| 阶段 | 文件 | 存放位置 | 注意事项 |
|---|---|---|---|
| Boot ROM | 固化 | 芯片内部 | 不可改 |
| SPL | u-boot-spl.bin | SD 卡原始偏移 | 偏移量看手册 |
| U-Boot | u-boot.img | FAT 分区 | 需匹配 SPL 版本 |
| 内核 | zImage | FAT 分区 | 设备树要匹配 |
| 根文件系统 | rootfs | ext4 分区 | 权限和挂载点 |
5. 调试 DE1-SoC 时几个容易翻车的细节
5.1 引脚约束写错但编译通过
Quartus 编译通过不代表引脚约束正确。如果引脚号写成了一个不存在的引脚,编译会报错;但如果写成了一个存在但功能不对的引脚,编译通过,板子行为异常。我一般会做两件事:一是用 Quartus 的 Pin Planner 可视化核对,二是上板后用示波器或逻辑分析仪测实际引脚。
另一个常见问题是 IO 标准不匹配。比如原理图标的是 3.3V LVTTL,你写了 2.5V,编译可能通过,但电平不兼容,外设通信失败。
5.2 HPS 侧 DDR3 参数填错导致启动卡死
DDR3 参数包括时序、容量、位宽、bank 数。开发手册会给出板载 DDR3 的具体型号和推荐参数。如果 Platform Designer 里填错,HPS 可能在 SPL 阶段就卡死,串口没有任何输出。排查方法是先用已知正确的配置文件对比,逐项核对参数。
5.3 跨时钟域信号没做同步
FPGA 逻辑和 HPS 逻辑往往在不同时钟域。如果你直接把 FPGA 侧的信号接到 HPS 侧,或者反过来,没有做同步,会出现亚稳态。常见做法是用双触发器同步器或者异步 FIFO。开发手册里如果有跨时钟域的参考设计,优先参考。
5.4 用 SignalTap 抓 HPS-FPGA 接口信号
调试 AXI 通信问题时,SignalTap 是有效工具。你可以把 AXI 的 valid、ready、data 信号加到 SignalTap 里,触发条件设为 valid 且 ready 同时为高,观察数据传输。注意 SignalTap 会占用 FPGA 资源,采样深度和时钟要合理设置,否则会影响时序。
# SignalTap 采样时钟设置示例(在 .stp 文件里配置)
# 采样时钟用 AXI 时钟,采样深度 1024
# 触发条件:awvalid && awready
逻辑说明:采样时钟必须和被测信号同域,否则抓到的数据没有意义。触发条件要能捕获到你关心的事件,比如一次写事务的开始。参数上,采样深度越大占用内存越多,1024 到 4096 是常见范围。
5.5 串口无输出时的排查顺序
HPS 启动卡死时,串口是唯一线索。如果串口完全无输出,按这个顺序查:先确认串口线接的是 HPS UART 而不是 FPGA UART;再确认波特率(通常是 115200);然后确认 SD 卡启动引脚设置;最后用示波器测 UART TX 引脚有没有波形。如果 SPL 阶段有输出但内核阶段没有,多半是内核或设备树问题。
288



被折叠的 条评论
为什么被折叠?



