improve display accuracy

This commit is contained in:
nino-porcino 2022-03-19 11:03:38 +01:00
parent b4d78e99e7
commit e9e60a5fb5
1 changed files with 22 additions and 35 deletions

View File

@ -184,7 +184,7 @@ module display (
assign cursor = {v_cursor, h_cursor}; assign cursor = {v_cursor, h_cursor};
assign vram_r_addr = {vram_v_addr, vram_h_addr}; assign vram_r_addr = {vram_v_addr, vram_h_addr};
wire [5:0] cursor_character = cursor_on ? 6'd0 : 6'd32; wire [5:0] cursor_character = cursor_on ? 6'd0 : 6'd32; // "@" or space
assign font_char = (vram_r_addr != cursor) ? vram_dout : cursor_character; assign font_char = (vram_r_addr != cursor) ? vram_dout : cursor_character;
assign font_pixel = h_dot; assign font_pixel = h_dot;
@ -220,11 +220,12 @@ module display (
else else
if(pixel_clken) begin if(pixel_clken) begin
vram_w_en <= 0; vram_w_en <= 0;
// accepts a new character only at the start of each frame
if(v_cnt == 0 && h_cnt == 0) if(v_cnt == 0 && h_cnt == 0)
ready <= 1; ready <= 1;
if (clr_screen) if(clr_screen) begin
begin
// return to top of screen // return to top of screen
h_cursor <= 6'd0; h_cursor <= 6'd0;
v_cursor <= 5'd0; v_cursor <= 5'd0;
@ -237,55 +238,41 @@ module display (
vram_din <= 6'd32; vram_din <= 6'd32;
vram_w_en <= 1; vram_w_en <= 1;
end end
else else begin
begin
// cursor overflow handling // cursor overflow handling
if (h_cursor == 6'd40) if (h_cursor == 6'd40) begin
begin
h_cursor <= 6'd0; h_cursor <= 6'd0;
v_cursor <= v_cursor + 'd1; v_cursor <= v_cursor + 'd1;
end end
if (v_cursor == vram_end_addr) if (v_cursor == vram_end_addr) begin
begin
vram_start_addr <= vram_start_addr + 'd1; vram_start_addr <= vram_start_addr + 'd1;
vram_end_addr <= vram_end_addr + 'd1; vram_end_addr <= vram_end_addr + 'd1;
end end
if (address == 1'b0) // address low == TX register // address low == TX register
begin if (address == 1'b0) begin
if (cpu_clken & w_en & ready) if (cpu_clken & w_en & ready) begin
begin
// incoming character // incoming character
ready <= 0; ready <= 0;
case(din) if(din[6:0]=='h0D) begin
8'h0D, // handle carriage return
8'h8D: begin h_cursor <= 0;
// handle carriage return v_cursor <= v_cursor + 'd1;
h_cursor <= 0; end
v_cursor <= v_cursor + 'd1; else if(din[6:0] < 32) begin
end // 0-31 non printable characters, do nothing
end
8'h00, else begin
8'h0A,
8'h9B,
8'h7F: begin
// ignore the escape key
h_cursor <= 0;
end
default: begin
vram_w_addr <= cursor; vram_w_addr <= cursor;
vram_din <= {~din[6], din[4:0]}; vram_din <= {~din[6], din[4:0]};
vram_w_en <= 1; vram_w_en <= 1;
h_cursor <= h_cursor + 1; h_cursor <= h_cursor + 1;
end end
endcase
end end
end end
else else begin
begin
vram_w_addr <= {vram_clr_addr, vram_h_addr}; vram_w_addr <= {vram_clr_addr, vram_h_addr};
vram_din <= 6'd32; vram_din <= 6'd32;
vram_w_en <= 1; vram_w_en <= 1;