一个MCU与FPGA混合电路上电启动的问题及其解决办法探索[原创www.cnblogs.com/helesheng]

最近在做一个同时需要MCU和FPGA的项目,具体说是FPGA作为MCU的一个FSMC(Flexible Static Memory Controller)外设,通过SRAM(静态RAM)接口标准与MCU通信。MCU用的是100管脚的STM32F103VET6,FPGA用的是国产安路小精灵系列的EF2L15。使用时发现当两种器件用同一路电源时,上电后MCU无法正常启动工作。现将我对问题的分析以及解决办法分享如下,以下原创内容欢迎网友转载,但请注明出处:https://www.cnblogs.com/helesheng 

1、寻找和分析原因

观察到的现象:上电后FPGA开始稳定工作后,虽然MCU不能工作,但按下MCU的复位键后,MCU能够恢复工作。因此我推测故障是由MCU在和FPGA连接后无法正常复位造成的。但FPGA的启动要经过比特流文件从Flash加载到查找表中的过程;而STM32的程序却是从Flash中一边不断取指,一边执行的。启动速度是STM32完胜,怎么会出现STM32反而被FPGA影响的情况呢?显然问题只能发生在FPGA比特流尚未加载完成,MCU发生复位的阶段。

两者相连的FSMC接口,大部分管脚是MCU作为主设备输出,FPGA作为从设备输入的信号。但当我用示波器观察时却发现,在安路小精灵系列EF2L15进行比特流加载阶段,这些管脚居然在输出高电平!我猜测这就是在这个阶段FPGA管脚电流倒灌到MCU的FSMC管脚,导致其无法正常上电复位的原因。为此我将这些IO约束为禁止PULLUP的NONE模式,但发现没有什么卵用:比特流配置过程中它们仍然我行我素的输出高电平——想来也是,还没有完成比特流配置,FPGA怎么知道这些管脚的模式是什么。

既然无法在上电的最初阶段保证MCU的正确上电复位,我只能退而求其次:在FPGA完成比特流配置后,再对MCU进行复位,也就要求MCU的复位信号要在FPGA加载完成后还持续有效。用示波器观察EF2L15的配置完成管脚DONE,我沮丧的发现:这么一个“小精灵”,它的配置时间居然达到了400ms以上。常见上电复位芯片都无法做到持续400ms以上的复位。(如:我自己比较喜欢的MAX809/810的复位时间都只有200ms左右)。

退而求其次,干脆让EF2L15加载完成后,再用FPGA配置完成管脚DONE输出一个的复位信号给MCU好了。令人意想不到的事情再次发生:采用这种方法后,虽然上电后能MCU正常工作了,但却无法调试STM32了。细想原因也很简单:上电过程完成后,FPGA的输出的复位信号钳置了MCU的复位管脚,让JLINK在调试时下载MCU完成后无法正常复位MCU,从而导致无法调试MCU了。

绕了个大弯子,似乎又回到了原点。在上面的尝试后,我得到了以下两种有效的解决方案:

2、解决办法

 方法一:缩短FPGA上电后比特流加载时间 + 延长MCU复位时间

既然无法保证将MCU复位时间延迟到400ms以上,把FPGA上电后比特流加载时间缩短也是一个不错的办法,在安路的官网上找到了这篇技术文档《TR404_ELF2 FLASH启动加载时间测试》,它提到有两种方法加快“小精灵”系列上电后比特流加载时间:a、提高读取比特流文件读取时钟;b、采用2位或4位比特流( mspix2或x4)加载代替1位比特流加载。

配置方法如下:

在TD中打开FPGA工程,Process菜单中的属性对话框中进行Properties Configuration,对mclk_freq_div进行配置,将其时钟频率配置到2.5MHz~24MHz之间的更高数值。

image

图1 Properties Configuration界面配置读取时钟频率

 在 TD 软件 Download 界面上,在识别到 EF2 系列芯片以后点击左边的“Attribute BlockEditor”,先点 Read,弹出的 boot_mode 属性中选择 mspix1/x2/x4,然后点击Program 按钮,如图2所示,然后在 TD 主界面重新生成 Bitstream。在 Download 界面中选择 bit 文件,下载模式选择PROGRAM FLASH 下载,如图 3 所示。

image

图2 boot_mode配置

