简介:这份资料面向使用 DE1-SoC 开发板的嵌入式工程师与高校学习者,聚焦 ARM+FPGA 异构平台的硬件认知与上板实践,适合从入门搭建环境到深入理解板级电路的中级读者。压缩包共 1 个 PDF 文件,约 7.1MB,即 Terasic 官方 DE1-SoC User Manual,内容按章节组织:第一章介绍开发套件包装清单、系统光盘使用与求助途径;第二章解析板卡布局、组件与块图,梳理处理器、内存、外设的连接关系;第三章讲解 FPGA 配置模式设置、Cyclone V SoC FPGA 配置流程,以及 LED、按键、开关等状态元素、复位电路、时钟电路和与 FPGA 相连的 7 段数码管、GPIO 扩展头、音频 CODEC、I2C 多路复用器、VGA、TV Decoder、红外收发等外设。已有 1321 人学习,可帮助读者快速熟悉板卡物理结构与接口位置,掌握配置与调试要点,为后续嵌入式与 FPGA 项目开发打下硬件基础。
1. 拿到 DE1-SoC 手册先别急着翻代码:这份 116 页文档到底该按什么顺序读
板子到手,很多人第一反应是插上 USB-Blaster 直接跑 Quartus 编译,结果卡在“Programmer 里看不到设备”或者“HPS 起不来”这种玄学问题上,翻遍论坛也找不到答案。DE1-SoC 这份用户手册(2019 年 1 月版,共 9 章 116 页)的价值恰恰在这里:它不是一本教你写 Verilog 的教材,而是一份把 Cyclone V SoC 这颗“ARM + FPGA”异构芯片的硬件底细摊开给你看的工程参考。从板级布局、时钟树、配置模式跳线,到 FPGA 侧 64MB SDRAM 与 HPS 侧 1GB DDR3 的地址映射,再到 System Builder 自动生成引脚约束、EPCS128 固化流程,它覆盖的是“板子为什么不听话”这一类问题的根因。适合已经能跑通点亮 LED、但一碰 HPS 与 FPGA 协同、DDR3 初始化、SD 卡启动就翻车的嵌入式硬件工程师,也适合把这块板子当教学平台的实验室。关键词 stm32、arm、嵌入式硬件、单片机在这里的落点是:ARM Cortex-A9 双核跑 Linux,FPGA 侧做实时外设,两者通过 AXI 桥通信——手册第 7 章的混合示例正是这条链路的样板。
2. 板级硬件底账:从 Cyclone V 器件型号到 HPS 外设映射
2.1 先认清你手里这颗芯片的边界
手册第 2 章把板载资源列得很清楚,但真正影响你选型和写约束的是几个硬指标。FPGA 侧是 Cyclone V SE 5CSEMA5F31C6N,85K 逻辑单元、4450 Kbit 嵌入式存储、6 个分数分频 PLL;HPS 侧是 800MHz 双核 Cortex-A9 MPCore,带 1GB DDR3(32 位数据总线)。这里有个新手最容易忽略的点:FPGA 侧的 SDRAM 只有 64MB、16 位数据总线,和 HPS 侧的 1GB DDR3 是两套完全独立的内存系统。你在 Nios II 里跑 SDRAM 测试(手册 5.4、5.5 节)用的是前者,跑 Linux 用的是后者,地址空间不互通,别指望在 HPS 的 Linux 里直接 mmap 到 FPGA SDRAM。
配置与调试链路也值得先记牢:板载 USB-Blaster II 走 JTAG 模式,配置器件是 EPCS128。手册第 8 章专门讲 .SOF 转 .JIC 再写进 EPCS 的流程,这是产品化必经之路——JTAG 下载掉电即失,EPCS 固化才能上电自启动。很多人在实验室调通了就以为完事,交付时才发现板子断电重上电程序没了,血泪经验就是这一步别拖到最后。
| 资源 | FPGA 侧 | HPS 侧 |
|---|---|---|
| 内存 | 64MB SDRAM(16 位) | 1GB DDR3(32 位) |
| 用户按键 | 4 个 | 1 个 |
| 用户 LED | 10 个 | 1 个 |
| 拨码开关 | 10 个 | 无 |
| 以太网 | 无 | 千兆 PHY + RJ45 |
| USB | 无 | 双口 USB Host |
| 存储卡 | 无 | Micro SD 插座 |
这张表建议打印出来贴在工作台前。我见过太多人把 HPS 的按键当成 FPGA 的按键去写约束,编译过了、下载了、按下去没反应,然后怀疑板子坏了——其实是引脚约束文件里根本没这个信号。
2.2 时钟与复位:所有玄学问题的源头
手册 3.5 节讲时钟电路,3.4 节讲复位元素,这两节篇幅不大但含金量极高。板上有 4 路 50MHz 时钟源来自时钟发生器,分别供给 FPGA 不同 bank;HPS 侧有独立的时钟域。实际做设计时,如果你在 FPGA 里例化 PLL 却发现输出频率不对,先回去核对参考时钟是从哪一路进来的——4 路 50MHz 在引脚约束里是不同的管脚,接错了 PLL 的输入,输出自然全错。
复位更是个黑匣子。板上有 HPS_RESET_n 和 HPS_WARM_RST_n 两个 HPS 复位按键,前者是冷复位、后者是热复位,行为不一样:冷复位会把 HPS 外设全部重置,热复位保留部分状态。手册 3.4 节给了按键的电气连接,但没告诉你的是,如果你在 FPGA 逻辑里自己造了一个复位信号去驱动 HPS 相关接口,冷热复位的时序差异会让你的状态机在复位释放的瞬间跑飞。常见做法是:FPGA 侧逻辑只用板载 FPGA 按键做本地复位,跨到 HPS 的 AXI 接口复位统一交给 HPS 复位域管理,别自己造轮子。
2.3 外设连接关系决定了你的引脚约束怎么写
手册 3.6 节把 FPGA 侧外设一个个列了出来:用户按键/开关/LED、六位数码管、2x20 GPIO 扩展排针、24 位音频 CODEC、I2C 多路复用器、VGA DAC、TV 解码器、红外收发、SDRAM、PS/2、ADC 及 2x5 排针。3.7 节则是 HPS 侧:按键/LED、千兆以太网、UART、DDR3、Micro SD、双口 USB Host、G-sensor、LTC 连接器。
这里的关键认知是:同一个物理外设,挂在 FPGA 侧还是 HPS 侧,决定了你用什么软件栈去驱动它。比如 G-sensor 挂在 HPS 的 I2C 上(手册 6.3 节有示例),你要在 Linux 用户态通过 /dev/i2c 去读;而 ADC 是 4 线 SPI 接 FPGA(手册 5.9 节示例),你得在 FPGA 里写 SPI 时序或者用 Nios II 的 SPI IP。选型时先问一句“这个外设归谁管”,能省掉大量返工。
3. 配置模式与 System Builder:把引脚约束从手工活变成生成活
3.1 FPGA 配置模式的跳线设置别凭感觉
手册 3.1 节讲 FPGA 配置模式设置,3.2 节讲 Cyclone V SoC FPGA 的配置。DE1-SoC 支持多种配置模式,通过板上的模式选择跳线决定上电后从哪里加载比特流:JTAG 模式用于调试下载,EPCS 模式用于从配置器件自启动,还有 HPS 相关的启动路径。很多人第一次用只关心 JTAG,跳线随便拨,结果后来做 EPCS 固化时忘了改回来,烧录成功但上电不启动,排查半天。
正确顺序是:调试阶段跳线设 JTAG,用 USB-Blaster II 直接下载 .SOF 验证功能;功能稳定后,按手册第 8 章把 .SOF 转成 .JIC,通过 JTAG 写进 EPCS128,然后把跳线切到 EPCS 启动模式,断电重上电验证。这一步的验证方法很朴素但有效:拔掉 USB-Blaster,只留 12V 电源,看你的设计是否自动跑起来。别在还插着下载线的情况下判断“固化成功”,JTAG 在线时板子可能仍在走调试通道。
3.2 System Builder 到底替你做了什么
手册第 4 章讲 DE1-SoC System Builder,这是整套资料里最实用的工具之一。它的作用是:你在图形界面里勾选要用哪些外设(按键、LED、数码管、SDRAM、音频等),它自动生成 Quartus 工程需要的引脚约束文件(.qsf 里的 set_location_assignment)、顶层引脚定义,以及一份对应的 Qsys 系统骨架。手工写 2x20 排针那 80 个引脚约束是纯体力活且极易出错,System Builder 把这部分自动化了。
使用流程大致是:打开 System Builder → 选择板卡型号 DE1-SoC → 勾选外设 → 指定工程输出目录 → 生成。生成后你会得到一个包含 .qsf、.v 顶层模板和 Qsys 文件的工程目录。注意它生成的是骨架,不是完整设计,你的逻辑还是要自己填。参数上要留意的是外设的默认引脚分配和 IO 标准(比如 3.3V LVTTL),如果你外接的扩展板电平不同,得在 .qsf 里改 IO Standard,否则可能烧 IO。
# 示例:System Builder 生成的 .qsf 片段(手工核对用) # 用户 LED 引脚约束,注意 IO 标准与 bank 电压匹配 set_location_assignment PIN_AB12 -to LEDR[0] set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LEDR[0] set_location_assignment PIN_AC12 -to LEDR[1] set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LEDR[1] # 用户按键,注意这是 FPGA 侧 4 个按键之一 set_location_assignment PIN_AA14 -to KEY[0] set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to KEY[0]上面这段是约束文件的典型形态,逻辑说明:set_location_assignment把顶层端口绑定到具体物理引脚,set_instance_assignment指定该引脚的 IO 电气标准。参数说明:PIN_AB12 这类引脚编号必须和手册第 2 章布局图、以及板卡原理图逐一核对,不能凭记忆;IO_STANDARD 要和该 bank 的供电电压一致,DE1-SoC 大部分用户 IO 是 3.3V LVTTL,但扩展排针上若有 5V 容忍需求要单独确认。生成后建议拿万用表或原理图抽查两三个引脚,确认约束和物理连接对得上,这一步花五分钟,能省掉后面“灯不亮”的两小时。
3.3 Qsys 系统里 HPS 与 FPGA 的桥接配置
手册第 7 章的混合示例(HPS 控制 LED 和 HEX、Control Panel、Linux Frame Buffer)都依赖 Qsys 里正确例化 HPS 组件并连好 AXI 桥。关键参数有三个:HPS 的 DDR3 时序参数(必须和板载颗粒匹配,手册 3.7.4 节给了颗粒型号和连接)、AXI 桥的位宽与时钟域、以及中断路由。DDR3 时序填错的表现是 HPS 起 Linux 时在解压内核阶段就挂死,串口只打印到一半——这种时候别怀疑内核,回去查 Qsys 里 HPS 的 memory preset 是否选对了板卡预设。
AXI 桥的时钟域要特别注意:HPS 侧 AXI 主频和 FPGA 侧逻辑时钟往往不同,跨时钟域的信号必须过同步器或异步 FIFO。手册示例里 HPS 控制 LED 是低速信号,直接连问题不大,但如果你传的是视频流或高速采样数据,不做跨时钟域处理,数据错位是必然的,而且这种错误在仿真里未必复现,上板才炸。
4. 从示例工程反推开发流程:FPGA 侧、HPS 侧与混合系统
4.1 FPGA 侧示例:先跑通 SDRAM 测试再谈其他
手册第 5 章给了 9 个 FPGA 示例,从出厂配置到音频录放、卡拉 OK、Nios II 下的 SDRAM 测试、Verilog 版 SDRAM 测试、TV Box、PS/2 鼠标、红外收发、ADC 读取。建议的复现顺序不是按章节号,而是按依赖关系:先跑 5.1 出厂配置确认板子硬件完好,再跑 5.5 Verilog 版 SDRAM 测试确认 FPGA 侧内存控制器工作正常,然后才是音频、VGA 这些外设。
SDRAM 测试之所以要优先,是因为它验证的是 FPGA 侧最复杂的高速接口。64MB、16 位数据总线的 SDRAM,时序参数(CAS latency、刷新周期)在示例里已经配好,你跑通说明引脚约束、PLL 时钟、IO 时序都对了。如果这一步就挂,后面所有依赖内存的设计都不用谈。跑测试时观察数码管或 LED 的通过指示,手册示例通常用 LED 全亮或特定图案表示测试通过。
音频 CODEC 示例(5.2、5.3 节)涉及 I2C 配置 CODEC 寄存器加 I2S 数据流,是典型的“配置 + 数据”双通道外设。翻车点常在 I2C 地址:CODEC 的 I2C 从地址由板上地址引脚决定,手册 3.6.4 节有说明,写错地址表现为配置无应答、无声。用示波器抓 I2C 的 ACK 位是最快的定位手段。
4.2 HPS 侧示例:Hello Program 是 Linux 环境的体检
手册第 6 章的 HPS 示例从 Hello Program 开始,这不是凑数。它能跑通,意味着 SD 卡镜像烧写正确、串口终端参数对(波特率通常 115200)、UART 到 USB 的 Mini-B 线连接正常、HPS 启动流程走完。这一步挂了,后面 I2C G-sensor、I2C MUX 测试都无从谈起。
复现 Hello Program 的步骤:用官方提供的 SD 卡镜像写入 Micro SD 卡,插卡、接串口线、上电,在串口终端里看到启动日志并登录,然后运行示例程序。参数上要核对的是串口设备号(Windows 下是 COMx,Linux 下是 /dev/ttyUSBx)和波特率。如果串口一片乱码,九成是波特率不对或地线没接好;如果完全无输出,先确认 SD 卡镜像是否写到了正确的卡、启动跳线是否在 SD 启动模式。
I2C G-sensor 示例(6.3 节)是 HPS 侧外设访问的标准范式:打开 /dev/i2c-N、设置从地址、读寄存器、解析加速度值。这里的坑是 I2C 多路复用器(手册 3.6.5 节):板上有 I2C MUX,G-sensor 挂在 MUX 的某个通道后面,你得先写 MUX 的通道选择寄存器,才能和 G-sensor 通信。直接拿 G-sensor 地址去读,得到的是 NAK。手册 6.4 节的 I2C MUX Test 示例就是专门演示这个的,两个示例对照着看就明白了。
/* 示例:HPS 侧通过 I2C MUX 访问 G-sensor 的关键步骤(伪代码结构) */ int fd = open("/dev/i2c-0", O_RDWR); /* 第一步:选中 MUX 通道,G-sensor 在通道 N 上 */ ioctl(fd, I2C_SLAVE, MUX_ADDR); uint8_t ch = 1 << N; /* 通道位图,具体位看原理图 */ write(fd, &ch, 1); /* 第二步:切到 G-sensor 从地址读寄存器 */ ioctl(fd, I2C_SLAVE, GSENSOR_ADDR); uint8_t reg = 0x00; write(fd, ®, 1); read(fd, buf, 6); /* 读三轴数据 */逻辑说明:I2C MUX 本质是一个可编程开关,同一时刻只有一个通道连到主总线,所以必须先写 MUX 再访问下游器件。参数说明:MUX_ADDR 和 GSENSOR_ADDR 都要从手册 3.6.5 节和原理图里查,不能猜;通道位图 ch 的位序取决于 MUX 型号,写反了会选错通道,表现为读到全 0 或 NAK。这段代码的价值在于它把“为什么直接读 G-sensor 读不到”这个高频问题讲透了。
4.3 混合系统示例:HPS 与 FPGA 协同的三种典型形态
手册第 7 章三个示例代表了三种协同深度:HPS 控制 LED 和 HEX 是最浅的——HPS 通过 AXI 轻量桥写 FPGA 侧的 PIO,适合验证桥通路;Control Panel 是中等——上位机通过 HPS 上的通信链路间接控制 FPGA 外设;Linux Frame Buffer 是最深的——HPS 跑 Linux 图形栈,帧缓冲数据经 AXI 送到 FPGA 侧 VGA 输出。
做混合系统时,我一般会先跑通最浅的 HPS 控制 LED,确认 Qsys 里 HPS 组件、AXI 桥、PIO 三者连接和地址映射都对,再往上叠功能。地址映射是高频翻车点:Qsys 里给 PIO 分配的基地址,和 Linux 设备树里写的 reg 值必须一致,不一致的表现是写 /dev/mem 时要么段错误要么写到了别处。核对方法是编译后在 Qsys 的 Address Map 页签里截图,和设备树 dts 逐项对。
5. 避坑与排查:五个上板必踩的坑
5.1 现象:Programmer 里看不到 USB-Blaster II
原因:驱动没装或 USB 线接错口。DE1-SoC 上有两个 USB 口,一个是 USB-Blaster II 用的 Type-B,一个是 UART 用的 Mini-B,插混了自然找不到下载器。解决:确认 Type-B 线接到标有 Blaster 的口,Windows 下装 Quartus 自带的 USB-Blaster 驱动,Linux 下检查 udev 规则是否放行了该 USB 设备。还不行就换一根确认能传数据的 USB 线,有些线只供电不传数据。
5.2 现象:HPS 起 Linux 卡在解压内核,串口输出中断
原因:Qsys 里 HPS 的 DDR3 时序参数和板载颗粒不匹配,或 SD 卡镜像与板卡版本不对应。解决:在 Qsys 的 HPS 组件里选板卡预设而非手填时序;核对 SD 卡镜像的发布日期与手册版本是否配套。手册 3.7.4 节给了 DDR3 颗粒的连接信息,可以拿来交叉验证。
5.3 现象:EPCS 固化后上电不启动,但 JTAG 下载正常
原因:配置模式跳线还停在 JTAG,或 .JIC 文件生成时器件型号选错。解决:按手册第 8 章流程重新生成 .JIC,确认目标器件是 EPCS128;固化完成后把跳线切到 EPCS 启动模式,拔掉下载线再上电验证。别在插着下载线时下结论。
5.4 现象:FPGA 侧 SDRAM 测试随机失败,有时过有时不过
原因:SDRAM 时序余量不足,常见于 PLL 输出时钟相位没调好,或引脚约束里 IO 延时设置不当。解决:先用示例工程的默认时序跑,确认硬件本身没问题;再逐步改 PLL 相位,每次只动一个参数,用测试通过率判断。这类问题没有后悔药,只能靠系统性变量控制。
5.5 现象:HPS 读 G-sensor 一直 NAK
原因:没先配置 I2C MUX 通道,或 MUX 通道位写反。解决:按 4.2 节的顺序先写 MUX 再访问 G-sensor,用示波器或逻辑分析仪抓 I2C 波形确认 ACK 出现在哪一步。手册 6.4 节的 MUX Test 示例可以直接拿来对照。
6. 进阶用法:把手册当查表工具,而不是从头读到尾
这份手册最容易被误用的方式,是把它当小说从第 1 页读到第 116 页。实际工作中它的正确打开方式是查表:写引脚约束时翻 3.6、3.7 节的外设连接;配 Qsys 时翻 3.7.4 节的 DDR3 连接和 4.3 节的 System Builder 流程;固化时翻第 8 章;调混合系统时翻第 7 章对照地址映射。我一般会在 PDF 里给这几节打上书签,再在工程目录里放一份自己整理的“引脚-外设-归属侧”速查表,比每次翻手册快得多。
一个具体技巧:把手册第 2 章的板级框图和原理图 PDF 并排打开,做任何外设实验前先花两分钟确认三件事——这个外设挂在 FPGA 还是 HPS、它的时钟从哪来、它的复位归谁管。这三问能挡掉八成“上板不工作”的问题。另外,手册里的示例工程不要只跑一遍看现象,要打开 Qsys 看地址分配、打开 .qsf 看引脚约束、打开顶层看端口连接,把“能跑”变成“知道为什么能跑”。从那以后我每次接手一块新板子,都强制走一遍“框图对照 + 三问确认 + 最小示例验证”的流程,再动手写自己的逻辑。希望帮到你。
本文还有配套的精品资源,点击获取