Project

General

Profile

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
use work.pixels.all;

ENTITY multiscale IS
GENERIC(
enable_area : integer := 1;
enable_polyphasic : integer := 1
);
PORT(
clock : IN STD_LOGIC; --system clock
reset_n : IN STD_LOGIC; --asynchronous reset

scaler_select : IN STD_LOGIC; -- 0==areascale/1==polyphasic
-- need to know:
-- block of 4 pixels (x,y:x+1,y:x,y+1:x+1,y+1)
-- relative scale ratios
--p1 : in std_logic_vector(23 downto 0); --RGB
--p2 : in std_logic_vector(23 downto 0); --RGB
--p3 : in std_logic_vector(23 downto 0); --RGB
--p4 : in std_logic_vector(23 downto 0); --RGB
pixels : in t_Pixel4x4;

-- next output line
next_y_in : in std_logic;
next_frame_in : in std_logic;
field2 : in std_logic;
-- sync/blank from crtc -> need to be delayed in line with pipeline
hsync_in : in std_logic;
vsync_in : in std_logic;
blank_in : in std_logic;
-- need to provide control signals:
next_x : OUT STD_LOGIC;
next_x_size : out std_logic_vector(1 downto 0);
next_y : OUT STD_LOGIC;

-- need to output
-- current pixel
r : out std_logic_vector(7 downto 0);
g : out std_logic_vector(7 downto 0);
b : out std_logic_vector(7 downto 0);
hsync : out std_logic;
vsync : out std_logic;
blank : out std_logic;
-- to set up params
scl_in : in std_logic;
sda_in : in std_logic;
scl_wen : out std_logic;
sda_wen : out std_logic
);
END multiscale;

ARCHITECTURE vhdl OF multiscale IS

signal poly_red_next : std_logic_vector(7 downto 0);
signal poly_green_next : std_logic_vector(7 downto 0);
signal poly_blue_next : std_logic_vector(7 downto 0);
signal poly_hsync_next : std_logic;
signal poly_vsync_next : std_logic;
signal poly_blank_next : std_logic;
signal poly_next_x : STD_LOGIC;
signal poly_next_x_size : std_logic_vector(1 downto 0);
signal poly_next_y : STD_LOGIC;

signal area_red_next : std_logic_vector(7 downto 0);
signal area_green_next : std_logic_vector(7 downto 0);
signal area_blue_next : std_logic_vector(7 downto 0);
signal area_hsync_next : std_logic;
signal area_vsync_next : std_logic;
signal area_blank_next : std_logic;
signal area_next_x : STD_LOGIC;
signal area_next_x_size : std_logic_vector(1 downto 0);
signal area_next_y : STD_LOGIC;

signal scl_area_wen : std_logic;
signal sda_area_wen : std_logic;
signal scl_poly_wen : std_logic;
signal sda_poly_wen : std_logic;
BEGIN
gen_polyphasic_on : if enable_polyphasic=1 generate

polyphasicscale_impl : entity work.polyphasicscale
port map
(
CLOCK => CLOCK,
RESET_N => reset_n,

pixels => pixels,
next_y_in => next_y_in, --reset_x
next_frame_in => next_frame_in, --reset y
next_x => poly_next_x,
next_y => poly_next_y,
next_x_size => poly_next_x_size,
field2 => field2, -- field 2 is half lower
hsync_in => hsync_in,
vsync_in => vsync_in,
blank_in => blank_in,

r => poly_red_next,
g => poly_green_next,
b => poly_blue_next,
hsync => poly_hsync_next,
vsync => poly_vsync_next,
blank => poly_blank_next,
scl_in => scl_in,
sda_in => sda_in,
scl_wen => scl_poly_wen,
sda_wen => sda_poly_wen
);
end generate gen_polyphasic_on;
gen_area_on : if enable_area=1 generate
areascale_impl : entity work.areascale
port map
(
CLOCK => CLOCK,
RESET_N => reset_n,

pixels => pixel_to2x2(pixels),
next_y_in => next_y_in, --reset_x
next_frame_in => next_frame_in, --reset y
next_x => area_next_x,
next_y => area_next_y,
next_x_size => area_next_x_size,
field2 => field2, -- field 2 is half lower
hsync_in => hsync_in,
vsync_in => vsync_in,
blank_in => blank_in,

r => area_red_next,
g => area_green_next,
b => area_blue_next,
hsync => area_hsync_next,
vsync => area_vsync_next,
blank => area_blank_next,
scl_in => scl_in,
sda_in => sda_in,
scl_wen => scl_area_wen,
sda_wen => sda_area_wen
);
end generate gen_area_on;
gen_select_on : if enable_area=1 and enable_polyphasic=1 generate
process(scaler_select,
area_red_next,area_green_next,area_blue_next,
area_hsync_next,area_vsync_next,area_blank_next,
area_next_x,area_next_y,area_next_x_size,
poly_red_next,poly_green_next,poly_blue_next,
poly_hsync_next,poly_vsync_next,poly_blank_next,
poly_next_x,poly_next_y,poly_next_x_size)
begin
if (scaler_select='0') then
r <= area_red_next;
g <= area_green_next;
b <= area_blue_next;
hsync <= area_hsync_next;
vsync <= area_vsync_next;
blank <= area_blank_next;
next_x <= area_next_x;
next_y <= area_next_y;
next_x_size <= area_next_x_size;
else
r <= poly_red_next;
g <= poly_green_next;
b <= poly_blue_next;
hsync <= poly_hsync_next;
vsync <= poly_vsync_next;
blank <= poly_blank_next;
next_x <= poly_next_x;
next_y <= poly_next_y;
next_x_size <= poly_next_x_size;
end if;
end process;

scl_wen <= scl_area_wen or scl_poly_wen;
sda_wen <= sda_area_wen or sda_poly_wen;
end generate gen_select_on;

gen_fixed_area : if enable_area=1 and enable_polyphasic=0 generate
r <= area_red_next;
g <= area_green_next;
b <= area_blue_next;
hsync <= area_hsync_next;
vsync <= area_vsync_next;
blank <= area_blank_next;
next_x <= area_next_x;
next_y <= area_next_y;
next_x_size <= area_next_x_size;

scl_wen <= scl_area_wen;
sda_wen <= sda_area_wen;
end generate gen_fixed_area;

gen_fixed_poly : if enable_area=0 and enable_polyphasic=1 generate
r <= poly_red_next;
g <= poly_green_next;
b <= poly_blue_next;
hsync <= poly_hsync_next;
vsync <= poly_vsync_next;
blank <= poly_blank_next;
next_x <= poly_next_x;
next_y <= poly_next_y;
next_x_size <= poly_next_x_size;

scl_wen <= scl_poly_wen;
sda_wen <= sda_poly_wen;
end generate gen_fixed_poly;

gen_none : if enable_area=0 and enable_polyphasic=0 generate
-- TODO: nearest neighbour?
end generate gen_none;

END vhdl;
(3-3/6)