fix(saolei): 修显示/难度/数字三处问题(只本地提交)

1) 显示:VGA 的像素色 = 字模点 ? 字符色 : 背景色,而背景是黑的,所以 START 按钮上
   那几个 C_BLACK 字母的字形点和空白处全黑,整格看不见。改成黄色。
2) 难度:三档改成微软扫雷的真实尺寸 9x9/10、16x16/40、30x16/99(原来三档都是
   16x16,只有雷数不同)。棋盘尺寸由编译期常量改成运行期变量
   (g_bw/g_bh/g_board_r0/g_board_c0),所有索引改用 mul/divu/remu(这颗核都有),
   棋盘自动居中;BFS 加 seen_bm 去重,避免重复入队把队列撑满丢格。
3) RTL:cpu21_riscv_redirect_int_bpb 例化 cpu21_mmio 时漏传 FB_WORDS,mmio 用默认
   300,fb_ok 把显存写卡在前 300 字(前 15 行),屏幕下半部分永远刷不出来。
   补上 .FB_WORDS(FB_WORDS) 并给顶层加参数,mmio 默认值也改成 600。

验证:
- build.ps1:编译 + check_isa 指令白名单全部通过(新增的 mul/divu/remu 都合法)
- 棋盘逻辑(PC 上 gcc 跑 _tmp/logic,不改仓库):三档 x 40 局 x 全部格子,
  count_adj 与独立重算逐格一致,雷数、首点 3x3 安全区都正确
  -> 数字与雷位没有逻辑矛盾,看到的 3 旁边 4 个雷 应是显示层问题
This commit is contained in:
2026-09-23 20:54:28 +08:00
parent cfcf2f4923
commit 7e13571744
4 changed files with 1236 additions and 1191 deletions
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -42,7 +42,7 @@
// -----------------------------------------------------------------------------
module cpu21_mmio #(
parameter [31:0] LED_ADDR = 32'h0000_1000,
parameter integer FB_WORDS = 300,
parameter integer FB_WORDS = 600, // 600 字 = 2400 字节(40x30 格,每格 2 字节)
parameter integer FIFO_DEPTH = 16
) (
input wire clk,
@@ -48,7 +48,11 @@ module cpu21_riscv_redirect_int_bpb #(
// MMIO:LED 数据寄存器地址(默认 0x0000_1000,位于 4 KB 数据 RAM 之外)。
parameter [31:0] LED_ADDR = 32'h0000_1000,
// ustatus 复位值。详见 cpu21_riscv_irq_ctrl 中的说明。
parameter [31:0] USTATUS_INIT = 32'h0000_0001
parameter [31:0] USTATUS_INIT = 32'h0000_0001,
// 显存字数:600 字 = 2400 字节 = 40x30 格、每格 2 字节(字形 + 颜色)。
// 必须传给 cpu21_mmio:它的 fb_ok 是 (fb_widx < FB_WORDS),不传就会
// 把显存写卡在前 300 字(前 15 行),屏幕下半部分永远刷不出来。
parameter integer FB_WORDS = 600
) (
input wire clk,
input wire reset,
@@ -69,7 +73,7 @@ module cpu21_riscv_redirect_int_bpb #(
output wire [31:0] seg_data_o, // 七段数码管:8 位十六进制数
output wire seg_valid_o,
output wire fb_we_o, // 显存写端口(板级顶层的双口 RAM)
output wire [ 9:0] fb_waddr_o, // 显存字地址(0..299)
output wire [ 9:0] fb_waddr_o, // 显存字地址(0..599)
output wire [31:0] fb_wdata_o,
output wire [ 3:0] fb_wstrb_o,
input wire [31:0] fb_rdata_i, // 显存读回(组合)
@@ -479,7 +483,8 @@ module cpu21_riscv_redirect_int_bpb #(
wire mmio_rdata_hit;
cpu21_mmio #(
.LED_ADDR(LED_ADDR)
.LED_ADDR(LED_ADDR),
.FB_WORDS(FB_WORDS)
) u_mmio (
.clk (clk),
.reset (reset),