Implement single character write interface
This basic interface just moves the cursor to the next position after writing a character and supports CR and LF as special chars for now.
This commit is contained in:
		| @@ -16,7 +16,11 @@ entity framebuffer is | |||||||
|         x: in std_logic_vector(9 downto 0); |         x: in std_logic_vector(9 downto 0); | ||||||
|         y: in std_logic_vector(8 downto 0); |         y: in std_logic_vector(8 downto 0); | ||||||
|  |  | ||||||
|         rgb: out std_logic_vector(23 downto 0) |         rgb: out std_logic_vector(23 downto 0); | ||||||
|  |  | ||||||
|  |         write_enable: std_logic; | ||||||
|  |         write_address: std_logic_vector(12 downto 0); | ||||||
|  |         write_data: std_logic_vector(7 downto 0) | ||||||
|     ); |     ); | ||||||
| end framebuffer; | end framebuffer; | ||||||
|  |  | ||||||
| @@ -41,6 +45,7 @@ architecture logic of framebuffer is | |||||||
|  |  | ||||||
|     constant font: rom_type := read_font("font.hex"); |     constant font: rom_type := read_font("font.hex"); | ||||||
|  |  | ||||||
|  |     signal read_address: std_logic_vector(12 downto 0); | ||||||
|     signal current_char: std_logic_vector(7 downto 0); |     signal current_char: std_logic_vector(7 downto 0); | ||||||
|  |  | ||||||
|     signal current_glyph: std_logic_vector(63 downto 0); |     signal current_glyph: std_logic_vector(63 downto 0); | ||||||
| @@ -49,52 +54,17 @@ architecture logic of framebuffer is | |||||||
|     constant glyph_pos_length: integer := 2; |     constant glyph_pos_length: integer := 2; | ||||||
|     type glyph_pos_type is array(1 to glyph_pos_length) of integer range 0 to 63; |     type glyph_pos_type is array(1 to glyph_pos_length) of integer range 0 to 63; | ||||||
|     signal glyph_pos: glyph_pos_type; |     signal glyph_pos: glyph_pos_type; | ||||||
|  |  | ||||||
|     signal write_x: unsigned(6 downto 0); |  | ||||||
|     signal write_y: unsigned(5 downto 0); |  | ||||||
|     signal write_value: std_logic_vector(7 downto 0); |  | ||||||
|  |  | ||||||
|     signal ra: std_logic_vector(12 downto 0); |  | ||||||
|     signal wa: std_logic_vector(12 downto 0); |  | ||||||
| begin | begin | ||||||
|  |  | ||||||
|     ra <= x(9 downto 3) & y(8 downto 3); |     read_address <= x(9 downto 3) & y(8 downto 3); | ||||||
|     wa <= std_logic_vector(write_x) & std_logic_vector(write_y); |  | ||||||
|  |  | ||||||
|     write_value <= "0" & std_logic_vector(write_x + 32); |  | ||||||
|  |  | ||||||
|     cycle_write_location: |  | ||||||
|     process(clk) |  | ||||||
|         constant max_delay: integer := 2000000; |  | ||||||
|         variable delay: integer range 0 to max_delay; |  | ||||||
|     begin |  | ||||||
|         if rising_edge(clk) then |  | ||||||
|             if delay = max_delay then |  | ||||||
|                 delay := 0; |  | ||||||
|  |  | ||||||
|                 if write_x = 79 then |  | ||||||
|                     write_x <= (others => '0'); |  | ||||||
|                     if write_y = 59 then |  | ||||||
|                         write_y <= (others => '0'); |  | ||||||
|                     else |  | ||||||
|                         write_y <= write_y + 1; |  | ||||||
|                     end if; |  | ||||||
|                 else |  | ||||||
|                     write_x <= write_x + 1; |  | ||||||
|                 end if; |  | ||||||
|             else |  | ||||||
|                 delay := delay + 1; |  | ||||||
|             end if; |  | ||||||
|         end if; |  | ||||||
|     end process cycle_write_location; |  | ||||||
|  |  | ||||||
|     terminal_buffer: entity work.terminal_buffer port map ( |     terminal_buffer: entity work.terminal_buffer port map ( | ||||||
|         clk => clk, |         clk => clk, | ||||||
|         ra => ra, |         ra => read_address, | ||||||
|         do => current_char, |         do => current_char, | ||||||
|         we => '1', |         we => write_enable, | ||||||
|         wa => wa, |         wa => write_address, | ||||||
|         di => write_value |         di => write_data | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
|     process(clk) |     process(clk) | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								main.vhd
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								main.vhd
									
									
									
									
									
								
							| @@ -51,6 +51,9 @@ begin | |||||||
|         clk => clk_vga, |         clk => clk_vga, | ||||||
|         reset => reset, |         reset => reset, | ||||||
|  |  | ||||||
|  |         write_enable => '0', | ||||||
|  |         write_data => x"00", | ||||||
|  |  | ||||||
|         dvi_d => dvi_d, |         dvi_d => dvi_d, | ||||||
|         dvi_clk_p => dvi_clk_p, |         dvi_clk_p => dvi_clk_p, | ||||||
|         dvi_clk_n => dvi_clk_n, |         dvi_clk_n => dvi_clk_n, | ||||||
|   | |||||||
							
								
								
									
										56
									
								
								terminal.vhd
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								terminal.vhd
									
									
									
									
									
								
							| @@ -15,6 +15,9 @@ entity terminal is | |||||||
|         clk: in std_logic; |         clk: in std_logic; | ||||||
|         reset: in std_logic; |         reset: in std_logic; | ||||||
|  |  | ||||||
|  |         write_enable: in std_logic; | ||||||
|  |         write_data: in std_logic_vector(7 downto 0); | ||||||
|  |  | ||||||
|         dvi_d: out std_logic_vector(11 downto 0); |         dvi_d: out std_logic_vector(11 downto 0); | ||||||
|         dvi_clk_p: out std_logic; |         dvi_clk_p: out std_logic; | ||||||
|         dvi_clk_n: out std_logic; |         dvi_clk_n: out std_logic; | ||||||
| @@ -31,8 +34,56 @@ architecture syn of terminal is | |||||||
|     signal image_x: std_logic_vector(9 downto 0); |     signal image_x: std_logic_vector(9 downto 0); | ||||||
|     signal image_y: std_logic_vector(8 downto 0); |     signal image_y: std_logic_vector(8 downto 0); | ||||||
|     signal pixel_rgb: std_logic_vector(23 downto 0); |     signal pixel_rgb: std_logic_vector(23 downto 0); | ||||||
|  |  | ||||||
|  |     signal fb_write_enable: std_logic; | ||||||
|  |     signal fb_write_address: std_logic_vector(12 downto 0); | ||||||
|  |     signal fb_write_data: std_logic_vector(7 downto 0); | ||||||
|  |  | ||||||
|  |     signal write_x: unsigned(6 downto 0); | ||||||
|  |     signal write_y: unsigned(5 downto 0); | ||||||
| begin | begin | ||||||
|  |  | ||||||
|  |     fb_write_address <= std_logic_vector(write_x) & std_logic_vector(write_y); | ||||||
|  |  | ||||||
|  |     process(clk) | ||||||
|  |         variable next_line: unsigned(5 downto 0); | ||||||
|  |     begin | ||||||
|  |         if rising_edge(clk) then | ||||||
|  |             fb_write_enable <= '0'; | ||||||
|  |             fb_write_data <= write_data; | ||||||
|  |  | ||||||
|  |             -- calculate next line | ||||||
|  |             if write_y = 59 then | ||||||
|  |                 next_line := (others => '0'); | ||||||
|  |             else | ||||||
|  |                 next_line := write_y + 1; | ||||||
|  |             end if; | ||||||
|  |  | ||||||
|  |             if write_enable = '1' then | ||||||
|  |                 fb_write_enable <= '1'; | ||||||
|  |                 if write_x = 79 then | ||||||
|  |                     write_x <= (others => '0'); | ||||||
|  |                     write_y <= next_line; | ||||||
|  |                 else | ||||||
|  |                     write_x <= write_x + 1; | ||||||
|  |                 end if; | ||||||
|  |  | ||||||
|  |                 -- carriage return | ||||||
|  |                 if write_data = x"0d" then | ||||||
|  |                     fb_write_enable <= '0'; | ||||||
|  |                     write_x <= (others => '0'); | ||||||
|  |                 end if; | ||||||
|  |  | ||||||
|  |                 -- line feed (implicit CR) | ||||||
|  |                 if write_data = x"0a" then | ||||||
|  |                     fb_write_enable <= '0'; | ||||||
|  |                     write_x <= (others => '0'); | ||||||
|  |                     write_y <= next_line; | ||||||
|  |                 end if; | ||||||
|  |             end if; | ||||||
|  |         end if; | ||||||
|  |     end process; | ||||||
|  |  | ||||||
|     dvi_clk_ds: obufds port map ( |     dvi_clk_ds: obufds port map ( | ||||||
|         I => clk, |         I => clk, | ||||||
|         O => dvi_clk_p, |         O => dvi_clk_p, | ||||||
| @@ -68,7 +119,10 @@ begin | |||||||
|         clk => clk, |         clk => clk, | ||||||
|         x => image_x, |         x => image_x, | ||||||
|         y => image_y, |         y => image_y, | ||||||
|         rgb => pixel_rgb |         rgb => pixel_rgb, | ||||||
|  |         write_enable => fb_write_enable, | ||||||
|  |         write_address => fb_write_address, | ||||||
|  |         write_data => fb_write_data | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
| end syn; | end syn; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user