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
相关产品推荐
相关产品推荐

