diff --git a/pipelined-cpu/srcs/rtl/cpu21_vga.v b/pipelined-cpu/srcs/rtl/cpu21_vga.v index 0ea3bb5..1e23999 100644 --- a/pipelined-cpu/srcs/rtl/cpu21_vga.v +++ b/pipelined-cpu/srcs/rtl/cpu21_vga.v @@ -14,7 +14,7 @@ // 25 MHz 的像素节拍。**不引入第二个时钟域**,因此显示缓冲区的读(本模块) // 与写(MMIO,同一时钟)之间没有跨时钟域问题。 // -// 光标:由 CURSOR 寄存器的 (x,y) 决定,在对应格子上画一个白色闪动的方框 +// 光标:由 CURSOR 寄存器的 (x,y) 决定,在对应格子上画一个黄色常亮的方框(2 像素宽) // (CTRL[0] 控制显示与否)。缓冲区字节的 bit7 在本模块中不使用(保留)。 // ----------------------------------------------------------------------------- module cpu21_vga #( @@ -174,21 +174,16 @@ module cpu21_vga #( wire glyph_px = frow[3'd7 - fx]; // 1 = 画字模点 // --------------------------------------------------------------------------- - // 光标框(闪动) + // 光标框:黄色、常亮、2 像素宽 + // 原来是 1 像素浅灰 + 闪动(blink 周期约 1.3 s):在白色未揭开格上几乎看不清, + // 而且截图有一半概率正好截到"灭"的那个相位。改成黄色常亮 2 像素后, + // VGA 上和图里都能一眼看到指针。想改回闪动:把 blink_q 加回来, + // 再在 cursor_box 里与上 blink 即可。 // --------------------------------------------------------------------------- - reg [24:0] blink_q; - always @(posedge clk or posedge reset) begin - if (reset) - blink_q <= 25'd0; - else if (tick) - blink_q <= blink_q + 25'd1; - end - wire blink = blink_q[24]; - wire cursor_here = (cursor_i[4:0] == ccol) && (cursor_i[12:8] == crow); - wire on_border = (hx[3:0] == 4'd0) || (hx[3:0] == 4'd15) || - (vy[3:0] == 4'd0) || (vy[3:0] == 4'd15); - wire cursor_box = cursor_here && blink && ctrl_i[0] && on_border; + wire on_border = (hx[3:0] < 4'd2) || (hx[3:0] > 4'd13) || + (vy[3:0] < 4'd2) || (vy[3:0] > 4'd13); + wire cursor_box = cursor_here && ctrl_i[0] && on_border; // --------------------------------------------------------------------------- // 颜色(3 位调色板 -> 4:4:4 RGB) @@ -218,7 +213,7 @@ module cpu21_vga #( endfunction wire [2:0] px_color = glyph_px ? gcolor : bgcolor; - wire [2:0] px_final = cursor_box ? 3'd7 : px_color; + wire [2:0] px_final = cursor_box ? 3'd6 : px_color; // 6 = 黄,光标框 wire [11:0] px_rgb = de ? pal(px_final) : 12'h000; always @(posedge clk or posedge reset) begin diff --git a/saolei/tools/fb2png.py b/saolei/tools/fb2png.py index 0325f37..8607ffd 100644 --- a/saolei/tools/fb2png.py +++ b/saolei/tools/fb2png.py @@ -14,7 +14,7 @@ dump 格式(tb_saolei.v 里的 dump_fb 任务生成): 渲染依据(与 RTL 严格对应,改 RTL 时这两个表要同步): * 字库 cpu21_vga.v 的 font_row():8x8、bit7 是最左像素,放大 2 倍 = 16x16 一格 * 调色板 cpu21_vga.v 的 pal():3 位 -> 4:4:4 RGB(0xA 分量 = 170) - * 光标 cpu21_vga.v 的 cursor_box:格子四边一圈(1 像素宽)显示浅灰 + * 光标 cpu21_vga.v 的 cursor_box:格子四边一圈 2 像素宽的黄色框(常亮) * 画面 40x30 格 -> 640x480 另外还会在终端打印一份 ASCII 图,方便在没有图片查看器的地方快速看结果。 @@ -195,10 +195,10 @@ def main(): px_on = (FONT[g][fy] >> (7 - fx)) & 1 col = c if px_on else bg if cursor_box and (cx, cy) == cur: - # 格子四边一圈(1 像素)显示浅灰 + # 光标格:四边 2 像素黄色框,与 cpu21_vga.v 的 cursor_box 一致 ox, oy = x % CELL_PX, y % CELL_PX - if ox == 0 or ox == CELL_PX - 1 or oy == 0 or oy == CELL_PX - 1: - col = 7 + if ox < 2 or ox > CELL_PX - 3 or oy < 2 or oy > CELL_PX - 3: + col = 6 r, gg, b = PAL[col] row += bytes((r * 17, gg * 17, b * 17)) rows.append(bytes(row))