Files
nascom2_t80/videogen.vhd
2009-01-15 19:17:56 +00:00

133 lines
3.7 KiB
VHDL
Executable File

----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 16:39:57 12/11/2008
-- Design Name:
-- Module Name: adrgen - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity videogen is
Port ( ROW : in STD_LOGIC_VECTOR (9 downto 0);
COLUMN : in STD_LOGIC_VECTOR (9 downto 0);
CLK : in STD_LOGIC;
RED, GREEN, BLUE : out STD_LOGIC_VECTOR(3 downto 0);
VRAM_ADDR_O : out STD_LOGIC_VECTOR(9 downto 0);
VRAM_DATA_I : in STD_LOGIC_VECTOR(7 downto 0)
);
end videogen;
architecture Behavioral of videogen is
component charrom IS
port (
clka: IN std_logic;
addra: IN std_logic_VECTOR(10 downto 0);
douta: OUT std_logic_VECTOR(7 downto 0));
END component;
signal chrx_i: std_logic_vector(2 downto 0) := "000"; -- h pos in char
signal chry_i: std_logic_vector(3 downto 0) := "0000"; -- v pos in char
signal scradrx_i: std_logic_vector(6 downto 0) := "0001010"; -- adr in ram line
signal scradry_i: std_logic_vector(11 downto 0) := X"3C0"; -- line ofs
-- in ram
signal oe_i, oe_d1, oe_d2, oe_d3, oe_o: std_logic := '0'; -- output enable
-- delay ff chain
signal charrom_addr : std_logic_vector(10 downto 0);
signal charrom_data : std_logic_vector(7 downto 0);
signal out_i : std_logic;
begin
adrgen: process (CLK)
begin
if rising_edge(CLK) then
chrx_i <= COLUMN(2 downto 0);
chry_i <= ROW(3 downto 0);
if (COLUMN < 384) and (ROW < 256) then -- nascom 48x16 characters mode
oe_i <= '1';
if (chrx_i = "111") and (COLUMN(2 downto 0) = "000") then
if scradrx_i = 57 then
scradrx_i <= "0001010";
else
scradrx_i <= scradrx_i + 1;
end if;
end if;
else
oe_i <= '0';
end if;
if ROW < 256 then
if (not (chry_i = "0000")) and (ROW(3 downto 0) = "0000") then
if scradry_i = 960 then
scradry_i <= X"000";
else
scradry_i <= scradry_i + 64;
end if;
end if;
end if;
end if;
end process;
VRAM_ADDR_O <= scradry_i(9 downto 0) + scradrx_i;
charrom_addr(10 downto 4) <= VRAM_DATA_I(6 downto 0);
charrom_addr(3 downto 0) <= chry_i;
charrom_inst: charrom port map( clka => CLK,
addra => charrom_addr,
douta => charrom_data);
vgen: process (CLK)
variable bitmap: std_logic_vector(7 downto 0) := "00000000";
begin
if rising_edge(CLK) then
if chrx_i = 3 then
bitmap := charrom_data;
end if;
out_i <= bitmap(conv_integer(2 - chrx_i));
end if;
end process;
oe_delay: process (CLK)
begin
if rising_edge(CLK) then
oe_d1 <= oe_i;
oe_d2 <= oe_d1;
oe_d3 <= oe_d2;
oe_o <= oe_d3;
end if;
end process;
RED <= (others => out_i) when oe_o = '1' else "0000";
GREEN <= (others => out_i) when oe_o = '1' else "0000";
BLUE <= (others => out_i) when oe_o = '1' else "0000";
--CHRX <= chrx_i;
--CHRY <= chry_i;
--SCRADR <= scradrx_i + scradry_i;
--OE <= oe_i;
end Behavioral;