Files
vhdl/projects/vga_ctrl/src/vga_ctrl_top.vhd
T
jens f538cb1577 - removed sys_vga_clk_out
git-svn-id: http://moon:8086/svn/vhdl/trunk@1578 cc03376c-175c-47c8-b038-4cd826a8556b
2021-03-29 14:18:11 +00:00

391 lines
9.6 KiB
VHDL

--------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 11:25:45 10/15/05
-- Design Name:
-- Module Name: vga_ctrl_top - Behavioral
-- Project Name:
-- Target Device:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
--------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use work.vga_types.all;
use work.cpu_pkg.all;
entity vga_ctrl_top is
Generic
(
tsvga : vga_timespec_t := ts_vga_1280_1024_72
);
Port
(
sys_rst_in : in std_logic;
sys_clk_in : in std_logic;
-- VGA signals
sys_vga_clk_in : in std_logic;
sys_vga_clk_ce : in std_logic;
sys_vga_red : out unsigned(7 downto 0);
sys_vga_green : out unsigned(7 downto 0);
sys_vga_blue : out unsigned(7 downto 0);
sys_vga_blank_n : out std_logic;
sys_vga_sync_n : out std_logic;
sys_vga_hsync : out std_logic;
sys_vga_vsync : out std_logic;
-- Buttons and LEDs
sys_btn : in unsigned(4 downto 0);
sys_dip : in unsigned(7 downto 0);
sys_led : out unsigned(8 downto 0)
);
end vga_ctrl_top;
architecture Behavioral of vga_ctrl_top is
-- System signal
signal rst : std_logic;
signal clk : std_logic;
signal vga_clk : std_logic;
-- Timing
signal src_pos_x : natural range 0 to tsvga.ts_h.ncyc_scan-1;
signal src_pos_y : natural range 0 to tsvga.ts_v.ncyc_scan-1;
-- Backend signals
signal scan_rdy : std_logic;
signal ctrl_scan_en : std_logic;
signal color_in : color_array_t;
signal color_op : color_op_t;
signal color_en : unsigned (VGA_NUM_CH-1 downto 0);
signal stat_vga_rdy : std_logic;
signal stat_hready : std_logic;
signal stat_vready : std_logic;
signal stat_scan : std_logic;
signal stat_hscan : std_logic;
signal stat_vscan : std_logic;
signal stat_hsync : std_logic;
signal stat_vsync : std_logic;
signal stat_hpos : natural range 0 to tsvga.ts_h.ncyc_scan-1;
signal stat_vpos : natural range 0 to tsvga.ts_v.ncyc_scan-1;
-- CG signals
signal cg_en : std_logic;
signal cg_rdy : std_logic;
signal cg_draw : std_logic;
signal cg_clr_screen : std_logic;
signal cg_clr_line : std_logic;
signal cg_din : unsigned(7 downto 0);
signal cg_dout : unsigned(7 downto 0);
signal cg_ascii_we : std_logic;
signal cg_posy_we : std_logic;
signal cg_posx_we : std_logic;
signal cg_color : color_t;
signal cg_csr_pos_x : natural range 0 to 80-1;
signal cg_csr_pos_y : natural range 0 to 32-1;
-- CPU signals
signal cpu_rst : std_logic;
signal cpu_ce : std_logic;
signal cpu_int_in : std_logic;
signal cpu_int_ack : std_logic;
signal cpu_we : std_logic;
signal cpu_re : std_logic;
signal cpu_io_sel : std_logic;
signal cpu_din : dmem_data_t;
signal cpu_dout : dmem_data_t;
signal cpu_addr : dmem_addr_t;
signal cpu_xrom_data : dmem_data_t;
signal cpu_led : dmem_data_t;
signal cpu_red : dmem_data_t;
signal cpu_green : dmem_data_t;
signal cpu_blue : dmem_data_t;
signal cpu_color : color_t;
signal proc_color : color_t;
begin
inst_vga_backend : entity work.vga_backend
GENERIC MAP
(
tsvga => tsvga
)
PORT MAP
(
-- System signals
sys_rst => rst,
sys_clk => clk,
-- Color channels
color_in => color_in,
color_op => color_op,
color_en => color_en,
-- Control signals
ctrl_scan_en => ctrl_scan_en,
-- Status signals
stat_vga_rdy => stat_vga_rdy,
stat_scan => stat_scan,
stat_hsync => stat_hsync,
stat_vsync => stat_vsync,
stat_hready => stat_hready,
stat_vready => stat_vready,
stat_hscan => stat_hscan,
stat_vscan => stat_vscan,
stat_hpos => stat_hpos,
stat_vpos => stat_vpos,
-- VGA domain signals
vga_clk_in => sys_vga_clk_in,
vga_clk_ce => sys_vga_clk_ce,
vga_red => sys_vga_red,
vga_green => sys_vga_green,
vga_blue => sys_vga_blue,
vga_blank_n => sys_vga_blank_n,
vga_sync_n => sys_vga_sync_n,
vga_hsync => sys_vga_hsync,
vga_vsync => sys_vga_vsync
);
vga_clk <= sys_vga_clk_in;
ctrl_scan_en <= '1';
color_en(0) <= '1';
color_en(1) <= cg_draw;
color_in(0) <= cpu_color;
color_in(1) <= cg_color; --(X"FF", X"FF", X"FF", X"FF"); -- white opaque
color_op <= op_over;
inst_char_gen : entity work.char_gen
GENERIC MAP
(
tsvga => tsvga,
CHARACTER_SCALE => 1,
CHAR_ROM_SIZE_X => 8, -- Pixels
CHAR_ROM_SIZE_Y => 16, -- Pixels
CHAR_ROM_DEPTH => 256, -- Chars
MAX_CHAR_PER_LINE => 80, -- Chars
MAX_LINE_PER_FRAME => 32, -- Chars
CHAR_SPACING_X => 0, -- Pixels
CHAR_SPACING_Y => 0, -- Pixels
SCREEN_OFFSET_X => 16, -- Pixels
SCREEN_OFFSET_Y => 16 -- Pixels
)
PORT MAP
(
rst => rst,
sys_clk => clk,
vga_clk => vga_clk,
ce => cg_en,
frame_pulse => scan_rdy,
clr_screen => cg_clr_screen,
clr_line => cg_clr_line,
din => cg_din,
dout => cg_dout,
ascii_we => cg_ascii_we,
posy_we => cg_posy_we,
posx_we => cg_posx_we,
ready => cg_rdy,
scan_pos_x_in => stat_hpos,
scan_pos_y_in => stat_vpos,
csr_pos_x_out => cg_csr_pos_x,
csr_pos_y_out => cg_csr_pos_y,
char_draw_en => cg_draw
);
inst_cpu_embedded: entity work.cpu_embedded
PORT MAP
(
rst => cpu_rst,
clk => clk,
ce => cpu_ce,
int_in => cpu_int_in,
int_ack => cpu_int_ack,
xmem_we => cpu_we,
xmem_re => cpu_re,
xmem_din => cpu_din,
xmem_dout => cpu_dout,
xmem_addr => cpu_addr,
io_sel => cpu_io_sel
);
inst_xrom: entity work.xrom
PORT MAP
(
clk => clk,
ce => cpu_ce,
addr => cpu_addr,
dout => cpu_xrom_data
);
---------------------------------------------------------------------------------------------
rst <= sys_rst_in and stat_vga_rdy;
clk <= sys_clk_in;
scan_rdy <= stat_hready and stat_vready;
cg_en <= stat_scan;
cpu_ce <= '1';
cpu_int_in <= '0';
---------------------------------------------------------------------------------------------
led_out: process (clk)
begin
if rising_edge(clk) then
sys_led <= '0' & cpu_led;
end if;
end process;
---------------------------------------------------------------------------------------------
cpu_reg_read:
process(clk, cpu_io_sel, cpu_xrom_data)
variable reg : dmem_data_t;
begin
if rising_edge(clk) then
case cpu_addr is
when X"00" => -- 00
reg := "000" & unsigned(sys_btn(4 downto 0));
when X"01" => -- 01
reg := cpu_led;
when X"05" => -- 05
reg := unsigned(sys_dip);
when X"0B" =>
reg := "000000" & cg_rdy & stat_vga_rdy;
when others => null;
end case;
end if;
cpu_din <= cpu_xrom_data;
if cpu_io_sel = '1' then
cpu_din <= reg;
end if;
end process;
------------------------------------------------------------------
cpu_reg_write:
process(rst, clk)
variable addr : unsigned(dmem_addr_t'length-1 downto 0);
begin
if (rst = '1') then
cpu_led <= (others => '0');
cg_din <= (others => '0');
cg_posy_we <= '0';
cg_posx_we <= '0';
cg_ascii_we <= '0';
cg_clr_line <= '0';
cg_clr_screen <= '0';
cpu_red <= X"80";
cpu_green <= X"80";
cpu_blue <= X"80";
elsif rising_edge(clk) then
cg_posy_we <= '0';
cg_posx_we <= '0';
cg_ascii_we <= '0';
cg_clr_line <= '0';
cg_clr_screen <= '0';
addr := cpu_addr;
if cpu_we = '1' then
if cpu_io_sel = '1' then
case addr is
when X"01" => -- 01
cpu_led <= cpu_dout;
when X"02" => -- 04
cpu_red <= cpu_dout;
when X"03" => -- 04
cpu_green <= cpu_dout;
when X"04" => -- 04
cpu_blue <= cpu_dout;
when X"08" => -- 08
cg_din <= cpu_dout;
cg_posx_we <= '1';
when X"09" => -- 09
cg_din <= cpu_dout;
cg_posy_we <= '1';
when X"0A" => -- 0A
cg_din <= cpu_dout;
cg_ascii_we <= '1';
when X"0B" => -- 0B
cg_clr_screen <= cpu_dout(0);
cg_clr_line <= cpu_dout(1);
when others => null;
end case;
end if;
end if;
end if;
end process;
---------------------------------------------------------------------------------------------
--- Test
---------------------------------------------------------------------------------------------
cpu_start: process (clk)
begin
if rising_edge(vga_clk) then
if rst = '1' then
cpu_rst <= '1';
else
cpu_rst <= not stat_vga_rdy;
end if;
end if;
end process;
color_sel: process (vga_clk)
begin
if rising_edge(vga_clk) and scan_rdy = '1' then
cpu_color <= (cpu_red, cpu_green, cpu_blue, X"00");
end if;
end process;
color_ctrl: process (clk)
variable enable : std_logic;
begin
if rising_edge(clk) then
if (rst = '1') then
src_pos_x <= 0;
src_pos_y <= 0;
elsif stat_scan = '1' then
if src_pos_x < tsvga.ts_h.ncyc_scan-1 then
src_pos_x <= src_pos_x + 1;
else
src_pos_x <= 0;
if src_pos_y < tsvga.ts_v.ncyc_scan-1 then
src_pos_y <= src_pos_y + 1;
else
src_pos_y <= 0;
end if;
end if;
end if;
end if;
end process;
color_proc: process (src_pos_x, src_pos_y)
begin
proc_color <= (X"00", X"00", X"00", X"00");
if src_pos_y = 0 then
proc_color <= (X"00", X"FF", X"00", X"00");
elsif src_pos_y = (tsvga.ts_v.ncyc_scan-1) then
proc_color <= (X"00", X"FF", X"00", X"00");
elsif src_pos_x = 0 then
proc_color <= (X"FF", X"00", X"00", X"00");
elsif src_pos_x = (tsvga.ts_h.ncyc_scan-1) then
proc_color <= (X"00", X"00", X"FF", X"00");
end if;
end process;
end Behavioral;