ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

EP4CE6 FPGA最小系统设计全攻略:电源时钟配置与PCB避坑指南

EP4CE6 FPGA最小系统设计全攻略:电源时钟配置与PCB避坑指南 开头FPGA最小系统是玩FPGA绕不过去的一道坎。EP4CE6这颗芯片在Altera现在叫IntelCyclone IV系列里属于出货量极大的入门型号6K逻辑单元、270个可用IO价格亲民资源对入门到中阶项目都够用。很多人的第一块FPGA开发板、第一个图像采集系统、第一套串口收发逻辑都是跑在EP4CE6上的。我这篇文章想聊的不只是一张能跑的原理图而是把EP4CE6最小系统做成一块稳定可用的板子需要考虑的完整链路电源怎么给、时钟怎么配、配置电路怎么做、PCB怎么布以及调试时最常踩的坑。适合正在画自己第一块FPGA板子的同学参考也适合被“下载不进去、逻辑不跑、电源乱叫”折磨过的朋友对照自查。1. 先把需求和芯片定位说清楚EP4CE6到底能干什么1.1 一片EP4CE6覆盖的典型场景EP4CE6E22C8N144脚EQFP封装C8表示速度等级是8也就是中等速度等级TQFP封装焊接友好手工贴片完全没有压力。相比BGA封装这让EP4CE6成了DIY和原型验证的绝佳选择——你不需要热风枪吹BGA一把烙铁就能搞定。资源上EP4CE6有6272个逻辑单元LE约276Kbit的嵌入式RAMM9K66个硬件乘法器9bit x 9bit。这些数字看起来很抽象我换个说法一个简单的串口收发器、一组PWM发生器、一个VGA时序控制器、一个简易逻辑分析仪这种级别的逻辑占资源大概只有10%到20%。如果你要做DDR接口、跑软核CPU、做复杂图像处理EP4CE6会比较吃力那是EP4CE15、EP4CE30甚至更高规格芯片的活了。所以这块最小系统的定位很清晰它是你验证逻辑、学习FPGA内部结构、做中小规模数字系统的起点。它可以挂几个传感器、跑几路串口、配合外部ADC/DAC做信号采集和产生甚至可以接一个简单的摄像头传感器做初步的图像采集实验。它的IO电压支持3.3V和2.5V常见的外设接口都能直接对接兼容性很好。1.2 最小系统应该包含哪些功能模块做最小系统之前先搞清楚“必备”和“选配”的边界否则很容易把板子画得过于复杂调试时无从下手。核心必备项电源电路EP4CE6需要至少两个电压轨——VCCINT内核电压1.2V和VCCIOIO电压通常3.3V如果用到PLL还需要VCC_PLL2.5V。部分情况下VCC_PLL可以和VCCINT共用一个1.2V但为了稳定性和灵活性建议单独拉一路2.5V。时钟电路一个晶振频率根据你的应用需求选最常见的是50MHz也可以用27MHz、24MHz甚至用几十MHz的有源晶振。配置电路JTAG接口用于调试下载AS接口配合EPCS4/EPCS16配置芯片用于上电自动加载程序。复位电路一个按键复位加上RC延时或者用专门的复位芯片。去耦电容网络每个电源引脚旁边至少一个0.1uF电容这是保证芯片稳定工作的底线。选配项LED指示灯、拨码开关、扩展排针、USB转串口、外置ADC/DAC、Flash/SRAM扩展、按键矩阵等等。选配项不用一次画全优先保证核心系统稳定再逐步扩展。2. 电源与时钟最小系统的“心”和“脉”2.1 多电压轨设计1.2V、2.5V、3.3V怎么给EP4CE6的电源要求并不苛刻但有几个细节不能忽略。首先是电压轨VCCINT1.2V给FPGA内部逻辑供电这是最大的一个电流消耗点。VCC_PLLCyclone IV的PLL供电有讲究EP4CE6要求2.5V甚至3.3V取决于具体型号和建议数据手册里明确标注了VCC_PLL的推荐值我用的方案是单独2.5V从3.3V降压而来和内核电源分开避免PLL噪声耦合到核心逻辑。VCCIOIO电压我通常直接给3.3V。VCCIO的电压决定了IO口的信号电平标准这个电压必须和外部器件电平匹配。供电方案上两种主流做法一是用低压差线性稳压器LDO比如AMS1117系列1117-1.2给内核、1117-2.5给PLL、1117-3.3给IO简单可靠成本极低。缺点是效率低如果内核电流超过500mA1117会发热明显。二是用DC-DC降压模块比如MP1584、TPS5430等效率高但纹波控制比LDO要费心一些布局不好容易引入噪声反而影响FPGA稳定性。我的建议如果只是最小系统内部逻辑使用不复杂用LDO方案就够了。EP4CE6的内核电流在典型逻辑密度下大约200mA到400mA1117-1.2可以应付只是要注意在PCB上给LDO留足够的铺铜散热。如果后续要跑大逻辑、高频率再升级成DC-DC也不迟。注意上电顺序Cyclone IV要求VCCINT上电先于VCCIO或者同时上电一般数据手册里叫power-up sequence。实际很多板子简单用一个总电源分三路因为LDO的启动时间差异不一定严格满足先后顺序但也不会出严重问题。为了保险可以在3.3V输出端加一个RC延时控制VCCIO的通断——我在几块板上这么干过实测对防止IO口上电瞬间的毛刺有作用。当然芯片本身没有硬性要求IO必须先于内核但有条件的板子加上这个保护没坏处。2.2 时钟方案选型有源晶振还是无源晶振FPGA不像单片机那样用一个外部晶振加两个电容就能起振因为有源晶振和无源晶振在FPGA上都能工作但最优方案有讲究。无源晶振石英晶体需要的是一组配套的振荡电路——在FPGA内部启用片上振荡器资源或者外接两个电容配合芯片内部的反馈电路。Cyclone IV的内部振荡器支持不够通用一般推荐用有源晶振驱动FPGA的专用时钟引脚所以无源晶振方案在FPGA上并不是主流。如果你坚持用无源晶振需要把晶振的引脚接到FPGA的专用时钟输入引脚如CLK0、CLK1然后在FPGA内部例化一个振荡器或使用PLL作为时钟缓冲——这样操作比较麻烦而且相位噪声、启动速度都未必可控。有源晶振就省心多了一个四脚或四脚封装的器件供电3.3V输出CMOS电平直接接到FPGA的时钟输入引脚输出引脚悬空或者接一个小电阻到地串联端接电阻防反射即可简单粗暴效果也很稳定。我推荐能买到的贴片有源晶振比如5032封装、4脚或6脚频率25MHz到50MHz之间选择。50MHz是比较均衡的频率跑PLL分频容易得到常用波特率如115200、921600跑视频时序也够用。有源晶振还有一个好处输出波形是标准CMOS方波FPGA的时钟输入引脚要求的就是这种电平。只要电压匹配输出幅度和FPGA的VCCIO一致即可一般3.3V晶振配3.3V-I/O的FPGA就是最常规的接法。晶振输出走线尽量短不要跨分割区不要在离晶振很近的地方走其他高速信号这是时钟线的基本素养。2.3 复位电路设计要点FPGA的复位和单片机不太一样。FPGA内部逻辑的复位不是硬件强制行为而是由配置过程决定的——上电后FPGA自动加载配置数据加载完成后才开始执行用户逻辑。所以严格意义上EP4CE6不需要一个“上电复位”电路来保证内部状态清零。但外部复位仍然有必要。在FPGA逻辑里外部按键复位可以用于复位内部状态机、计数器、FIFO指针等等。这个复位是异步信号进入FPGA后需要同步化处理否则会引入亚稳态。复位电路的做法一个10kΩ电阻上拉到3.3V复位按键接到地和FPGA复位引脚之间按键按下时拉低释放后被上拉电阻拉高。如果想加个RC延时可以在按键输出端对地并联一个0.1uF电容制造几十毫秒的低电平复位信号保证按下瞬间不会太抖。还有一种更规范的做法是用专用复位芯片比如MAX809、TPS3820它们输出稳定的复位低电平脉冲适合对复位时序要求更严格的项目。我在实际项目里常用的是一个按键10kΩ上拉0.1uF电容接到FPGA的全局复位引脚然后在FPGA内部对复位信号做两级D触发器同步。这个方案成本一块钱都不用但是足够可靠。注意复位信号要接到FPGA的专用复位引脚通常叫nRESET或nCONFIG附近或者任意一个普通IO用内部逻辑自己处理——推荐用专用复位引脚因为全局信号的布线资源和复位延迟更可控。3. 配置电路与下载接口让FPGA“记住”和“被写进去”3.1 JTAG电路设计调试的命脉JTAG接口是FPGA调试的核心虽然它不能直接替代AS模式完成上电自加载但在开发阶段所有代码下载、在线调试、逻辑分析仪采集都要靠JTAG。EP4CE6的JTAG引脚有四个TCK、TMS、TDI、TDO。在PCB设计上这四根线的处理比较自由但有几个规范必须遵守TCK频率通常10MHz以下布线时尽量短在TCK引脚附近串联一个33Ω到100Ω的电阻用于减小反射这个电阻也有保护作用防止热插拔时电流过大。TMS、TDI、TDO是标准数字信号建议各串联一个小电阻比如22Ω但这块不是关键关键是TDO不能在外面上拉到VCCIOTDO是FPGA的输出外接上拉可能导致驱动冲突。正确做法是TDO在板上下拉或不接。不过很多现成下载器电路里四个信号都串联了电阻并接了上拉到3.3V这种接法在低成本调试器上也能工作但不是最规范的。JTAG接口需要一个参考电压用来匹配下载器电平。EP4CE6的JTAG参考电压一般是VCCIO如果VCCIO是3.3V下载器也要工作在3.3V电平。很多通用下载器如USB-Blaster的兼容版有电平转换能自动适配但设计时最好在原理图上留一个跳线用来切换JTAG电平或断开备用引脚。连接器我建议用标准的10针JTAG座2x5、2.54mm间距信号定义网上很多接好TCK、TMS、TDI、TDO、GND、VREF即可。注意第6脚是VCC要接3.3V防止下载器识别不到参考电平。3.2 AS模式与EPCS配置芯片上电自动加载的关键JTAG下载的缺点是掉电后配置丢失FPGA内部SRAM不保存配置数据每次上电都要重新加载。为了让系统独立运行必须搭配外部配置芯片EPCS系列用AS模式实现上电自动加载。EP4CE6的AS接口引脚有DATA0、DCLK、nCS、ASDO。这些引脚是功能复用引脚分别对应芯片的专用脚位原理图手册里写得很清楚。EPCS4容量是4Mbit512KB对于EP4CE6这种中等规模设计综合后的配置文件一般只有几十到一两百KBEPCS4绰绰有余。如果你担心以后逻辑膨胀可以上EPCS16甚至EPCS64——容量更大但成本也差不多后续升级空间大。我在板子上常用的接法EPCS4的VCC接到3.3VDATA0、DCLK、nCS、ASDO分别连接到FPGA的对应专用配置引脚每个信号线串联33Ω电阻减小走线反射。EPCS芯片的CS引脚在空闲时必须拉高这个由FPGA内部的上拉或者外部上拉电阻保证——我一般直接外部上拉到3.3V稳妥。AS和JTAG可以同时接在一张板子上互不冲突。下载时常用两种方式先用JTAG下载配置数据到FPGA临时运行调试再用JTAG转AS方式把配置文件写进EPCS。具体在Quartus里就是“File - Convert Programming File”生成.jic文件然后通过JTAG的间接编程方式烧录到EPCS。这个流程新手容易搞混以为JTAG下载完就能掉电保存实际上需要用AS模式或jic方式烧录配置芯片掉电才能自动加载。3.3 配置相关的状态引脚处理EP4CE6有几个配置状态引脚nCONFIG、nSTATUS、CONF_DONE、nCEO。这几个脚在原理图里的处理很多新手会忽略结果板子做出来下载死活用不了。nCONFIG配置控制输入低电平复位配置逻辑。必须外部上拉到VCCIO建议10kΩ上拉再接一个按键到地用来强制重新配置。平时保持高电平芯片处于正常配置/运行状态。nSTATUS配置状态指示开漏输出必须外部上拉。它会在配置失败时拉低成功配置时保持高电平。如果下载时nSTATUS一直不拉高说明配置没有正常开始或配置数据有问题。上拉电阻选10kΩ比较合适。CONF_DONE配置完成指示也是开漏输出必须外部上拉。CONF_DONE拉高意味着用户逻辑开始运行。如果这个引脚一直为低大概率是配置文件损坏、EPCS里数据错误或者FPGA的某个电源轨没给到位。nCEO多片FPGA级联时的使能输出单芯片设计时悬空即可nCE则需要接地表示本片始终被选中。三个状态引脚都加上拉电阻之后FPGA的配置链路才算完整。我用10kΩ上拉到3.3V这是数据手册推荐范围实测稳定。如果你用了DC-DC电源、并且在配置期间电源有较大波动这些引脚可能会因为逻辑电平不确定而出现配置随机失败排查时优先怀疑这三个脚的连接和电平。4. PCB布局与布线最小系统板能不能稳定跑起来的另一半4.1 电源去耦电容怎么放画原理图时很多人会把几十个0.1uF电容随手一放觉得“电容多点总没错”。实际上去耦电容的有效性取决于它们的放置位置和连接方式。EP4CE6的电源引脚分布在四个方向每个电源引脚都应该就近放一个0.1uF或0.01uF高频去耦电容电容的电源端和地端到FPGA引脚的距离越短越好过孔直接打在小电容的焊盘旁边避免先走一根长线再过孔。这个细节做好了能显著降低电源噪声和EMC风险。除了小电容每个电压轨还需要一组中等容量电容10uF~100uF做蓄水池。我习惯在电源入口处放一个100uF电解电容在FPGA附近的电源平面边沿放两三个10uF钽电容或陶瓷电容。注意不同电容的ESR和ESL特性不同高频、中频、低频按频率分层放置才能覆盖全频段的噪声抑制需求。另外要特别关注PLL的电源滤波。VCC_PLL这个引脚最容易受干扰手册里明确建议在VCC_PLL引脚处加一个RC滤波网络或者一个磁珠电容组成的π型滤波。我在板子上用了一个1Ω电阻串联4.7uF电容的方案比直连LDO输出干净很多。这个细节对使用PLL产生高频时钟的项目尤其重要PLL抖动过大往往就是电源滤波没做好。4.2 引脚分配与BANK规划FPGA的IO分布在不同的BANK里每个BANK有独立的VCCIO供电。EP4CE6-144封装有四个BANKBANK 1、2、3、4每个BANK的VCCIO可以单独供电但同一个BANK内部的所有IO电压必须一致。这就带来一个设计约束如果你的板子上有3.3V的外设和2.5V的外设不能把它们随意分配到相邻引脚而应该按BANK划分——3.3V外设统一放BANK 1、32.5V外设统一放BANK 2、4或者干脆全部用3.3V省去BANK电压切换的麻烦。我在早期画板子时吃过亏一个24C02存储器挂在BANK 5实际是BANK 3一个SD卡挂在BANK 8实际是BANK 4原理图连完布局布线时发现SD卡那边的IO电平要3.3V、存储那边要2.5V只能改原理图重新分配引脚白白浪费两天时间。还有一个重要规则专用时钟引脚比如CLK0、CLK1、CLK2这些每个BANK都有但全局时钟网络的引脚是有限且固定的。如果你要把外部时钟信号引入必须接在FPGA的专用时钟引脚上不是随便一个普通IO就可以。普通IO接外部时钟也能工作但延时大、时序不稳定PLL无法锁定。原理图阶段就要明确哪些引脚是时钟输入、哪些是配置引脚提前预留避免后期发现某个功能引脚和时钟引脚冲突。引脚分配上最忌“随意”——应该先在Quartus里用Pin Planner规划再回头改原理图而不是原理图定死了再去Quartus里硬塞。引脚规划时要考虑同一组总线的信号尽量连续排列减小布线交叉高速信号优先靠近专用时钟引脚敏感信号和开关信号保持距离避免串扰。4.3 高速与普通信号的布线注意EP4CE6内部逻辑频率一般能跑到200MHz以上但这个速度对应的是FPGA内部走线外部引脚上的信号频率取决于你的设计。如果你的板子只是接一些串口、SPI、GPIO基本上不用顾虑信号完整性按普通数字电路走线规则处理即可。但如果你的最小系统接了高速器件——比如ADC采样率几十MHz以上、DDR接口、LVDS信号、以太网PHY就需要认真对待布线了高速信号线尽量做到阻抗连续差分信号LVDS、USB、Ethernet差分对要求差分阻抗单端信号如ADC数据线要求按50Ω/100Ω阻抗控制走线。时钟信号和高速数据线不要走太长越短越好。走线拐角尽量不要用45度直角或90度用135度圆弧或45度斜角过渡减少阻抗突变。关键信号做好包地处理即在信号线两侧和上下层铺地铜减小串扰和外界干扰。电源平面和地平面必须完整不要被信号线切开。如果四层板信号-地-电源-信号当然最好两层板的话要尽量保证底层是大面积地顶层信号线的下方都有完整地平面电源走线加宽并增加多个过孔连接。EP4CE6最小系统用两层板完全能做出来但前提是布局合理、电源走线足够宽、地尽量完整。我在两层板上画过EP4CE6EPCS424L02SDRAM的板子只要信号速率控制在几十MHz以内两层板完全够用。如果频率上百MHz或者有LVDS四层板是基本配置省心很多。5. 常见问题与排查实录5.1 上电后nSTATUS低、CONF_DONE不拉高这个故障在自制板卡时非常常见。现象是JTAG能识别到芯片有时也识别不到但没办法正常配置nSTATUS一直为低或反复闪烁。排查顺序先量电源VCCINT是不是1.2VVCCIO是不是3.3VVCC_PLL是不是2.5V。我遇到过三路电源都是正常的结果发现是电源芯片的使能脚没接对上电顺序异常导致配置失败。检查nCONFIG是否为高。如果悬空了、或者外部拉低没有上拉配置永远不会开始。检查nSTATUS和CONF_DONE的上拉电阻是否漏贴。这两个开漏输出必须有上拉不然永远读不到高电平。如果有条件用示波器看DCLK和DATA0在配置期间是否有信号。没有示波器的话可以看JTAG下载时的错误提示Quartus会告诉你fail的环节比如erase失败、blank-check失败。5.2 JTAG识别不到设备USB-Blaster连接后Quartus提示“Unable to open device”或者识别到但JTAG ID错误优先怀疑下面几个点驱动没装好或服务端口被占用重新安装驱动、换个USB口关掉杀毒软件防火墙试试。JTAG连线的TDO引脚是否被外部下拉或意外接上拉。TDO是FPGA输出保底是悬空或接小电阻到地。如果TDO被上拉到3.3V在某些情况下可能冲突导致识别不到。JTAG的TCK信号是否被太长走线或大电容拖累导致边沿过缓。TCK串联电阻过大或者并联电容过大都会导致时钟信号失真。VCCIO参考电平是否有问题USB-Blaster的VCC检测引脚必须接到板子上的3.3V或目标电压否则下载器会判定电平不匹配。5.3 下载成功但程序不跑配置完成了CONF_DONE也拉高了但板子上的灯不闪、串口没数据。这种问题最坑因为FPGA本身工作正常问题出在IO或逻辑侧。排查要点确认VCCIO的电平和外设电平匹配尤其是不用的BANK是否也给了正确的VCCIO——哪怕该BANK没有接外设它的VCCIO也必须正确供电否则可能影响配置过程或者某些引脚的默认状态。然后检查复位逻辑。如果设计里有外部复位输入但复位信号一直是低电平比如上拉电阻漏焊、按键短路整个逻辑永远停在复位状态看起来就像“程序没跑”。这时可以先把复位输入引脚在原理图上临时跳过用内部复位信号代替逐步判断是硬件问题还是逻辑问题。最后检查配置是否真正从EPCS加载了。如果调试过程中只用了JTAG的“Program Device”下载到FPGA掉电后重新上电FPGA是空白的——如果没给EPCS写固件就会看到上述现象。首次烧录建议直接生成jic文件烧入EPCS再进行掉电测试。5.4 电源纹波过大导致逻辑不稳这个故障隐蔽性高症状是逻辑功能时好时坏或者运行一段时间后死机但重新下载又正常。排查时用示波器测量VCCINT和VCCIO的纹波如果纹波超过50mV就要怀疑去耦电容不足或电源选型问题。我遇到过具体案例给EP4CE6供电的LDO是AMS1117-1.2输入3.3V测量发现VCCINT纹波接近100mV而且带着一个几百kHz的振荡。原因有两个一个是输入输出电容太小我一开始只焊了10uF电解另一个是输出端没有加高频陶瓷电容。加上0.1uF和10uF陶瓷电容组合后纹波降到不到30mV问题消失。经验就是任何LDO的输出端除了标称电容一定要并联小容值高频电容并且电容的过孔要靠近LDO的输出引脚和地引脚如果纹波还大考虑换质量更好的LDO或者加LC滤波。6. 关于下载与调试流程的经验沉淀如果把上面几个章节的电路都画对了接下来实际调试时还有一套流程值得固化下来能帮你减少重复试错。第一轮上电前先做“短路三连”用万用表蜂鸣档量3.3V对地、1.2V对地、2.5V对地是否短路电源入口处是否低阻。很多板子是焊完没量导致一上电电源芯片炸掉的。第二件事是量电源输出电压是否和设计值接近误差超过5%就要查器件或者焊接。第二轮下载前把目标配置文件编译好先用JTAG直接下载到FPGA.sof文件确认逻辑能跑。这时不需要管EPCS先把FPGA内部逻辑调通了再说。如果这一步通了再生成jic文件烧进EPCS做掉电测试。我见过不少朋友跳过第一步直接把jic烧进EPCS结果逻辑有bug每改一次要擦写一次Flash效率极低。调试中多加测试点。最小系统板上预留几个关键信号的测试点或者排针包括1.2V、2.5V、3.3V电源、TCK、DCLK、nSTATUS、CONF_DONE以及几个空闲IO口。别小看这些测试点示波器调试时不用把表笔搭在芯片细密的引脚上少刮几次板子效率能高很多。最后再分享一个我自己的小习惯引脚分配的时候不要看Quartus里哪个顺眼就选哪个把手头要用到的外设信号按功能分组每组信号在FPGA封装上尽量紧凑。这样做的原因是布线工具虽然在自动布线时代很强大但人工优化的关键信号走线仍然至关重要紧凑的引脚能让这些优化变得容易。碰到复杂的项目我还会先把完整的pin assignment导出成csv文件作为原理图设计的输入一块板子落地后这个文件也是一个重要的评审依据。
返回列表