ARTICLE DETAIL

资讯详情

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

基于EF2系列CPLD的硬件设计实战:从选型到调试要点

基于EF2系列CPLD的硬件设计实战:从选型到调试要点 搞过几块安路EF2系列CPLD的板子后我对这类“小逻辑器件”在真实项目里的定位有了挺深的体会。很多人一听CPLD就觉着是老古董觉得现在不是有FPGA嘛还有一堆国产MCU也便宜得不行干嘛还要用CPLD但真到做硬件设计时你会发现工业采集、伺服驱动、通信接口转换这些场景里EF2系列这种非易失、上电即跑、时序确定的小器件用来做逻辑粘合、IO扩展、信号桥接反而比MCU和FPGA都顺手。这篇文章我按自己的实战路径来写先聊为什么选EF2系列而不是FPGA或MCU再拆硬件设计里最容易出问题的电源、时钟、IO和下载配置电路接着走一遍从原理图到下载点灯的最小系统流程最后把调试中遇到的那些坑挨个列出来。内容主要针对硬件工程师、学生以及想快速上手CPLD的爱好者已经把EF2系列CPLD数据手册翻得差不多的朋友可以直接跳到第3节看实操。1. 选型思路为什么是EF2系列CPLD而不是FPGA或MCU1.1 CPLD和FPGA到底怎么选先解决一个最基础的问题热词里天天有人搜“CPLD和FPGA的区别”很多人把这两者混为一谈选型时只盯着逻辑规模这是不对的。CPLD和FPGA最核心的差别在于存储结构和时序特性。FPGA用的是SRAM工艺逻辑单元密集容量大适合跑复杂算法、高速接口但缺点是掉电就丢配置必须外挂配置芯片上电后还要等配置流程配置时间从几十毫秒到几百毫秒不等。CPLD用的是Flash工艺逻辑本身存储在片内Flash里上电瞬间逻辑就活了不用等配置也没有外部配置芯片的依赖。实际项目里如果只做简单逻辑粘合比如把两路UART的收发信号做电平转换和仲裁、把编码器信号做倍频分频、给几个外设做片选译码用FPGA就有点杀鸡用牛刀了BOM成本、PCB面积、调试复杂度都上去了。而MCU虽然便宜但它的IO操作是逐条指令执行的有延迟抖动做不了真正意义上的并行逻辑。EF2系列CPLD正好卡在中间有十几到几十个宏单元或等效LUT的资源IO数量不少逻辑翻转完全由硬件电路完成延迟是固定的时序上非常稳。1.2 EF2系列在系统里到底扮演什么角色你可以把EF2系列理解成一个“可编程的胶水芯片”。在一个以MCU或DSP为核心的板卡上它通常干三件事第一IO扩展和电平适配。MCU引脚不够用或者MCU的IO域电压和外部设备不匹配用CPLD把地址线、数据线、控制信号做译码扩展一块十几块钱的EF2就能解决几十路信号的处理比加一堆74系列逻辑门电路爽太多。第二接口协议桥接。比如把并口信号转成SPI把多路PWM信号做逻辑组合后送给驱动器CPLD的并行处理能力在这里是MCU替代不了的。第三复位管理和电源时序控制。上电时按顺序产生复位信号、使能信号保证MCU、ADC、运放这些器件不会因为时序错乱而锁死。选EF2系列还有一个隐藏优势是国产化和供货稳定性。在工控、电力、车载这类对供应链敏感的行业用国产CPLD替代进口器件是趋势安路在国产FPGA/CPLD里生态做得算比较全的开发软件TDTang Dynasty免费下载器也容易买到学习门槛不高。1.3 EF2系列内部架构速览做硬件设计不一定要会写很复杂的Verilog但内部架构的基本概念必须理解因为这会直接影响引脚分配和电源设计。EF2系列属于Flash型逻辑器件内部按逻辑块GLB组织每个逻辑块里有查找表、触发器和进位逻辑逻辑块之间通过可编程布线池连接。外部看它和传统CPLD的宏单元结构不太一样更像“Flash版本的FPGA”但用户感知上仍然是CPLD的体验上电即用无需配置芯片。不同容量的EF2器件逻辑块数量、IO数量、封装大小都不一样选型时除了看逻辑资源还要重点看IO bank数量。IO bank是CPLD/FPGA里电源设计的关键不同bank可以独立供电这样就能在一颗芯片上同时兼容3.3V和1.8V电平的设备。这一点在硬件设计时特别重要后面我会专门讲。2. 硬件设计核心细节拆解电源、时钟、IO、下载配置2.1 电源系统设计与去耦电容布局EF2系列CPLD的电源设计是整个硬件设计里最容易踩坑的地方但也是资料里写得最简略的地方。常见的EF2器件供电分为内核电源和IO电源IO电源可能还分多个bank。具体电压值不同型号有差异比如内核电压可能是1.2V或1.8VIO电压常见3.3V或2.5V。千万别凭经验乱接一定要查对应型号数据手册里的直流特性表上面会标清楚VCC_INT、VCC_IO的电压范围和最大电流。我自己的习惯是只要PCB空间允许每个电源引脚旁边都放一个0.1uF的陶瓷电容而且必须紧贴引脚放置过孔打在电容和芯片引脚之间确保回流路径最短。很多新手做CPLD板子出现逻辑随机错误、下载不稳定最后查来查去就是去耦电容放得太远高频噪声直接灌进电源引脚。除了0.1uF高频去耦电容芯片附近还要放一个10uF左右的钽电容或大容值陶瓷电容用来吸收电源波动。如果是工业环境建议在电源输入端加一级LC滤波或者磁珠EF2这类器件本身功耗不大但是它对电源纹波比较敏感。实测下来纹波控制在50mV以内比较安全超过100mV就可能会出现下载失败或者逻辑工作异常的偶发现象。另外要特别提醒如果板子上同时有MCU、电机驱动或者其他大电流器件CPLD的电源一定要单独走线不要和其他大电流负载共用一根细线。我遇到过一块板子CPLD和电机驱动共用一个LDO电机一启动CPLD就复位加粗线宽、单独铺铜之后问题才消失。2.2 时钟输入方案与引脚分配策略CPLD虽然不像FPGA那样对时钟特别敏感但时钟规划同样不能马虎。EF2系列支持外部时钟输入也支持内部振荡器。如果你只是做逻辑粘合对时序精度要求不高可以用内部振荡器省一颗晶振如果要处理通信协议比如生成精确的波特率时钟外部晶振更靠谱。外部晶振电路很常规一个无源晶振加两个20pF左右的负载电容或者直接用有源晶振。但有一个细节很多人忽略时钟输入引脚在EF2器件上通常有专用位置不是随便一个普通IO都能直接接晶振。综合工具里会识别时钟引脚做全局时钟网络布线。如果你把时钟信号接到普通IO上工具也能布线但时钟走线资源不是全局时钟网络信号延迟和抖动都会变差高速信号下容易出问题。所以原理图设计阶段就要查引脚分配表把晶振输出接到标有时钟功能的引脚上。引脚分配还有几个基本原则。第一高速信号、时钟信号尽量集中在一个区域不要和强干扰的PWM输出引脚靠太近。第二差分信号要成对分配利用芯片内部的差分IO资源。第三要预留测试点把JTAG信号、关键控制信号引出到测试焊盘方便调试时抓波形。2.3 IO电平标准与上下拉处理EF2系列CPLD的IO是按bank分组供电的。设计时你要先梳理清楚所有外部设备的电平MCU是3.3V传感器是5VADC是1.8V这几种电平要接进同一颗CPLD那就得把对应信号分配在不同bank并给每个bank接对应的VCC_IO电压。正常情况下IO电平直接跟随bank电源电压不需要像某些FPGA那样单独配置电平标准。这里有一个常见误区很多人以为CPLD的IO能承受5V就直接接5V信号。事实上就算IO引脚标注兼容5V输入也不代表你可以放心接。EF2系列的部分引脚可能支持5V耐压但如果不确定最稳妥的做法是用电平转换芯片或者串一个限流电阻做保护。我见过一块板子把5V直接灌进3.3V供电的CPLD引脚结果芯片内部保护二极管导通整颗芯片发热逻辑全部乱掉。上下拉电阻也是容易忽略的细节。JTAG信号里的TMS、TCK一般需要下拉TDI需要上拉这个官方手册有推荐值通常是4.7k到10k。其他没有用到的IO引脚建议在代码里设为输出低电平或者硬件上加上下拉电阻避免悬空输入导致功耗异常。特别是工业环境电磁干扰强悬空引脚会像天线一样引入噪声严重时甚至引发逻辑误触发。2.4 JTAG下载配置电路设计下载配置电路是CPLD硬件设计里最核心的调试通道电路设计有问题后面软件再强也白搭。EF2系列一般支持JTAG口下载用的就是标准四线TMS、TCK、TDI、TDO配合下载器比如常见的hw-usbn-2a这类USB转JTAG下载器就能完成烧录。原理图设计很简单就是把下载器的四根信号线连到CPLD对应引脚再加上3.3V电源和GND。但有几个要点第一下载器信号电平要和板子匹配。绝大多数下载器默认输出3.3V电平如果你的EF2器件IO供电是3.3V那就直接连如果CPLD的JTAG引脚所在bank是1.8V供电就要确认下载器是否支持电平转换或者加一个电平转换电路。电平不匹配最常见的现象就是下载器能识别到设备但是烧录时校验失败。第二TMS和TCK信号线上加下拉电阻TDI加上拉电阻。原因很简单下载器空闲时这些信号是不确定的如果悬空芯片可能误入测试模式影响正常运行。第三JTAG连接器建议选择标准的2.54mm间距排针座或者牛角座引脚定义自己定清楚就行但整个项目里保持统一别这块板子一套定义那块板子又换一套。下载器线尽量短控制在15cm以内超过20cm就可能因为信号反射导致下载失败。第四如果板子空间紧张可以只留一个4pin的测试点阵列不用安装连接器调试时用探针或者杜邦线接触测试点。但这种方式对焊接要求比较高量产板不建议这么做。3. 实操过程与核心环节实现从原理图到下载点灯3.1 最小系统模块划分按我习惯EF2系列CPLD的最小系统可以划分为五个模块电源模块、时钟模块、下载配置模块、IO接口模块、以及核心芯片本身。原理图设计时每个模块都不要穿插杂乱这样审查时一眼就能看出问题。电源模块负责把板级主电源比如5V转换成CPLD所需的各路电压。如果板子上已经有3.3V可以直接用3.3V给IO供电再通过一个LDO降压给内核供电。时钟模块就是晶振电路输出接CPLD专用时钟引脚。下载配置模块就是上一节说的JTAG接口。IO接口模块根据外设类型设计比如RS485芯片、光耦、连接器等。3.2 原理图设计的关键节点原理图设计阶段我建议先把EF2器件的电源引脚都用网络标签标清楚然后在旁边加注释写明这个电源域的电压值和供电来源。别嫌麻烦后期调试时这些注释能救命。举个例子你可能会遇到这种情况调试板子时发现某个bank的IO电平不对结果查半天发现是原理图上VCC_IO2的电源网络标号写错了和VCC_IO1连到了一起。如果当时有注释一眼就能看出来。JTAG部分我会在原理图里单独画成一个模块并标注清楚下载器的引脚定义。常见下载器hl.usb-hw-usbn-2a这种USB转JTAG接口一般是TCK、TMS、TDI、TDO、VCC、GND六根线。连接方式为TCK接CPLD的TCK引脚TMS接TMSTDI接TDITDO接TDOVCC接板子3.3VGND共地。TMS和TCK下拉4.7k电阻TDI上拉4.7k电阻。晶振电路方面如果用无源晶振建议在晶振两个引脚各接一个负载电容电容容值参考晶振手册常用20pF到33pF。负载电容太大或者太小都会导致起振困难或者频率偏差。有源晶振就简单了电源引脚加0.1uF去耦电容输出引脚直接接CPLD时钟输入不需要负载电容。我还会在每个电源网络入口处加一个LED指示灯上电时能直观看到电压是否正常。这个习惯帮我排查过不少低级问题比如某路电源没焊好、LDO接触不良都是靠指示灯第一时间发现的。3.3 PCB布局布线要点EF2系列CPLD普遍是QFP封装或BGA封装焊接难度适中PCB布局重点在去耦电容、晶振和JTAG接口这三个位置。去耦电容的布局我在前面已经强调了这里再补充一点如果用的是0402封装的0.1uF电容尽量放到芯片背面和电源引脚正对的位置这样走线最短如果PCB是单面布局那就把电容放在芯片旁边靠近电源引脚的环路要尽量小。晶振的位置要远离JTAG连接器、电源电感和其他高频信号线。晶振下方尽量不要走其他信号线防止干扰。JTAG接口放在板边方便插拔下载器但要注意JTAG信号线不要和晶振信号线平行走太长距离。电源和地平面要完整尤其是CPLD下方尽量保持完整地平面不要为了走线把地平面切割得支离破碎。如果不得不在芯片下方走线优先走低速IO信号不要走时钟和高速信号。3.4 软件下载流程与一个最简单的Verilog点灯示例硬件板子回来后先用万用表测量各电源对地阻抗确认没有短路再上电。然后打开安路官方开发软件TDTang Dynasty新建工程选择对应的EF2器件型号新建一个Verilog源文件。下面是我每次验证板卡时常用的点灯代码module led_test ( input wire clk_in, output wire led_out ); reg [23:0] cnt; always (posedge clk_in) begin if (cnt 24d12_000_000) begin cnt 24d0; led_out ~led_out; end else begin cnt cnt 1b1; end end initial begin cnt 24d0; led_out 1b0; end endmodule这段代码的含义是用24MHz外部晶振作为输入时钟内部计数器累加计数到12000000时翻转一次LED所以LED大约每0.5秒翻转一次肉眼就能看到闪烁。如果你的板子晶振频率不是24MHz把分频系数改一下就行。写完代码后在TD软件里添加引脚约束文件一般叫FDC文件或SDC文件把clk_in分配到实际的时钟引脚把led_out分配到LED所在的IO引脚。分配方法可以直接在图形界面里选择引脚也可以手写约束文件。手写约束的格式大致是set_pin_assignment {clk_in} {LOCATION P14;} set_pin_assignment {led_out} {LOCATION P32;}注意具体的引脚编号要参考你所用封装的数据手册。约束完成后依次点击综合、布局布线、生成下载文件然后打开下载工具连接下载器选择器件型号点击识别。识别成功后选择烧录Flash模式这样逻辑会写入片内Flash掉电不丢失。实测中hw-usbn-2a这种下载器在TD软件里使用比较顺手第一次连接时可能提示安装驱动耐心等驱动装好重新拔插下载器就能识别。如果识别不到器件先不要怀疑下载器坏了排查顺序是板子供电是否正常JTAG接线是否交叉TMS和TCK是否有正常的信号电平。4. 常见问题与排查技巧实录4.1 JTAG识别不到器件这是新手最常遇到的问题。现象是下载软件打开后点击“设备扫描”一直提示没有找到目标器件。排查思路按优先级排序第一检查板子供电。用万用表量CPLD电源引脚的电压确认电压值和数据手册一致。曾遇到过一个案例LDO的使能引脚没接导致根本没有输出电压下载器当然找不到设备。第二检查JTAG连接顺序。TMS、TCK、TDI、TDO两组最容易错的是TDI和TDO接反或者TMS和TCK接反。第三检查JTAG信号有没有被其他外设占用。如果CPLD和MCU共用JTAG链要确保链上没有断开或短路。第四检查TMS/TCK上下拉。如果这两个信号悬空下载器有时能识别但非常不稳定表现为十次里能识别两三次。加上下拉电阻后一般就好了。第五如果前面都正常还是找不到尝试降低下载时钟频率。有些下载器默认JTAG时钟偏高板上信号线长或者负载电容大时信号边沿变形降低速率就能稳定识别。4.2 逻辑不工作但下载显示成功下载成功的提示只能说明程序烧进去了不代表逻辑功能一定正确。如果板卡上电后逻辑没有反应先查时钟。用示波器测量晶振引脚看是否有正常波形。很多时候晶振没起振代码里的时钟计数器永远不跳逻辑自然不会工作。时钟正常的话再查复位逻辑。如果代码里用了外部复位引脚而这个引脚悬空或者处于复位电平芯片就会一直被复位逻辑不执行。这种问题在调试中非常常见所以我在原理图上习惯把复位引脚接一个10k上拉到高电平如果确实需要手动复位再接一个按键按下接地。还要检查引脚约束文件是否写错。有一次我把led_out约束在了一个没有引出的引脚上代码编译下载都正常但板子上LED自然不亮。后来把所有用到信号的IO都走了一遍实物连接图才发现约束错误。建议初学者用TD软件自带的引脚图界面去核对比直接看文字约束文件直观得多。4.3 电源纹波导致的偶发故障CPLD偶发故障排查起来要比持续故障难得多因为现象不固定。表现为板子工作几小时出现一次逻辑错误或者下载时经常要求多试几次才能成功。这种“幽灵问题”最常见的元凶就是电源纹波。排查方法很简单用示波器交流耦合量CPLD电源引脚看纹波峰值。如果纹波超过100mV就要优化。优化手段包括加大容量电容、加磁珠滤波、调整LDO输出电容。我遇到最极端的一次纹波是200mV原因是LDO的输出电容ESR太高换成低ESR的陶瓷电容后纹波降到30mV以下问题彻底消失。4.4 掉电后程序丢失EF2系列CPLD本身是Flash工艺程序烧进内部Flash后掉电不丢。如果发现掉电后逻辑功能消失大概率是烧录时选择了RAM配置模式而不是Flash模式。下载工具里通常有两种目标一种是直接配置到SRAM掉电丢失适合调试时快速验证逻辑另一种是烧录到内部Flash掉电保留适合正式发布。量产时一定要选Flash模式。另外注意有些EF2型号区分配置芯片和内部Flash下载时烧录对象选错也会掉电丢失。建议每次烧录完成后断电再重新上电验证逻辑是否还在避免批量烧录后才发现问题。4.5 常见问题速查表现象可能原因排查方法解决方案JTAG识别不到设备板子供电异常万用表测电源引脚修复LDO或电源网络JTAG识别不到设备TDI/TDO接反核对JTAG接线顺序交换TDI/TDO接线JTAG识别不稳定TMS/TCK悬空示波器观察信号加4.7k下拉电阻下载成功但逻辑不运行晶振未起振示波器测晶振波形更换晶振或调整负载电容下载成功但逻辑不运行引脚约束错误核对FDC文件和实物连接修正引脚约束掉电后程序丢失烧录到了RAM查看下载器烧录模式选择Flash烧录模式偶发逻辑错误电源纹波过大交流耦合测纹波优化去耦和滤波电路IO电平不匹配Bank电压不对测量各Bank供电电压按手册调整VCC_IO5. 调试过程中的几条实战心得最后分享几个调试EF2系列CPLD时的个人心得算是这些年积累下来的土办法。第一下载器线材不要贪长。很多人为了图方便自己做了一根30cm甚至50cm的下载线结果发现下载器要么识别不了要么下载到一半报错。JTAG信号本身是标准的但线材一长寄生电容和信号反射就上来。我一般控制在15cm以内最长不超过20cm。第二原理图和PCB里JTAG接口一定要标注清楚引脚方向。板子做回来穿杜邦线时很容易插反如果连接器旁边印了丝印就没这个问题。我还见过有同事把JTAG连接器引脚定义画反了板上TMS和TDO实际是反的害得调试组花了一下午排错。第三调试时不要一上来就乱试先把电源、时钟、下载通道这三样确认好。我的标准动作是先测电源对地阻抗再上电测各路电压然后示波器看晶振起振最后才接下载器识别设备。这三板斧走完80%的问题都能定位到具体方向。第四尽量避免频繁带电插拔下载器。虽然下载器一般做过热插拔保护但目标板上的JTAG引脚未必扛得住。我有一次带电插拔时TDO引脚被静电打坏芯片直接报废。养成习惯插下载器前断电或者确保下载器先接地再接信号。第五多准备几颗同一型号的芯片做备用。调试过程中焊坏、烧坏、静电打坏都是家常便饭。CPLD不像MCU那样有很多软件保护引脚直接裸露在外部一不小心就出问题。有备件在手调试心态会稳很多。EF2系列CPLD是个很实用的器件硬件设计的关键点其实就那么几个电源要干净时钟要稳定JTAG通道要可靠IO电平要匹配。把这些基础工作做扎实后面逻辑开发就能省下大量时间。这块板子目前已经跑了几千小时稳定性和温升表现都达到了设计预期。如果你正在做类似的设计希望这篇文章能帮你少走一些弯路。
返回列表