ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

手把手教你设计FPGA最小系统:基于EP4CE6从原理图到调试

手把手教你设计FPGA最小系统:基于EP4CE6从原理图到调试 很多朋友第一次接触FPGA都是从买一块现成开发板开始的。板子拿回家下载线插上第一个LED灯点亮的那一刻确实很有成就感。不过用了一段时间之后我逐渐意识到一个问题开发板把一切都做好了时钟电路、电源、配置电路都是现成的我只需要写逻辑完全不需要关心硬件是怎么搭起来的。直到有一次我把一个串口例程往自己做的小板子上迁移才发现自己连“时钟信号走哪根引脚”都说不清楚。所以我很建议每一个想做FPGA开发的人自己动手画一块真正意义上的“最小系统”。不需要多复杂一颗EP4CE6加电源、晶振、JTAG下载口就能把FPGA跑起来。EP4CE6是Altera现在叫Intel FPGACyclone IV E系列的入门级芯片逻辑资源6000多个还带PLL和硬件乘法器绝大多数入门实验和一部分简单项目都够用。这篇就以EP4CE6为例把最小系统从整体设计思路、原理图要点到PCB布局和调试排查的完整过程给大家盘一遍。1. 为什么要自己画FPGA最小系统1.1 EP4CE6这颗芯片的“家底”EP4CE6最常见的型号是EP4CE6E22C8N其中E22代表144引脚的EQFP封装C8表示速度等级为8N代表无铅工艺。这颗芯片的逻辑单元数量是6272个内嵌约276Kbit的RAM、15个18×18硬件乘法器、2个通用PLL以144脚封装为例可用用户IO大约在91个左右。这些数字放在今天的FPGA市场里不算高但做入门学习、小规模控制、接口转换、甚至部分图像预处理都已经够用了。入门FPGA选择EP4CE6最现实的原因是文档多、例程多、工具链成熟。Quartus Prime Lite版本可以免费使用代码和约束只要写成通用的Verilog以后换到Cyclone IV系列其他芯片几乎不用改。对一个想学硬件电路设计的人来说它比高端芯片更适合作为第一块自己设计的板子因为引脚不多、电源简单即使画错也容易排查。如果一上来就选几百个引脚的芯片光是搞清楚电源分组就够折腾一阵。1.2 开发板与自研板怎么选我见过不少朋友一上来就买一百多块的Cyclone IV开发板。开发板当然能用而且省时间。但如果目标是“吃透FPGA是怎么跑起来的”只用成品板会留下一个明显的黑盒电源怎么来的、配置芯片为什么非烧不可、JTAG为什么插上就能下载这些问题都不会进入你的意识。直到某天你需要给产品做一个定制底板或者想精简板卡成本才发现自己对最小系统并没有完整认知。自己设计EP4CE6最小系统的价值分两层。第一层是硬件设计本身你会理解每一路电源干什么用、为什么去耦电容要靠近引脚、JTAG为什么需要上拉电阻。第二层更值钱当最小系统跑起来之后你再写FPGA逻辑心里是有“电路底”的遇到时序、复位、配置这类问题时排查方向会清晰很多。所以我的建议是如果你已经用开发板跑过几个简单实验恰好又有一点点画原理图和PCB的基础完全值得做一块自己的最小系统。2. 最小系统的架构与供电方案2.1 最小系统包含哪些模块FPGA最小系统的“最小”有明确边界。它不需要外挂DDR、不需要以太网PHY甚至不需要按键和LED但以下五样东西缺一不可电源电路、时钟源、配置与下载电路、复位电路、以及把可用IO引出来的排针。其中电源、时钟、配置是FPGA能不能正常上电工作的前提复位和IO引出则是方便验证逻辑的标配。把话说得更具体一点电源电路要为芯片提供多组电压时钟源给FPGA一个稳定的参考时钟配置电路解决“断电后程序不丢”的问题复位电路帮你把用户逻辑初始化到已知状态IO引出排针则是唯一能让你观察和测试信号的手段。很多刚接触FPGA的人会把配置和烧录混为一谈其实下载到RAM和固化到配置芯片是两件事后面会单独细说。理解了这几个模块的职责你去看任何一张FPGA开发板的原理图都能快速抓到核心。2.2 电源树设计与电压轨规划EP4CE6需要三路核心电压。VCCINT为1.2V给内部逻辑阵列供电VCCA为2.5V给PLL模拟电路供电VCCIO根据IO bank用途可选1.5V、1.8V、2.5V、3.3V最小系统统一设置为3.3V最简单。设计时不要只改原理图还要看Quartus工程里的Device and Pin Options实际IO标准要和供电一致否则编译时的约束检查会报错。这个错在仿真阶段看不出来但下载到板上之后IO电平不匹配会影响通信可靠性。供电方案最常见的做法是5V USB取电然后做三级转换5V降到3.3V再用3.3V分别降到2.5V和1.2V。EP4CE6核心电流一般只有几百毫安量级普通LDO完全撑得住。AMS1117系列的AMS1117-3.3、AMS1117-2.5、AMS1117-1.2就是非常典型的方案。LDO的好处是电路简单、纹波小缺点是输入输出压差大时发热明显。5V转3.3V压差1.7VAMS1117轻松应付如果以后把输入换成12V就必须先加一级DC-DC否则功耗会全部烧在LDO上。做功耗估算时可以简单算一下假设FPGA逻辑占用一半资源跑100MHzVCCINT电流大约在150到250mA之间。以200mA计算3.3V转1.2V时LDO压差2.1V热功耗约0.42W对SOT-223封装来说温升在可接受范围但PCB上要给足散热铜皮。如果电流跑到300mA以上LDO表面就会明显发烫这时要仔细评估散热设计或者换DC-DC方案。开发板对功耗的容忍度很高自研板则要养成“先算后画”的习惯。2.3 上电顺序需要注意什么Cyclone IV E在数据手册里对电源上电顺序没有像高端FPGA那样强制到“哪个必须先到”的程度但工程上仍推荐一个安全次序VCCINT先上电VCCA随后VCCIO最后。这样做的原因是IO电源晚于核心电源时FPGA内部的IO缓冲器在配置完成前不会提前进入不确定状态外部接口不容易出现上电瞬间的毛刺。如果只是用LDO线性电源多路电压的上电时序基本由输入电源的上升状态决定无法严格保证。应对办法是在VCCIO路径上加一个简单延迟比如串联一个小阻值电阻配合去耦电容让VCCIO稍微晚于VCCINT稳定。实际调板时用示波器看三路电压的爬升曲线只要没有出现VCCIO明显早于VCCINT的情况通常问题不大。这一条不要过度设计先把电源纹波和地回路做干净比纠结几毫秒的上电顺序更实际。3. 核心电路设计时钟、配置与下载3.1 时钟源电路设计FPGA需要独立的参考时钟不能像单片机那样靠内部RC凑合。EP4CE6最小系统选一个50MHz有源晶振是标准做法。有源晶振内部已经把振荡电路做好了输出是满幅方波不必像无源晶振那样配负载电容起振外部只需要在电源引脚旁放一个0.1uF去耦电容。选择50MHz而不是其他频率主要是方便用PLL倍频到100MHz、150MHz各个频率都是从常用整数倍关系来的写时序约束也更直观。有源晶振通常是4脚封装VCC接3.3VGND接地OUT接FPGA专用时钟引脚。部分晶振有EN引脚如果存在一般直接接VCC或悬空。FPGA端建议接到全局时钟输入比如CLK引脚这样时钟就能通过内部全局网络送到所有逻辑单元。晶振输出到FPGA的走线要短不要在中间打过孔如果必须串电阻串20到33欧即可。晶振布局要避开电感和大电流电源走线最好贴着FPGA时钟引脚放中间不要有其他高噪声信号。3.2 JTAG下载与AS配置链路EP4CE6支持JTAG和AS两种主要的配置方式。JTAG用于调试直接把SRAM对象文件下载到FPGA内部速度快适合反复修改代码AS模式通过EPCS配置芯片在断电后自动加载程序相当于FPGA的“硬盘”。日常开发时两种方式配合使用用JTAG调逻辑调稳定后再通过AS模式固化。JTAG接口我是这样连的TCK、TMS、TDI、TDO四根信号引到一个10pin 2.54mm排针上按Altera标准排列。TCK建议加一个10k下拉TMS和TDI各加10k上拉到3.3VTDO不需要上拉。很多新手画板时以为JTAG只要把四根信号线连上就行其实上拉电阻非常关键。缺了上拉USB-Blaster经常出现“能识别到器件但下载几十秒就报错”这类奇怪问题而且这种问题特别难查。下载口的VCC引脚也要接上下载器的电平检测靠这个引脚判断目标板电压接错或悬空会直接提示电源错误。AS配置链路需要一颗EPCS4配置芯片通过五根信号与FPGA连接DATA0、DCLK、nCSO、ASDO以及GND。EPCS4的电源接3.3V旁边的去耦电容不要省。配置芯片要放在FPGA附近DCLK和数据线的走线尽量短两芯片之间的连线如果拉得太长或并行走线太近很容易出现配置偶尔失败的问题。EPCS4容量4Mbit放一个中等规模工程绰绰有余如果以后工程包含软核或者大缓存可以换成EPCS16。3.3 MSEL引脚与状态引脚的细节MSEL[2:0]这三个引脚决定了FPGA在上电后用哪种配置模式读取数据。EP4CE6如果要用AS模式MSEL[2:0]需要配置为010。实际画板时我用10k电阻把这三位分别固定在低、高、低电平不做跳线选择因为最小系统的使用场景已经固定。如果以后想切换PS模式调试可以预留三个0欧电阻位改起来方便。注意MSEL引脚的设置必须在配置前有效不要在PCB上直接悬空否则上电配置状态可能不稳定。nCONFIG、CONF_DONE、nSTATUS是三个不能画错的配置状态引脚。nCONFIG是配置控制输入需要上拉到3.3V并串联一个按键到地按下时FPGA重新启动配置流程。CONF_DONE和nSTATUS都是开漏输出引脚必须各接10k上拉电阻到3.3V否则配置完成后CONF_DONE拉不高Quartus会一直报配置失败。单芯片设计时nCE接地nCEO可以直接接地。这些细节点我画第一块板时全都踩过不检查一遍上电必出问题。3.4 复位电路与最小指示复位电路有两种画法。第一种是纯复位按键10k电阻上拉到3.3V按键另一端接地信号直接进FPGA的普通IO。第二种是在按键基础上加一个0.1uF电容构成RC延时按键按下到电平稳定大约有几百微秒到1毫秒的延迟。对FPGA来说配置完成前用户逻辑还没运行外部复位只影响配置完成后逻辑的初始状态所以RC延时不是必须的但加上也没坏处还能顺便滤掉按键抖动。我建议在最小系统上至少放一个用户LED和复位按键。LED接FPGA普通IO串联330欧电阻到地配置完成且逻辑正常时能亮起来。复位按键在调试中非常有用因为经常需要让逻辑回到初始状态而不是重新下载一遍程序。LED和按键都不用太靠近芯片放在板子边缘反而好操作只要走线顺就行。这个习惯在后来的项目和产品调试中都帮了大忙。4. PCB布局与布线要点4.1 两层板还是四层板EP4CE6最小系统用两层板也能做出来但对布局布线要求很高。因为VCCINT、VCCA、VCCIO三组电源都在同一层几乎不可能给每组完整的电源平面只能靠加宽走线和大面积覆铜来弥补。另一个问题是地平面不连续FPGA引脚密度高过孔布局不好容易出现地弹和噪声倒灌。如果你只有两层板建议把TOP层全部做地平面BOTTOM层走信号和电源效果会好一些。我的建议是除非已经有足够PCB经验否则直接做四层板。四层板成本比两层板高不了多少但信号、电源、地三层分开电源完整性和信号质量都会明显改善。层叠顺序推荐顶层信号、第二层GND、第三层电源、底层信号。第二层做完整地平面第三层做电源分割VCCINT和VCCIO用大面积铺铜VCCA因为电流小可以走窄一些的铜皮。这样既好布线又兼顾噪声隔离。EP4CE6这种引脚不算多的芯片四层板布线压力其实很低。4.2 布局顺序与关键器件摆放布局顺序直接决定后面布线的痛苦程度。我的习惯是先放FPGA再放晶振然后配置芯片接着电源最后才是接插件、按键和LED。FPGA放在板子中心偏上晶振贴紧FPGA的时钟引脚方向配置芯片放在FPGA另一侧靠近JTAG下载口的方向。电源部分最好集中在板边的一个区域LDO的散热路径要留够不要把三颗LDO排得太密。接插件摆放也值得多想一步JTAG下载口放在板子边缘方便插下载线10pin排针的方向和丝印要在PCB上标清楚。IO排针按bank分组一个bank的IO尽量聚在一起这样外接逻辑分析仪或接传感器模块时不用绕线。复位按键和LED放板边不要太靠近电源和晶振避免干扰。布局时多用3D预览看一遍想象一下插上下载线和排针后是否方便操作。有时候原理图看着合理实际布局出来下载口被排针挡住插拔还需要把板子翻过来这种体验上的小细节也属于硬件设计的一部分。4.3 布线过程中的几个关键细节布局和布线是两个容易被混淆的概念。布局决定元件的相对位置布线是在这个位置上把铜走线连好。很多新手布线不顺实际是布局不合理造成的比如晶振放在了板子两个对角时钟线必然绕长路这时候再怎么精心布线也救不回来。先花半小时调布局能让后续布线时间节省数小时这个投入非常值得。电源布线时每路LDO输出先接一个10uF以上的大容量电容再分发给各负载点。到FPGA每个电源引脚时再就近放0.1uF小电容。这条“大电容→长走线→小电容→引脚”的顺序不要颠倒。VCCA引脚附近建议加磁珠和0.1uF、0.01uF两级滤波如果板上正好有模拟信号或传感器电路这个位置的价值会体现得很明显。去耦电容的接地过孔要紧靠电容焊盘不要让地电流绕长路回到主地平面。时钟信号、DCLK、DATA0这些高速或敏感的线尽量走短、走直。不要和GPIO长线并行走不要跨越电源分割区。FPGA的IO扇出采用“扇出再走线”的方式从引脚出来先打一个过孔到对应层再在平面上跑线会比在表层硬绕更干净。布线顺序建议先时钟和高频信号再电源最后才是普通IO。最后所有未用的电源引脚不要悬空按手册要求统一接对应电源或地。5. 硬件调试流程与问题排查5.1 从上电到下载的完整调试路径新板子到手不要贸然接下载线。我先做静态检查目测焊接质量用万用表蜂鸣档测3.3V和GND之间有没有短路再测1.2V和GND之间有没有短路。如果上电前测出短路多半是电源引脚焊桥或者错误铺铜排查成本远小于上电后烧芯片的成本。把可能短路的点都排除干净再进入上电测试环节。确认没短路后接5V电源依次测量3.3V、2.5V、1.2V是否正确用示波器看有没有明显纹波。三路电压都正常后测晶振输出引脚50MHz方波应该清晰可见。如果频率不对或幅度很低检查晶振供电和焊接。最后插上USB-Blaster在Quartus里打开Hardware Setup应该能看到识别出的器件。选一个最简单的LED灯工程下载能成功说明最小系统整体链路是通的。第一次上电成功的感觉比看任何教程都有说服力。5.2 常见问题速查表现象可能原因检查方法与对策下载时识别不到器件JTAG的TMS或TDI缺少上拉下载口VCC没接nCONFIG被拉低万用表测TCK、TMS、TDI电平检查VCC脚电压确认nCONFIG是否为3.3V提示配置失败CONF_DONE一直低CONF_DONE或nSTATUS没加上拉焊盘虚焊测CONF_DONE上拉后电平检查10k电阻焊接AS模式上电后程序不加载MSEL不是010EPCS4引脚接错配置芯片供电不稳测MSEL电平检查DATA0、DCLK、nCSO、ASDO网络1.2V电压偏低或LDO发热严重去耦电容短路线路存在桥接LDO压差过大断开负载测空载电压逐段断开排查短路点时钟波形毛刺或幅度低晶振离FPGA太远去耦不足走线受到干扰检查走线长度靠近引脚补0.1uF电容5.3 几个容易被忽视的硬件坑最小系统调试中最常被忽视的是三件事。第一IO引脚的默认状态。EP4CE6上电配置完成前未配置的IO是三态高阻但配置完成后如果不写约束内部逻辑会把悬空输入当成高电平导致LED莫名点亮或模块误动作。想加默认下拉电阻在PCB上是硬件层面最省事的兜底方案。第二JTAG下载口的VCC脚必须接到FPGA的VCCIO。下载器要靠这个电平判断目标板的IO电压如果VCC脚悬空USB-Blaster会显示未连接却不会给明确提示。第三EPCS4芯片在JTAG模式下可以通过间接编程方式烧写但前提是FPGA自身能被JTAG识别。如果EPCS4坏了导致FPGA配置失败优先确认EPCS4供电和接线再怀疑FPGA本身。6. 一些实际操作后的体会与扩展方向6.1 最小系统的“最少”与“最合适”做完第一版EP4CE6最小系统后你会发现“最小系统”这三个字其实有弹性。严格意义上的最小系统只要电源、时钟和配置就能跑但真正好用的小系统还要考虑调试便利性、扩展能力和外部接口的兼容性。比如后来我给自己的最小系统加了SDRAM接口接口逻辑花了两三天才调通但调通之后对时序约束和引脚分配的理解深度是单纯写代码完全比不了的。很多学FPGA的人是从代码起步的硬件底子相对薄弱。自己画一块最小系统恰好能把“代码层”和“电路层”串起来你在RTL里写一个时钟分频能看到晶振输出的实际波形你在约束里分配一个引脚能摸到对应排针哪个孔。这种连接一旦建立起来后面再做复杂设计会少很多困惑。6.2 后续扩展的几个方向基于EP4CE6最小系统扩展方向很多。加一个ADC芯片和SPI接口可以做简易示波器加RGB屏接口和FIFO缓存可以做图像采集显示加以太网PHY并移植三速MAC可以把串口通信升级成网络通信。像UART接收、SPI读ADC这些入门实战也都能直接在这个板子上跑。如果想把FPGA和MCU结合起来开发就在最小系统上预留一组IO再外接一块STM32最小系统两边通过UART或SPI通信开发自由度就非常大了。这些扩展都能复用现有电源、配置和时钟相当于以最小系统为“母板”不断加模块。6.3 最后分享一个小小的实用习惯最后说一个我在画原理图时反复用到的技巧把EP4CE6的所有电源引脚和地引脚先在原理图里批量填好网络标号再去连线。FPGA芯片几十个电源引脚如果一个个找网络名去手动连接很容易漏掉某一个。把所有同名电源引脚设置成同一个网络后可以快速核对有没有遗漏最后再用DRC检查电源网络是否全部连通。这个习惯帮我避免过至少两次芯片某个引脚悬空的低级错误。画板子这种事很多时候拼的并不是多高深的理论而是这种前期不嫌麻烦的执行力。你把这套做法用在自己第一块EP4CE6最小系统上后面会省掉很多排错的时间。
返回列表