DE1-SoC开发实战:从Qsys构建到Linux应用的全流程解析(de1教程2.2节)

张开发
2026/6/18 10:54:03 15 分钟阅读
DE1-SoC开发实战:从Qsys构建到Linux应用的全流程解析(de1教程2.2节)
1. DE1-SoC开发环境搭建搞DE1-SoC开发首先得把工具链配齐。我当年第一次接触这块板子时光装软件就折腾了两天。现在把最稳的配置方案分享给你能少走不少弯路。硬件设计三件套缺一不可Quartus Prime 17.1这是Intel当时还叫Altera的FPGA开发主战场建议装标准版。注意安装时要勾选Devices里的Cyclone V系列否则找不到DE1-SoC对应的5CSEMA5F31C6芯片Platform Designer其实就是Qsys的新马甲已经集成在Quartus里。用它搭建硬件系统就像玩积木后面会详细演示怎么拼接HPS和FPGA组件Modelsim仿真调试神器建议装ASE版本。遇到过不少时序问题都是靠它抓出来的软件部分更需要讲究版本匹配SoC EDS v17.1这个套件相当于给HPS开发准备的瑞士军刀里面藏着几个关键工具BSP Editor生成Preloader的图形化工具Device Tree Generator自动生成设备树的命令行工具DS-5ARM架构的IDE开发环境不过我更习惯用VSCode交叉编译链putty建议用0.74版本串口通信最稳定。记得把波特率设为115200DE1-SoC的UART默认就是这个速率装完所有软件后建议先跑一遍GHRDGolden Hardware Reference Design示例。这是Intel提供的参考工程位置在quartus\examples\DE1-SoC目录下。我习惯先烧录这个工程的sof文件验证硬件通路是否正常能点亮板载LED就说明基础环境没问题。2. Qsys硬件系统构建实战2.1 黄金工程魔改指南GHRD工程就像个毛坯房我们要根据需求做个性化装修。打开Platform Designer后重点看这三个区域HPS组件双击进入配置界面要特别注意在FPGA Interfaces里勾选需要透传到FPGA的总线比如AXI BridgeSDRAM选项卡中保持hps_0的时钟设置与板载DDR3一致400MHzPeripheral Pins里启用UART0和HPS计时器自定义IP添加以PIO控制器为例控制LED的基础IP# 在Qsys TCL控制台快速添加IP add_instance led_pio altera_avalon_pio 17.1 set_instance_parameter_value led_pio {direction} {Output} set_instance_parameter_value led_pio {width} {4} # 对应4个LED添加后记得做地址分配建议用自动分配功能然后手动检查是否有冲突。中断优先级配置如果有多个中断源在IRQ标签页调整优先级数值。数值越小优先级越高关键外设如DMA建议设为0-3。2.2 硬件生成关键步骤生成系统时容易踩的坑导出前务必点击Generate HDL否则后续步骤会报错遇到Error: Generation failed时先检查时钟域交叉是否合理。我遇到过HPS和FPGA时钟不同源导致的死锁问题生成的system_top.sv文件需要手动集成到Quartus工程。有个偷懒技巧直接替换GHRD工程里的同名文件全编译时建议开启并行编译quartus_sh --flow compile system_top -c system_top --parallel8编译成功后得到的sof文件可以用Quartus Programmer通过USB Blaster烧录。第一次烧录建议勾选Verify选项避免因接触不良导致烧录失败。3. 软件栈构建全流程3.1 Preloader生成技巧Preloader相当于ARM版的BIOS用BSP Editor生成时要注意先设置工作目录为Qsys生成的hps_isw_handoff文件夹在Boot Settings里勾选Enable SDMMC bootDE1-SoC默认从SD卡启动SD/MMC Instance选择hps_0_sdmmcMemory Settings中Main Memory设为1GiB保持ECC Enabled关闭除非板子换了带ECC的DDR生成bsp后用这条命令编译make -C $SOCEDS_DEST_ROOT/embedded/command/bsp/altera-hps -f Makefile.embedded clean all生成的preloader-mkpimage.bin需要转换成img格式mkpimage -o preloader.img --hv0 --rev0x0a preloader-mkpimage.bin3.2 设备树自动化生成新版SoC EDS提供了更智能的设备树生成方式# 先进入handoff目录 cd hps_isw_handoff # 生成基础dts sopc2dts --input soc_system.sopcinfo --output soc_system.dts --type dts --board soc_system_board_info.xml # 添加FPGA外设描述比如LED echo leds { compatible altr,pio-1.0; status okay; } soc_system.dts # 编译dtb dtc -I dts -O dtb -o soc_system.dtb soc_system.dts遇到Unsupported interrupt type警告时通常是Qsys里中断类型设置不对需要回Platform Designer检查IP的中断配置。4. Linux应用开发实战4.1 交叉编译环境配置推荐用Linaro GCC工具链wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz tar xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz export CCpwd/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc写个最简单的LED测试程序led_test.c#include stdio.h #include stdlib.h #include fcntl.h #include unistd.h #include sys/mman.h #define LED_BASE 0xFF200000 // 对应Qsys中分配的地址 int main() { int fd open(/dev/mem, O_RDWR); void* leds mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, LED_BASE); *(volatile unsigned int *)(leds) 0x0F; // 点亮所有LED sleep(1); *(volatile unsigned int *)(leds) 0x00; // 关闭所有LED munmap(leds, 4096); close(fd); return 0; }编译时记得加静态链接$CC -static -o led_test led_test.c4.2 系统部署与调试制作可启动SD卡的分区方案/dev/sdc1 (FAT32, 64MB) - 存放u-boot.img、soc_system.dtb /dev/sdc2 (ext4, 剩余空间) - 根文件系统用dd命令烧写镜像sudo dd ifpreloader.img of/dev/sdc bs64k seek0 sudo dd ifu-boot.img of/dev/sdc bs64k seek4遇到启动卡在Starting kernel ...时八成是设备树地址不对。在u-boot命令行里用setenv fdtaddr 0x00000100调整后再试。最后把编译好的LED测试程序传到开发板scp led_test root192.168.1.100:/home/root执行后如果看到LED闪烁恭喜你完成了完整的HPSFPGA协同开发流程

更多文章