diff --git a/dvi_test.xise b/dvi_test.xise index 508ce9d..a178c8a 100644 --- a/dvi_test.xise +++ b/dvi_test.xise @@ -44,10 +44,6 @@ - - - - @@ -56,6 +52,10 @@ + + + + diff --git a/font.hex b/font.hex new file mode 100644 index 0000000..3fbcef4 --- /dev/null +++ b/font.hex @@ -0,0 +1,129 @@ +# IBM, Marcel Sondaar, Daniel Hepper bitmap font (public domain, https://github.com/dhepper/font8x8) +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +00180018183C3C18 +0000000000003636 +0036367F367F3636 +000C1F301E033E0C +0063660C18336300 +006E333B6E1C361C +0000000000030606 +00180C0606060C18 +00060C1818180C06 +0000663CFF3C6600 +00000C0C3F0C0C00 +060C0C0000000000 +000000003F000000 +000C0C0000000000 +000103060C183060 +003E676F7B73633E +003F0C0C0C0C0E0C +003F33061C30331E +001E33301C30331E +0078307F33363C38 +001E3330301F033F +001E33331F03061C +000C0C0C1830333F +001E33331E33331E +000E18303E33331E +000C0C00000C0C00 +060C0C00000C0C00 +00180C0603060C18 +00003F00003F0000 +00060C1830180C06 +000C000C1830331E +001E037B7B7B633E +0033333F33331E0C +003F66663E66663F +003C66030303663C +001F36666666361F +007F46161E16467F +000F06161E16467F +007C66730303663C +003333333F333333 +001E0C0C0C0C0C1E +001E333330303078 +006766361E366667 +007F66460606060F +0063636B7F7F7763 +006363737B6F6763 +001C36636363361C +000F06063E66663F +00381E3B3333331E +006766363E66663F +001E33380E07331E +001E0C0C0C0C2D3F +003F333333333333 +000C1E3333333333 +0063777F6B636363 +0063361C1C366363 +001E0C0C1E333333 +007F664C1831637F +001E06060606061E +00406030180C0603 +001E18181818181E +0000000063361C08 +FF00000000000000 +0000000000180C0C +006E333E301E0000 +003B66663E060607 +001E3303331E0000 +006E33333e303038 +001E033f331E0000 +000F06060f06361C +1F303E33336E0000 +006766666E360607 +001E0C0C0C0E000C +1E33333030300030 +0067361E36660607 +001E0C0C0C0C0C0E +00636B7F7F330000 +00333333331F0000 +001E3333331E0000 +0F063E66663B0000 +78303E33336E0000 +000F06666E3B0000 +001F301E033E0000 +00182C0C0C3E0C08 +006E333333330000 +000C1E3333330000 +00367F7F6B630000 +0063361C36630000 +1F303E3333330000 +003F260C193F0000 +00380C0C070C0C38 +0018181800181818 +00070C0C380C0C07 +0000000000003B6E +0000000000000000 diff --git a/font_rom.vhd b/font_rom.vhd new file mode 100644 index 0000000..5b29265 --- /dev/null +++ b/font_rom.vhd @@ -0,0 +1,87 @@ +library ieee; + +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +use std.textio.all; +use ieee.std_logic_textio.all; + +entity font_rom is + generic ( + input_clk: integer + ); + port ( + clk: in std_logic; + x, y: in std_logic_vector(9 downto 0); + + rgb: out std_logic_vector(23 downto 0) + ); +end font_rom; + +architecture logic of font_rom is + type rom_type is array(0 to 127) of std_logic_vector(63 downto 0); + type framebuffer_type is array(0 to 59, 0 to 79) of std_logic_vector(7 downto 0); + + impure function read_font(filename: in string) return rom_type is + file rom_file: text is in filename; + variable rom_line: line; + variable rom: rom_type; + begin + -- skip comment in first line + readline(rom_file, rom_line); + + for i in rom_type'range loop + readline(rom_file, rom_line); + hread(rom_line, rom(i)); + end loop; + + return rom; + end function; + + constant font: rom_type := read_font("font.hex"); + + constant framebuffer: framebuffer_type := ( + 0 => (x"48", x"61", x"6C", x"6c", x"6f", others => x"00"), + 1 to 59 => (others => x"00") + ); + + signal char_x: integer range 0 to 79; + signal char_y: integer range 0 to 59; + signal current_char: std_logic_vector(7 downto 0); + + signal current_glyph: std_logic_vector(63 downto 0); + signal current_glyph_pos: integer range 0 to 127; + + signal glyph_pos_raw: std_logic_vector(5 downto 0); + signal glyph_pos: integer range 0 to 63; +begin + + char_x <= to_integer(unsigned(x(9 downto 3))); + char_y <= to_integer(unsigned(y(9 downto 3))); + + process(clk) is + begin + if rising_edge(clk) then + current_char <= framebuffer(char_y, char_x); + end if; + end process; + + current_glyph_pos <= to_integer(unsigned(current_char)); + + process(clk) is + begin + if rising_edge(clk) then + current_glyph <= font(current_glyph_pos); + end if; + end process; + + glyph_pos_raw <= y(2 downto 0) & x(2 downto 0); + glyph_pos <= to_integer(unsigned(glyph_pos_raw)); + + -- actually currently BRG + rgb <= + "111111111111111111111111" when current_glyph(glyph_pos) = '1' else + "000000000000000000000000"; + +end logic; diff --git a/main.vhd b/main.vhd index 1c37a67..5f2970d 100644 --- a/main.vhd +++ b/main.vhd @@ -85,14 +85,12 @@ begin dvi_de => de ); - image_generator_i: entity work.image_generator generic map ( + framebuffer: entity work.font_rom generic map ( input_clk => 48_000_000 ) port map ( clk => clk_vga, x => image_x, y => image_y, - ctrl_up => rotary_up, - ctrl_down => rotary_down, rgb => pixel_rgb );