You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VHDL仿真行为正常但FPGA硬件运行时m_LED输出随机值异常

FPGA烧录后m_LED输出随机值排查思路

仿真行为正常但上板输出异常,核心是代码存在大量仿真与综合行为不一致的硬件设计问题,按以下优先级排查:

  • 敏感列表缺失问题
    两个进程的敏感列表仅包含io_LED,但进程内部分别读取了state、nrst信号。仿真工具默认会自动补全敏感列表保证逻辑符合预期,但FPGA综合工具严格按照代码书写的敏感列表生成硬件逻辑:只要敏感列表外的信号发生跳变,进程不会触发更新,直接导致state、m_LED的更新时机完全不可控。
  • 组合逻辑生成非预期锁存器
    第一个状态更新进程中,当state = s1且io_LED ≠ "0000"时,没有给state信号赋明确值。组合逻辑中只要存在分支未给输出赋值,综合器就会生成锁存器而非组合逻辑门。FPGA上的锁存器对布线延迟、信号毛刺极其敏感,会随机捕获线上电平,让state跳到未定义的非法编码值,最终输出代码中从未定义的电平。
  • 复位信号完全失效
    定义的nrst信号仅赋了初始值'1',没有任何外部驱动逻辑,综合时会被直接优化为固定高电平,复位分支永远不会生效。同时给state赋的初始值仅在FPGA上电配置的瞬间生效,一旦运行中因为毛刺跳到非法状态,没有任何机制能将状态拉回初始值。
  • 组合逻辑毛刺直接输出到引脚
    就算修正上述问题,纯组合逻辑驱动m_LED时,多bit信号路径的延迟差会产生大量纳秒级毛刺,部分毛刺会被引脚捕获,表现为LED随机亮灭。

修正原则

禁止用纯组合逻辑实现状态机,所有状态更新必须走同步时序逻辑

  1. 增加全局时钟输入端口,状态寄存器的更新全部放在时钟上升沿触发的时序进程中
  2. 组合逻辑进程的敏感列表必须包含进程内读取的所有输入信号,时序进程敏感列表仅保留时钟、异步复位信号
  3. 所有组合逻辑分支必须覆盖所有条件,给每个输出信号赋明确值,杜绝锁存器生成
  4. 增加真实的外部复位输入端口,不要用无驱动的内部信号作为复位
  5. m_LED输出增加一级寄存器打拍,过滤组合逻辑毛刺

内容的提问来源于stack exchange,提问作者karthik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 09:33:28