简介:面向使用DE1-SoC开发板的嵌入式工程师与高校学习者,这份硬件原理图及开发手册系统梳理了开发板从入门到实践所需的基础知识,帮助读者快速建立对ARM+FPGA异构平台的整体认知。压缩包内为1个PDF文件,约7.1MB,内容涵盖开发套件清单与系统光盘使用、板卡布局与组件说明、块图结构解析,以及FPGA配置模式设置、Cyclone V SoC FPGA配置流程、板载状态与复位元素、时钟电路原理等核心章节。手册还逐一讲解与FPGA相连的外设接口,包括用户按键、开关与LED、七段数码管、GPIO扩展排针、音频编解码器、I2C多路复用器、VGA、TV解码器及红外收发等模块,便于对照原理图理解电路连接与功能实现。目前已有1321人学习,适合需要熟悉开发板物理结构、掌握配置方法与外设驱动思路的读者作为案头参考。
1. 拿到 DE1-SoC 手册先别翻目录:三个反直觉的读法
很多人拿到一份 116 页的板级手册,第一反应是从第 1 页顺着读,读到第 3 章外设清单就开始犯困,最后只记住“这板子有 ARM 和 FPGA”。我拆过几份同类文档,DE1-SoC 这份最值得先看的其实不是正文,而是第 2 章的板级框图和第 3 章的时钟、复位、配置模式三节——它们决定了你后面所有代码能不能跑起来。这份手册面向的是 Cyclone V SoC 平台,一颗芯片里塞了双核 Cortex-A9 硬核处理器系统(HPS)和 85K 逻辑单元的 FPGA 架构,外加 1GB DDR3、64MB SDRAM、千兆以太网、VGA、音频 CODEC、ADC 和两排 40 pin 扩展口。它解决的不是“教你写 Verilog”的问题,而是“这块板子每个引脚到底接去哪、上电时谁先启动、外设挂在 HPS 侧还是 FPGA 侧”的问题。适合已经摸过 STM32 或单片机、想往 SoC FPGA 跨一步的嵌入式工程师,也适合带课程设计、需要一份能对着原理图查线的同学。下面按我实际复现的顺序拆。
2. 先分清 HPS 侧和 FPGA 侧:外设归属决定你写哪套代码
2.1 一张归属表比读十页文字管用
这份手册最容易翻车的地方,是把“板上有这个外设”当成“我能直接用”。DE1-SoC 的外设分两套总线:一套挂在 HPS 的 ARM 侧,一套挂在 FPGA 的可编程逻辑侧,中间靠高带宽互联桥连接。你写 Linux 驱动还是写 Verilog 状态机,完全取决于目标外设归谁管。我一般先把手册第 2 章和第 3 章的清单压成一张表,贴在工位边上:
| 外设 | 归属 | 关键参数 | 访问方式 |
|---|---|---|---|
| 用户按键 | FPGA x4 / HPS x1 | 低有效,需消抖 | FPGA 走 GPIO IP,HPS 走寄存器 |
| 滑动开关 | FPGA x10 | 电平输入 | 纯 FPGA 引脚 |
| 用户 LED | FPGA x10 / HPS x1 | 高电平点亮 | 同上 |
| 六位数码管 | FPGA | 共阳/共阴需查原理图 | 动态扫描 |
| SDRAM | FPGA | 64MB,16 位数据总线 | 硬核控制器或软核 |
| DDR3 | HPS | 1GB,32 位数据总线 | HPS 内存控制器 |
| 千兆以太网 | HPS | RJ45 + PHY | Linux 网络栈 |
| Micro SD | HPS | 启动介质之一 | Boot ROM 识别 |
| G-sensor | HPS | I2C 接口 + 中断 | I2C 驱动 |
| ADC | FPGA | 8 通道、12 位、500 KSPS、0~4.096V | SPI 四线 |
| VGA | FPGA | 8 位三路高速 DAC | 时序生成 |
| 音频 CODEC | FPGA | 24 位,line-in/out/mic-in | I2S 类时序 |
| 40 pin 扩展口 | FPGA | 两组,带二极管保护 | 自定义 |
这张表的价值在于:当你说“我要读 G-sensor”,就该去 HPS 侧找 I2C 控制器,而不是在 FPGA 里造一个 I2C;当你说“我要驱动数码管”,就别指望 Linux 里有个现成设备节点。手册第 3.6 节和第 3.7 节的分界就是这条线,读的时候带着“这个外设归谁”的问题去看,效率完全不一样。
2.2 配置模式与启动链:上电那几秒发生了什么
手册第 3.1 节讲 FPGA 配置模式设置,第 3.2 节讲 Cyclone V SoC FPGA 的配置,这两节是整份文档里最容易被跳过的“黑匣子”。DE1-SoC 板上有 EPCS128 串行配置器件,也有板载 USB-Blaster II,配置模式由拨码开关决定。常见做法是:调试阶段用 JTAG 模式,把 .sof 文件直接下载进 FPGA,掉电即失;量产或脱机演示时,把 .sof 转成 .jic 烧进 EPCS,上电由配置器件加载。
这里有个反直觉的点:SoC FPGA 的启动不是“FPGA 先起来再叫醒 ARM”,而是 HPS 的 Boot ROM 先跑,再根据启动介质(SD 卡或 EPCS)决定加载什么。所以你在做“HPS 控制 LED 和数码管”这类实验时,如果只烧了 FPGA 的 .sof 却没准备 HPS 的启动镜像,ARM 侧根本没起来,现象就是“灯不亮、串口无输出”,新手很容易误判成引脚约束写错。我一般会先确认三件事:拨码开关在哪个模式、串口有没有打印、SD 卡里有没有可启动镜像。这三步确认完,再去看代码。
2.3 时钟与复位:所有时序问题的源头
手册第 3.4 节和第 3.5 节分别讲复位元素和时钟电路。板上有四个 50MHz 时钟源来自时钟发生器,FPGA 侧和 HPS 侧各有自己的复位按钮(HPS_RESET_n 和 HPS_WARM_RST_n)。做 VGA 或音频这类对时序敏感的实验时,时钟源选错、复位极性搞反,现象往往是“图像偏移几行”或“音频有杂音”,而不是干脆不工作,排查起来很费时间。
我的习惯是:在顶层模块里把时钟和复位单独拉一个文件,所有子模块只接收已经处理好的 clk 和 rst_n,不在子模块里再去做分频或反相。这样一旦现象不对,先示波器量时钟引脚,再确认复位是不是低有效,能省掉大量“玄学”调试。手册里对每个时钟源的频率和去向写得比较清楚,对着框图把引脚号抄进约束文件,比事后猜要靠谱得多。
3. 把手册变成可执行工程:System Builder 与 Quartus 的配合
3.1 用 System Builder 生成引脚约束,别手抄
手册第 4 章专门讲 DE1-SoC System Builder,这是这份文档里最“能抄作业”的部分。它的作用是:你在图形界面里勾选要用哪些外设、每个外设用什么信号名,工具自动生成 Quartus 工程需要的引脚分配和顶层文件。手抄引脚号是血泪经验——40 pin 扩展口两组、六位数码管、ADC 的 SPI 四线,引脚号密集且容易看串行,抄错一个就是“编译通过、板子没反应”。
常见流程是:打开 System Builder,选板卡型号,勾选外设,给每个信号起一个和你的 Verilog 顶层一致的名字,导出 qsf 约束文件,再在 Quartus 里把它加进工程。这里的关键参数是信号命名要和代码里的端口名逐字一致,大小写敏感。我见过有人导出后改了代码里的端口名却没重新导出,结果约束全部落空,编译零错误但引脚全是默认状态。
# 在 Quartus 的 qsf 里,System Builder 导出的约束大致长这样 # 下面几行是示意,实际引脚号以你导出的文件为准 set_location_assignment PIN_AF14 -to KEY[0] set_location_assignment PIN_AA14 -to KEY[1] set_location_assignment PIN_AB12 -to SW[0] set_location_assignment PIN_V16 -to LEDR[0] set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to KEY[0]上面这段的逻辑说明:set_location_assignment把顶层端口绑到物理引脚,-to后面必须和 Verilog 端口名完全对应;set_instance_assignment指定 IO 电平标准,DE1-SoC 的 FPGA 侧用户 IO 一般是 3.3V LVTTL,写错会导致编译报电平冲突或板子上电平不对。参数上唯一要改的就是引脚号和端口名,其余照导出文件来,不要自己发挥。
3.2 从 .sof 到 .jic:脱机运行的最后一公里
手册第 8 章讲 EPCS 编程,步骤是先把 .sof 转成 .jic,再写进 EPCS 器件。这一步在课程设计答辩或现场演示时特别重要,因为没人想每次都开电脑、开 Quartus、插 USB-Blaster。转换在 Quartus 的 Convert Programming Files 对话框里完成,关键选项是配置器件选 EPCS128、加载方式选 Active Serial。
# 命令行方式转换(Quartus 安装目录下的工具,路径按实际安装调整) quartus_cpf -c -o bitstream_compression=on \ -d EPCS128 \ top.sof top.jic逻辑说明:-c表示转换,-d EPCS128指定目标配置器件型号,-o bitstream_compression=on打开位流压缩以节省配置器件空间。转换完成后用 Programmer 工具把 .jic 烧进 EPCS,拨码开关切到 Active Serial 模式,重新上电就能脱机加载。这里容易踩的坑是:转换时选错器件型号,烧进去后上电无反应;或者烧完没切拨码开关,仍然停在 JTAG 模式。手册第 8.4 节还讲了擦除 EPCS 的步骤,反复烧写失败时先擦再写,比反复重试有效。
3.3 用官方示例验证工具链,再改自己的逻辑
手册第 5 到第 7 章给了大量示例:FPGA 侧的音频录放、卡拉 OK、SDRAM 测试、TV Box、PS/2 鼠标、红外收发、ADC 读取;HPS 侧的 Hello 程序、LED 与按键、I2C G-sensor、I2C MUX;以及两者协同的 HPS 控制 LED 和数码管、控制面板、Linux 帧缓冲。我的建议是先跑通一个最小示例,比如 FPGA 侧的按键点灯或 HPS 侧的 Hello 串口打印,确认 Quartus 版本、USB-Blaster 驱动、串口终端三件事都正常,再动自己的设计。
这一步的参数重点是串口:HPS 的 UART 转 USB 用的是 Mini-B 口,波特率在示例里一般写死,终端要设成一致,常见是 115200、8N1。如果串口全是乱码,先查波特率,再查是不是接错了 USB 口(板上有两个 USB 口,一个给 FPGA 编程,一个给 UART)。这个细节手册第 1 章包装清单里提过,但很多人不看,插错口调半天。
4. 避坑与排查:五条我实际踩过的记录
4.1 现象:编译通过,下载后板子毫无反应
原因:引脚约束没生效,或者顶层端口名和约束文件里的名字不一致。System Builder 导出后改了代码没重新导出,是最常见的一种。解决:打开 Quartus 的 Pin Planner 对照一遍,确认每个端口都有实际引脚号,没有落在“未分配”状态;再检查 qsf 里-to的名字大小写。我现在的习惯是每次改顶层端口名,就重新跑一次 System Builder 导出,不手工补。
4.2 现象:HPS 侧程序跑不起来,串口无输出
原因:启动介质没准备好,或者拨码开关不在对应模式。HPS 的 Boot ROM 只认特定分区的启动镜像,SD 卡里如果只是随便拷了个文件,ARM 根本不会启动。解决:按手册第 6 章的示例流程制作启动卡,确认拨码开关切到 SD 启动;先用官方 Hello 示例验证,再换自己的镜像。排查顺序是:供电灯亮不亮、串口有没有任何字符、拨码开关位置、SD 卡内容,逐项排除。
4.3 现象:ADC 读数跳动大或始终为 0
原因:ADC 在 FPGA 侧走 SPI 四线,参考电压范围是 0~4.096V,输入超过范围或 SPI 时序不对都会异常。另外 2x5 排针的模拟输入接法要对照原理图,接错通道读到的是别的引脚。解决:先用已知直流电压(比如分压后的 1V)测单通道,确认 SPI 时钟极性和相位与手册时序图一致;读数跳动大时检查地线是否共地、输入是否悬空。手册第 3.6.12 节给了 ADC 的接口说明,对着看比盲调快。
4.4 现象:VGA 图像偏移、颜色不对
原因:VGA DAC 是 8 位三路高速 DAC,行场时序参数(前沿、后沿、同步宽度)和像素时钟必须匹配分辨率;颜色不对多半是 RGB 位宽拼接顺序错了。解决:先用示例工程的分辨率参数跑通,再改;改分辨率时把行场参数一起算,不要只改一个。颜色问题对着原理图确认每个颜色通道接的是哪几位,高位低位接反在渐变图上一眼能看出来。
4.5 现象:脱机烧录后上电不启动
原因:.jic 转换时配置器件型号选错,或者烧录后拨码开关没切到 Active Serial。解决:重新用quartus_cpf按 EPCS128 转换,烧录前先擦除 EPCS,烧完确认拨码开关位置,再断电重上电验证。这一步没有后悔药,烧错型号只能擦掉重来,所以转换对话框里的器件型号我每次都会多看一眼。
5. 进阶用法:把手册当查线工具,而不是从头读到尾
这份手册真正的用法,是把它当成一本“板级字典”。我的习惯是:做新实验前,先翻到对应外设那一节,抄下三样东西——引脚归属(HPS 还是 FPGA)、电气参数(电平、位宽、速率)、时序或接口类型(SPI/I2C/并行)。然后回到 Quartus 或 Linux 侧,按这三样去配约束或写驱动。比如做 G-sensor,手册第 3.7.7 节告诉你它是 I2C 接口加中断,那就去 HPS 侧找 I2C 控制器编号和中断号,而不是在 FPGA 里造轮子;做音频,第 3.6.4 节告诉你 24 位 CODEC 和 line-in/out/mic-in,那就先确认采样率和位时钟怎么来,再动代码。
验证方法上,我一般分三层:第一层是工具链验证,跑官方最小示例,确认编译、下载、串口都通;第二层是单外设验证,一次只动一个外设,用示波器或串口打印确认行为;第三层是联调,把 HPS 和 FPGA 的交互加进来,比如 HPS 通过桥控制 FPGA 侧的 LED 和数码管。手册第 7 章的示例就是按这个层次组织的,照着走不容易乱。
还有一个具体技巧:把手册里的框图和你的原理图 PDF 并排打开,用同一个信号名做书签。DE1-SoC 的 40 pin 扩展口带二极管保护,外接模块时先确认电平和驱动能力,别直接把 5V 信号怼上去。扩展口的引脚定义在手册第 3.6.3 节,做自定义外设时这一节要反复看。
从那以后我每次拿到新的板级手册,都强制先做一张“外设归属表”再动手,不先读正文。这份 DE1-SoC 手册的价值不在于它写了多少页,而在于它把 HPS 和 FPGA 两套世界的边界画清楚了,边界清楚了,代码往哪写、坑往哪排,心里就有数。希望帮到你。
本文还有配套的精品资源,点击获取