FPGA流水灯模式同步数码管显示故障排查及实现求助
FPGA LED流水灯与数码管显示问题解决方案
一、硬件原理图引脚修复
- 找到FPGA的seg数码管段选引脚(注意区分共阴/共阳硬件类型),把代码里的
seg输出端口直接连到原理图的数码管段选引脚上 - 只用1个数码管的话,位选引脚直接接固定电平:共阴接GND,共阳接VCC,确保数码管能正常点亮
二、数码管显示逻辑修复
1. 段码映射错误修正
数码管段码必须和硬件类型匹配,直接用下面的标准映射:
- 共阴数码管(a~g+dp,8段):
// 索引1-8对应数字1-8的段码 parameter [7:0] SEG_CODE[8:1] = '{8'h3f, 8'h06, 8'h5b, 8'h4f, 8'h66, 8'h6d, 8'h7d, 8'h07}; - 共阳数码管:
// 索引1-8对应数字1-8的段码 parameter [7:0] SEG_CODE[8:1] = '{8'hc0, 8'hf9, 8'ha4, 8'hb0, 8'h99, 8'h92, 8'h82, 8'hf8}; - 代码里加段码映射逻辑,直接根据当前模式编号输出对应段码:
assign seg = SEG_CODE[mode];
2. 时钟同步问题处理
必须保证模式编号mode的更新和1Hz分频时钟同步,避免亚稳态:
reg [2:0] mode; reg clk_1Hz; // 50MHz转1Hz分频逻辑 reg [25:0] cnt; always @(posedge clk) begin if(cnt == 26'd49_999_999) begin cnt <= 26'd0; clk_1Hz <= ~clk_1Hz; end else begin cnt <= cnt + 1'b1; end end // 模式循环更新,1Hz触发一次 always @(posedge clk_1Hz) begin mode <= (mode == 3'd8) ? 3'd1 : mode + 1'b1; end
3. 输出端口检查
确认water_led.v的端口定义里seg是输出端口:
module water_led( input clk, input rst_n, output [7:0] led, output [7:0] seg // 必须存在且为输出类型 );
三、仿真验证优化
在tb_water_led.v里加seg信号的观测逻辑:
- 添加
$monitor("Time: %0t, Mode: %d, SEG: %h", $time, mode, seg);,实时查看模式编号和段码的对应关系 - 仿真时重点看1Hz时钟触发后,
mode从1到8循环时,seg输出是否和预设段码一致
内容的提问来源于stack exchange,提问作者xcsoft
相关产品推荐
相关产品推荐

