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

Upduino v3.1 Verilog PLL驱动LED不闪烁问题排查求助

代码错误分析及LED不闪烁原因

1. PLL复位端口悬空,导致时钟输出异常

你实例化的pllG模块中,rst_n_i()端口处于悬空状态。Upduino v3.1的PLL模块需要有效的复位信号才能完成锁定流程,输出稳定时钟。悬空的复位端口会让PLL处于不确定状态,无法正常生成时钟,驱动计数器的pllout时钟无效,计数器不会递增,LED自然不会翻转。

修复方式:根据pllG模块的复位电平定义,将rst_n_i连接到固定电平(通常低电平复位则接高电平),例如:

pllG pllmpd(.ref_clk_i(REFERENCECLK), .rst_n_i(1'b1), .outcore_o(PLLOUTCORE),.outglobal_o());

2. 计数器初始化语法错误

代码中initial counter <= 16b0;的写法不符合Verilog语法规范,正确的位宽表示应该是16'b0(反引号需放在b`之前)。这个错误会导致编译失败,或让计数器初始值异常,无法正常启动计数。

修复方式:修改为initial counter <= 16'b0;

3. 计数器阈值过小,闪烁频率超出肉眼识别范围

假设PLL输出时钟为常见的几十MHz(比如50MHz),2000个时钟周期仅对应40微秒的间隔,LED翻转速度远超肉眼可感知的范围,看起来像是一直处于固定状态。

修复方式:增大计数器阈值,比如设置为50_000_000(对应50MHz时钟下1秒翻转一次),让闪烁频率落在肉眼可见区间:

if (counter == 50_000_000) begin
    counter <= 0;
    temp <= ~temp;
end

4. 未使用全局时钟缓冲,存在时序隐患

你当前使用的PLLOUTCORE是核心时钟输出,对于FPGA内部逻辑(如计数器),更推荐使用经过全局时钟缓冲的outglobal_o端口输出。未经过全局缓冲的时钟可能存在时序问题,导致计数器逻辑异常。

修复方式:改用全局缓冲后的时钟驱动计数器:

wire pll_global_clk;
pllG pllmpd(
    .ref_clk_i(REFERENCECLK), 
    .rst_n_i(1'b1), 
    .outcore_o(PLLOUTCORE),
    .outglobal_o(pll_global_clk)
);

always @(posedge pll_global_clk) begin
    counter <= counter + 1;
    if (counter == 50_000_000) begin
        counter <= 0;
        temp <= ~temp;
    end
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:12:44