image

图3 下载界面

 经过上述两部配置后,我的比特流加载时间被从400ms压缩到了20ms左右!

惊喜的发现,将比特流加载时间压缩到50ms以内后,不需要改动PCB,上电后MCU就能正常工作了。 

方法二:FPGA加载后复位MCU

前面说过有一种思路是用FPGA在加载完比特流,开始运行以后,再输出一个复位MCU的信号。但这个方法的问题是,FPGA输出复位信号的管脚钳置了MCU的复位管脚,导致其无法通过JLINK调试和下载程序。参考STM32内部WWDG、IWDG和软件复位等多种信号共同控制系统总复位信号的电路,可以采用线与(Wired-AND)的方式管理来自FPGA的复位信号。即在MCU的复位电路上对地并联一个NPN晶体管或N沟道MOS管。参考下图4。

image

图5 “线与”方式实现来自FPGA的复位信号接入

 采用这个电路后,来自FPGA的复位信号不会将MCU的复位管脚钳置到高电平,只会在需要时打开NMOS管,实现低电平复位MCU。其他时间来自按键或MCU内部的WWDG、IWDG和软件复位都可以将MCU的复位信号拉低,以实现复位。

需要注意的是使用这个电路后由于NMOS管有反相作用,不能再用FPGA输出的DONE做复位信号了,需要输出一个高电平复位的逻辑信号,可以用FPGA的其他通用IO来实现。例如使用如下代码:

 1  reg[9:0]    delay_nrst_cnt;
 2  reg    delay_nrst_mcu_reg;//为防止mcu无法正常复位,上电后延迟低电平复位MCU的信号
 3  assign delay_nrst_mcu = delay_nrst_mcu_reg;
 4  always @(posedge clk_50_wire or negedge rst_n)
 5  begin
 6      if(!rst_n) begin
 7          delay_nrst_mcu_reg <= 1'b0;
 8          delay_nrst_cnt[9:0] <= 10'h0000;
 9      end
10      else begin
11          if(delay_nrst_cnt[9:0] < 10'd1000)
12              delay_nrst_cnt[9:0] <= delay_nrst_cnt[9:0] + 10'h1;
13          else
14              delay_nrst_cnt[9:0] <= delay_nrst_cnt[9:0];
15          if(delay_nrst_cnt[9:0] < 10'd500)
16              delay_nrst_mcu_reg <= 1'b1;//复位MCU
17          else
18              delay_nrst_mcu_reg <= 1'b0;
19      end
20  end
复位信号代码

 

方法三:可配置的延迟复位电路 

我还设计了一个可配置的延迟复位电路,由三态门74HC125以及配套阻、容元件构成,如图6所示。使用三态门的原因是想让复位完成后的MCU复位管脚只是被上拉电阻Rrst拉高,而非被推挽式(push pull)的电路拉高,以免出现前述的JLINK调试时无法复位和下载的问题。设计的核心思路是用RC延迟电路驱动三态门的控制端:上电或按下复位键后,RC电路的电容C上没有电,三态门处于输出低电平的状态,随着C通过R得到充电,C上的电压达到三态控制端的输入高电平门限,三态门进入高阻态,输出被上拉电阻拉高。每级三态门和RC电路构成的“延迟单元”产生的延迟将会叠加到总延迟时间中。74HC125有四个三态门,可以实现四个延迟单元。使用时可以根据FPGA比特流加载的时间来决定接入电路的延迟数量和器件参数,不需要使用的延迟单元可以通过不焊接其前端RC电路中的电容C来去除。(注意:即使不使用的延迟单元也需要焊接对应的电阻R,否则无法时该级三态门在进入高阻态后输出高电平。

image

图6 三态门构成的可配置的延迟复位电路

 

3、三种解决办法优缺点比较

第一种方法最简单,无需改动电路,且能够降低系统上电到运行的延迟时间。但缺点是当FPGA的比特流较大时,比特流加载时间仍然有可能超过MCU上电复位延迟时间,导致MCU无法正常复位。

第二种方法需要修改PCB,增加FPGA和MCU模块之间的连接。

第三种方法最灵活且可靠,但要增加电路改PCB。

 

posted @ 2025-09-21 17:22  helesheng  阅读(170)  评论(0)    收藏  举报