1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-02-19 13:55:09 +00:00
Files
Gehstock.Mist_FPGA/Computer_MiST/ORAO_MiST/rtl/OraoGraphDisplay8K.vhd
Gehstock b4920d3288 1
2018-10-27 14:54:23 +02:00

122 lines
2.8 KiB
VHDL

-- 8K 256x256 graphics by Emard 2015
-- License=GPL
-- Modified Grant Searle's text display to show bitmap graphics
-- Acknowledgement to his great work!
-- main web site http://searle.hostei.com/grant/
-- UK101 page at http://searle.hostei.com/grant/uk101FPGA/index.html
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity OraoGraphDisplay8K is
port (
dispAddr : out std_LOGIC_VECTOR(12 downto 0);
dispData : in std_LOGIC_VECTOR(7 downto 0);
clk : in std_logic;
video : out std_logic;
h_sync : out std_logic;
v_sync : out std_logic;
sync : out std_logic
);
end OraoGraphDisplay8K;
architecture rtl of OraoGraphDisplay8K is
signal hSync : std_logic := '1';
signal vSync : std_logic := '1';
signal vActive : std_logic := '0';
signal hActive : std_logic := '0';
signal pixelClockCount: STD_LOGIC_VECTOR(3 DOWNTO 0);
signal pixelCount: STD_LOGIC_VECTOR(2 DOWNTO 0);
signal horizCount: STD_LOGIC_VECTOR(11 DOWNTO 0);
signal vertLineCount: STD_LOGIC_VECTOR(8 DOWNTO 0);
signal charHoriz: STD_LOGIC_VECTOR(12 DOWNTO 0);
signal charBit: STD_LOGIC_VECTOR(3 DOWNTO 0);
signal charData: std_LOGIC_VECTOR(7 downto 0);
begin
sync <= hSync and vSync;
h_sync <= hSync;
v_sync <= vSync;
dispAddr <= charHoriz;
charData <= dispData;
PROCESS (clk)
BEGIN
-- Orao display 256x256 bitmap 8K
-- 5 lines vsync
-- 30 lines to start of display
-- 313 lines per frame
-- 64uS per horiz line (3200 clocks)
-- 4.7us horiz sync (235 clocks)
if rising_edge(clk) then
IF horizCount < 3200 THEN
horizCount <= horizCount + 1;
-- horizontal position of the screen
if (horizCount < 780) or (horizCount > 2830) then
hActive <= '0';
pixelClockCount <= (others => '0');
else
hActive <= '1';
end if;
else
horizCount<= (others => '0');
pixelCount<= (others => '0');
if vertLineCount > 312 then
vertLineCount <= (others => '0');
else
if vertLineCount < 38 or vertLineCount > 293 then
vActive <= '0';
charHoriz <= (others => '0');
else
vActive <= '1';
end if;
vertLineCount <=vertLineCount+1;
end if;
END IF;
if horizCount < 235 then
hSync <= '0';
else
hSync <= '1';
end if;
if vertLineCount < 5 then
vSync <= '0';
else
vSync <= '1';
end if;
if hActive='1' and vActive = '1' then
if pixelClockCount < 7 then
pixelClockCount <= pixelClockCount+1;
else
video <= charData(conv_integer(pixelCount));
pixelClockCount <= (others => '0');
if pixelCount = 7 then
charHoriz <= charHoriz+1;
end if;
pixelCount <= pixelCount+1;
end if;
else
video <= '0';
end if;
end if;
END PROCESS;
end rtl;