Scrolling works!!1!

This commit is contained in:
jaseg 2021-07-21 17:28:47 +02:00
parent a4d24551d5
commit c2d5c19dcc
8 changed files with 137 additions and 80 deletions

View file

@ -8,6 +8,8 @@ input in_blank, in_vsync, in_hsync,
input [19:0] glyphmem_data,
output [15:0] glyphmem_r_addr,
input [11:0] scroll_y,
output out_hsync, out_vsync,
output [7:0] out_red,
output [7:0] out_green,
@ -158,11 +160,11 @@ always @(posedge clk) begin
end
if (in_vsync_last && !in_vsync) begin
glyph_y <= 0;
px_y <= 0;
glyph_y <= scroll_y / FONT_GLYPH_H;
px_y <= scroll_y % FONT_GLYPH_H;
end
end
end
endmodule
endmodule

View file

@ -180,6 +180,7 @@ wire [19:0] glyph_buffer_w_data;
wire win_blank;
wire [11:0] win_w;
wire [11:0] win_h;
wire [11:0] win_scroll_y;
wire out_data_en;
wire out_data_valid;
wire [7:0] matcher_debug;
@ -306,6 +307,8 @@ term_renderer #(
.in_blank(win_blank),
.in_vsync(in_vsync),
.in_hsync(in_hsync),
.scroll_y(win_scroll_y),
.out_hsync(),
.out_vsync(),
@ -347,6 +350,7 @@ window_matcher window_matcher_i (
.win_locked(win_locked),
.win_w(win_w),
.win_h(win_h),
.win_scroll_y(win_scroll_y),
.win_x_dbg(win_x_dbg),
.win_y_dbg(win_y_dbg),
@ -368,4 +372,4 @@ window_matcher window_matcher_i (
.out_blue(out_blue)
);
endmodule
endmodule

View file

@ -25,6 +25,7 @@ module window_matcher(
output reg [11:0] win_h,
output reg [11:0] win_right,
output reg [11:0] win_bottom,
output reg [11:0] win_scroll_y,
output reg win_locked,
input [7:0] win_red, [7:0] win_green, [7:0] win_blue,
@ -208,6 +209,8 @@ module window_matcher(
reg [11:0] win_y_int;
reg [11:0] win_w_int;
reg [11:0] win_h_int;
reg [11:0] win_scroll_y_int;
reg [11:0] win_sof_marker_int;
assign win_x_dbg = win_x_int;
assign win_y_dbg = win_y_int;
@ -221,17 +224,11 @@ module window_matcher(
ST_MAT_RX3 = 5'b01000,
ST_MAT_DATA = 5'b10000;
reg [4:0] matcher_state;
wire matched = matcher_state[4];
reg matched;
reg [11:0] dval_x_reg;
reg [11:0] dval_y_reg;
always @(posedge clk) begin
if (rst == 1) begin
out_data_valid <= 0;
out_data_en <= 0;
end
if (rst || in_vsync) begin
matcher_state <= ST_MAT_WAITING;
win_x_int <= 0;
@ -239,68 +236,82 @@ module window_matcher(
win_w_int <= 0;
win_h_int <= 0;
dval_x_reg <= 0;
dval_y_reg <= 0;
win_scroll_y_int <= 0;
win_sof_marker_int <= 0;
matched <= 0;
out_data_en <= 0;
out_data_valid <= 0;
end
if (!rst) begin
if (in_blank) begin
/* Reset state if the header is only partially contained in this frame */
if (matcher_state != ST_MAT_DATA) begin
matcher_state <= ST_MAT_WAITING;
end
if (!in_blank_reg) begin
if (matcher_state != ST_MAT_DATA) begin
out_data_en <= 0;
end
matcher_state <= ST_MAT_WAITING;
end
end else begin
case (matcher_state)
ST_MAT_WAITING: begin
if (in_pxd_pattern_match) begin
matcher_state <= ST_MAT_RX0;
win_x_int <= scan_x_reg[7];
win_y_int <= scan_y;
if (!matched) begin
win_x_int <= scan_x_reg[7];
win_y_int <= scan_y;
end
end
end
ST_MAT_RX0: begin
matcher_state <= ST_MAT_RX1;
win_sof_marker_int <= in_pxd;
end
ST_MAT_RX1: begin
matcher_state <= ST_MAT_RX2;
if (!matched) begin
win_scroll_y_int <= in_pxd;
end
end
ST_MAT_RX2: begin
matcher_state <= ST_MAT_RX3;
win_w_int <= in_pxd;
if (!matched) begin
win_w_int <= in_pxd;
end
end
ST_MAT_RX3: begin
matcher_state <= ST_MAT_DATA;
win_h_int <= in_pxd;
out_data_valid <= 1;
out_data_en <= 1;
dval_x_reg <= 13;
dval_y_reg <= 0;
if (!matched) begin
matched <= 1;
win_h_int <= in_pxd;
end
if (win_sof_marker_int[7]) begin
out_data_valid <= 1;
out_data_en <= 1;
end else if (out_data_en) begin
out_data_valid <= 1;
end
dval_x_reg <= 13;
end
ST_MAT_DATA: begin
if (out_data_en) begin
dval_x_reg <= dval_x_reg + 1;
end
if (dval_x_reg == win_w_int || in_blank) begin
out_data_valid <= 0;
end
end
endcase
end
if (matcher_state == ST_MAT_DATA) begin
/* blank */
if (scan_x == win_x_int && out_data_en) begin
out_data_valid <= 1;
dval_x_reg <= 1;
end else if (out_data_en) begin
dval_x_reg <= dval_x_reg + 1;
end
if (dval_x_reg == win_w_int || in_blank) begin
out_data_valid <= 0;
end
if (!in_blank_reg && in_blank) begin
dval_y_reg <= dval_y_reg + 1;
end
if (dval_y_reg == win_h_int) begin
out_data_en <= 0;
end
end
end
end
@ -351,6 +362,7 @@ module window_matcher(
win_y <= 0;
win_right <= 0;
win_bottom <= 0;
win_scroll_y <= 0;
end else begin
if (in_vsync_reg == 0 && in_vsync == 1) begin
@ -363,6 +375,7 @@ module window_matcher(
win_y <= win_y_int;
win_right <= win_x_int + win_w_int + 1;
win_bottom <= win_y_int + win_h_int + 1;
win_scroll_y <= win_scroll_y_int;
end else begin
win_w <= 0;
@ -371,6 +384,7 @@ module window_matcher(
win_y <= 0;
win_right <= 0;
win_bottom <= 0;
win_scroll_y <= 0;
end
end
end