--Angepasst von: https://github.com/Johnnyjax/vga-kbd-terminal library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity vga_text is port( clk, output_mode : in std_ulogic; key_code : in std_ulogic_vector(6 downto 0); video_on : in std_ulogic; pixel_x, pixel_y : in std_ulogic_vector(9 downto 0); enter_tick : in std_ulogic; up_tick, down_tick , left_tick, right_tick : in std_ulogic; bck_spc_tick : in std_ulogic; we : in std_ulogic; text_rgb : out std_ulogic_vector(2 downto 0) ); end vga_text; architecture arch of vga_text is signal char_addr : std_ulogic_vector(6 downto 0); signal rom_addr : std_ulogic_vector(10 downto 0); signal row_addr : std_ulogic_vector(3 downto 0); signal bit_addr : unsigned(2 downto 0); signal font_word : std_ulogic_vector(7 downto 0); signal font_word2 : std_ulogic_vector(7 downto 0); signal font_bit : std_ulogic; signal addr_r, addr_w : std_ulogic_vector(11 downto 0); signal din, dout : std_ulogic_vector(6 downto 0); constant MAX_X : integer := 80; constant MAX_Y : integer := 30; signal we_wth_bck : std_ulogic; signal cur_x_reg, cur_x_next : unsigned(6 downto 0); signal cur_y_reg, cur_y_next : unsigned(4 downto 0); signal move_x_tick, move_y_tick : std_ulogic; signal cursor_on : std_ulogic; signal pix_x1_reg, pix_y1_reg : unsigned(9 downto 0); signal pix_x2_reg, pix_y2_reg : unsigned(9 downto 0); signal bck_spc : std_ulogic; signal font_rgb, font_rev_rgb : std_ulogic_vector(2 downto 0); begin font_unit : entity work.morsecode_rom port map(clk => clk,addr => rom_addr, data => font_word); font_unit2: entity work.font_rom port map(clk => clk,addr => rom_addr, data2 => font_word2); video_ram : entity work.altera_dual_port_ram_sync generic map(ADDR_WIDTH => 12, DATA_WIDTH => 7) port map(clk => clk, we => we_wth_bck, addr_a => addr_w, addr_b => addr_r, din_a => din, dout_a => open, dout_b => dout); process(clk) begin if(clk'event and clk = '1') then cur_x_reg <= cur_x_next; cur_y_reg <= cur_y_next; pix_x1_reg <= unsigned(pixel_x); pix_x2_reg <= pix_x1_reg; pix_y1_reg <= unsigned(pixel_y); pix_y2_reg <= pix_y1_reg; bck_spc <= bck_spc_tick; end if; end process; we_wth_bck <= we or bck_spc; addr_w <= std_ulogic_vector(cur_y_reg & cur_x_reg); din <= (others => '0') when bck_spc = '1' else key_code; addr_r <= pixel_y(8 downto 4) & pixel_x(9 downto 3); char_addr <= dout; row_addr <= pixel_y(3 downto 0); rom_addr <= char_addr & row_addr; bit_addr <= pix_x2_reg(2 downto 0); cur_x_next <= (others => '0') when ((we = '1' or right_tick = '1') and cur_x_reg = MAX_X-1) or enter_tick = '1' or (cur_x_reg = 0 and cur_y_reg = 0 and bck_spc_tick = '1')else cur_x_reg + 1 when we = '1' or right_tick = '1' else "1001111" when ((left_tick = '1' or bck_spc_tick = '1') and cur_x_reg = 0) else cur_x_reg - 1 when left_tick = '1' or bck_spc_tick = '1' else cur_x_reg; cur_y_next <= (others => '0') when (down_tick = '1' and cur_y_reg = MAX_Y-1) or (cur_x_reg = 0 and cur_y_reg = 0 and bck_spc_tick = '1') else "11101" when up_tick = '1' and cur_y_reg = 0 else cur_y_reg + 1 when enter_tick = '1' or down_tick = '1' or (we = '1' and cur_x_reg = MAX_X -1) else cur_y_reg - 1 when up_tick = '1' or (bck_spc_tick = '1' and cur_x_reg = 0) else cur_y_reg; font_rgb <= "000" when font_bit = '1' else "111"; font_rev_rgb <= "000" when font_bit = '1' else "010"; cursor_on <= '1' when pix_y2_reg(8 downto 4) = cur_y_reg and pix_y2_reg(3 downto 0) >= "1110" and pix_x2_reg(9 downto 3) = cur_x_reg else '0'; process(video_on, cursor_on, font_rgb, font_rev_rgb, output_mode, font_bit, bit_addr, font_word, font_word2) begin if video_on = '0' then text_rgb <= "000"; else if cursor_on = '1' then text_rgb <= font_rev_rgb; else text_rgb <= font_rgb; if output_mode = '1' then -- Wechsel zwischen Ausgabe als Morsezeichen oder Buchstaben font_bit <= font_word2(to_integer(not bit_addr)); else font_bit <= font_word(to_integer(not bit_addr)); end if; end if; end if; end process; end arch; --Angepasst von: https://github.com/Johnnyjax/vga-kbd-terminal -- Listing 13.1 -- ROM with synchonous read (inferring Block RAM) -- character ROM -- - 8-by-16 (8-by-2^4) font -- - 128 (2^7) characters -- - ROM size: 512-by-8 (2^11-by-8) bits -- 16K bits: 1 BRAM library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity morsecode_rom is port( clk: in std_ulogic; addr: in std_ulogic_vector(10 downto 0); data: out std_ulogic_vector(7 downto 0) ); end morsecode_rom; architecture arch of morsecode_rom is constant ADDR_WIDTH: integer:=11; constant DATA_WIDTH: integer:=8; signal data_reg: std_ulogic_vector(DATA_WIDTH-1 downto 0); type rom_type is array (0 to 2**ADDR_WIDTH-1) of std_ulogic_vector(DATA_WIDTH-1 downto 0); -- ROM definition constant ROM: rom_type:=( -- 2^11-by-8 ... -- code x41 (A) "00011000", -- 0 "00011000", -- 1 "00000000", -- 2 "00000000", -- 3 "01111110", -- 4 "00000000", -- 5 "00000000", -- 6 "00000000", -- 7 "00000000", -- 8 "00000000", -- 9 "00000000", -- a "00000000", -- b "00000000", -- c "00000000", -- d "00000000", -- e "00000000", -- f -- code x42 (B) "01111110", -- 0 "00000000", -- 1 "00000000", -- 2 "00011000", -- 3 "00011000", -- 4 "00000000", -- 5 "00000000", -- 6 "00011000", -- 7 "00011000", -- 8 "00000000", -- 9 "00000000", -- a "00011000", -- b "00011000", -- c "00000000", -- d "00000000", -- e "00000000", -- f -- code x43 (C) "01111110", -- 0 "00000000", -- 1 "00000000", -- 2 "00011000", -- 3 "00011000", -- 4 "00000000", -- 5 "00000000", -- 6 "01111110", -- 7 "00000000", -- 8 "00000000", -- 9 "00011000", -- a "00011000", -- b "00000000", -- c "00000000", -- d "00000000", -- e "00000000", -- f -- code x44 (D) "01111110", -- 0 "00000000", -- 1 "00000000", -- 2 "00011000", -- 3 "00011000", -- 4 "00000000", -- 5 "00000000", -- 6 "00011000", -- 7 "00011000", -- 8 "00000000", -- 9 "00000000", -- a "00000000", -- b "00000000", -- c "00000000", -- d "00000000", -- e "00000000", -- f ...