------------------------------------------------------------------------------ -- Affaire : ROBOT -- Carte : Camera -- EPLD : Epld_ -- Fonction : Ball Finder v2 ! -- Author : EIRBOT 2003 ENSEIRB -- Date : 25.10.2002 ------------------------------------------------------------------------------ -- TODO -- * envoie des donnees du palet library IEEE, work; use IEEE.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.numeric_std.all; use work.all; entity ballfind is port ( LLC2 : in std_logic; RESETn : in std_logic; BYPASS : in std_logic; STROBE : in std_logic; HS : in std_logic; -- SAA: synchro trame VS : in std_logic; -- SAA: synchro ligne HREF : in std_logic; -- SAA: pixels actifs VREF : in std_logic; EPROM : in std_logic_vector(7 downto 0); OUT_RED : out std_logic; OUT_BLU : out std_logic; OUT_GRE : out std_logic; VREF_XIL : out std_logic; LLC2_XIL : out std_logic; HREF_XIL : out std_logic; d_out : out std_logic_vector(11 downto 0); INT4 : out std_logic; INT5 : out std_logic; INT6 : out std_logic; INT7 : out std_logic ); end ballfind; architecture structure of ballfind is signal s_int4, s_int5, s_int6, s_int7 : std_logic; signal old_strobe : std_logic; signal cpt_strobe : std_logic_vector(5 downto 0); -- Pour comptage pixel et comptage hs signal cpt_pixel : integer range 0 to 1023; -- il faut passer a 1023 grace a llc2 signal cpt_hs : integer range 0 to 511; signal hs_old : std_logic; signal reset_l, reset_x : std_logic; signal in_red, in_blu, in_gre : std_logic; ------------------------------------------------------------------------------- -- constantes de fenetrage CONSTANT window_up : integer range 0 to 511:= 10; CONSTANT window_down : integer range 0 to 511:= 270; CONSTANT window_left : integer range 0 to 1023:= 50; CONSTANT window_right : integer range 0 to 1023:= 670; -- seuils de tolerance ligne proche constant seuil_pixel : integer := 15; constant seuil_ligne : integer := 5; -- taille min d'un palet constant hauteur_min : integer := 3; constant largeur_min : integer := 7; -- non utilise, ca rentre pas sinon -- reglages filtre sur 1 ligne constant filtre_precision : integer := 16; constant filtre_largeur : integer := 8; ------------------------------------------------------------------------------- -- filtre et fenetrage signal p0_red, p0_gre, p0_blu : std_logic; signal row_p0 : integer range 0 to 1023; signal reset_f : std_logic; ------------------------------------------------------------------------------- signal pixel_vector : std_logic_vector(9 downto 0); signal line_vector : std_logic_vector(8 downto 0); signal choix_vector : std_logic_vector(1 downto 0); signal palet_vector : std_logic_vector(3 downto 0); -- 16 palets ------------------------------------------------------------------------------- -- reset palets signal reset_p : std_logic; -- palet 1 signal p1_red, p1_gre, p1_blu : std_logic; signal row_p1 : integer range 0 to 1023; signal en_win1 : std_logic; signal p1_data : std_logic_vector(11 downto 0); -- palet 2 signal p2_red, p2_gre, p2_blu : std_logic; signal row_p2 : integer range 0 to 1023; signal en_win2 : std_logic; signal p2_data : std_logic_vector(11 downto 0); -- palet 3 signal p3_red, p3_gre, p3_blu : std_logic; signal row_p3 : integer range 0 to 1023; signal en_win3 : std_logic; signal p3_data : std_logic_vector(11 downto 0); -- palet 4 signal p4_red, p4_gre, p4_blu : std_logic; signal row_p4 : integer range 0 to 1023; signal en_win4 : std_logic; signal p4_data : std_logic_vector(11 downto 0); -- palet 5 signal p5_red, p5_gre, p5_blu : std_logic; signal row_p5 : integer range 0 to 1023; signal en_win5 : std_logic; signal p5_data : std_logic_vector(11 downto 0); -- palet 6 signal p6_red, p6_gre, p6_blu : std_logic; signal row_p6 : integer range 0 to 1023; signal en_win6 : std_logic; signal p6_data : std_logic_vector(11 downto 0); -- palet 7 signal p7_red, p7_gre, p7_blu : std_logic; signal row_p7 : integer range 0 to 1023; signal en_win7 : std_logic; signal p7_data : std_logic_vector(11 downto 0); -- palet 8 signal p8_red, p8_gre, p8_blu : std_logic; signal row_p8 : integer range 0 to 1023; signal en_win8 : std_logic; signal p8_data : std_logic_vector(11 downto 0); -- palet 9 signal p9_red, p9_gre, p9_blu : std_logic; signal row_p9 : integer range 0 to 1023; signal en_win9 : std_logic; signal p9_data : std_logic_vector(11 downto 0); -- palet 10 signal p10_red, p10_gre, p10_blu : std_logic; signal row_p10 : integer range 0 to 1023; signal en_win10 : std_logic; signal p10_data : std_logic_vector(11 downto 0); -- palet 11 signal p11_red, p11_gre, p11_blu : std_logic; signal row_p11 : integer range 0 to 1023; signal en_win11 : std_logic; signal p11_data : std_logic_vector(11 downto 0); -- palet 12 signal p12_red, p12_gre, p12_blu : std_logic; signal row_p12 : integer range 0 to 1023; signal en_win12 : std_logic; signal p12_data : std_logic_vector(11 downto 0); -- palet 13 signal p13_red, p13_gre, p13_blu : std_logic; signal row_p13 : integer range 0 to 1023; signal en_win13 : std_logic; signal p13_data : std_logic_vector(11 downto 0); -- palet 14 signal p14_red, p14_gre, p14_blu : std_logic; -- signal row_p14 : integer range 0 to 1023; signal en_win14 : std_logic; signal p14_data : std_logic_vector(11 downto 0); ------------------------------------------------------------------------------- component palet GENERIC ( code_red : integer range 0 to 1; code_gre : integer range 0 to 1; code_blu : integer range 0 to 1; seuilpixel : integer; seuilligne : integer; hauteur_min : integer := 2; largeur_min : integer := 7); PORT ( cpt_line : IN integer range 0 to 511; cpt_row : IN integer range 0 to 1023; cpt_row_out : OUT integer range 0 to 1023; cpt_line_out: OUT integer range 0 to 511; red_out : OUT std_logic; gre_out : OUT std_logic; blu_out : OUT std_logic; red_in : IN std_logic; gre_in : IN std_logic; blu_in : IN std_logic; choix : IN std_logic_vector(1 downto 0); donnee : OUT std_logic_vector(11 downto 0); en_win : IN std_logic; so_win : OUT std_logic; reset_n : IN std_logic; clock : IN std_logic ); end component; component filtre generic ( window_down : integer range 0 to 511; window_up : integer range 0 to 511; window_right : integer range 0 to 1023; window_left : integer range 0 to 1023; precision_filtre : integer := 5; largeur_seuil : integer := 2); port ( cpt_line : IN integer range 0 to 511; cpt_row : IN integer range 0 to 1023; cpt_row_out : OUT integer range 0 to 1023; cpt_line_out : OUT integer range 0 to 511; red_out : OUT std_logic; gre_out : OUT std_logic; blu_out : OUT std_logic; red_in : IN std_logic; gre_in : IN std_logic; blu_in : IN std_logic; so_win : OUT std_logic; reset_n : IN std_logic; clock : IN std_logic ); end component; for FILTRE1 : filtre use entity work.filtre(dominant); for PALET1 : palet use entity work.palet(deux_d); for PALET2 : palet use entity work.palet(deux_d); for PALET3 : palet use entity work.palet(deux_d); for PALET4 : palet use entity work.palet(deux_d); for PALET5 : palet use entity work.palet(deux_d); for PALET6 : palet use entity work.palet(deux_d); for PALET7 : palet use entity work.palet(deux_d); for PALET8 : palet use entity work.palet(deux_d); for PALET9 : palet use entity work.palet(deux_d); for PALET10 : palet use entity work.palet(deux_d); for PALET11 : palet use entity work.palet(deux_d); for PALET12 : palet use entity work.palet(deux_d); for PALET13 : palet use entity work.palet(deux_d); for PALET14 : palet use entity work.palet(deux_d); begin FILTRE1 : filtre generic map ( window_down => window_down, window_up => window_up, window_right => window_right, window_left => window_left, precision_filtre => filtre_precision, largeur_seuil => filtre_largeur) port map ( cpt_line => cpt_hs, cpt_row => cpt_pixel, cpt_row_out => row_p0, red_out => p0_red, gre_out => p0_gre, blu_out => p0_blu, red_in => IN_RED, gre_in => IN_GRE, blu_in => IN_BLU, so_win => en_win1, reset_n => reset_f, clock => llc2 ); PALET1 : palet generic map ( code_red => 1, code_gre => 0, code_blu => 0, seuilpixel => seuil_pixel, seuilligne => seuil_ligne, hauteur_min => hauteur_min, largeur_min => largeur_min ) port map ( cpt_line => cpt_hs, cpt_row => row_p0, -- hs cpt_row_out => row_p1, red_out => p1_red, gre_out => p1_gre, blu_out => p1_blu, red_in => p0_red, gre_in => p0_gre, blu_in => p0_blu, choix => choix_vector, donnee => p1_data, en_win => en_win1, so_win => en_win2, reset_n => reset_p, clock => llc2 ); PALET2 : palet generic map ( code_red => 0, code_gre => 1, code_blu => 0, seuilpixel => seuil_pixel, seuilligne => seuil_ligne, hauteur_min => hauteur_min, largeur_min => largeur_min ) port map ( cpt_line => cpt_hs, cpt_row => row_p1, -- hs cpt_row_out => row_p2, red_out => p2_red, gre_out => p2_gre, blu_out => p2_blu, red_in => p1_red, gre_in => p1_gre, blu_in => p1_blu, choix => choix_vector, donnee => p2_data, en_win => en_win2, so_win => en_win3, reset_n => reset_p, clock => llc2 ); PALET3 : palet generic map ( code_red => 1, code_gre => 0, code_blu => 0, seuilpixel => seuil_pixel, seuilligne => seuil_ligne, hauteur_min => hauteur_min, largeur_min => largeur_min ) port map ( cpt_line => cpt_hs, cpt_row => row_p2, -- hs cpt_row_out => row_p3, red_out => p3_red, gre_out => p3_gre, blu_out => p3_blu, red_in => p2_red, gre_in => p2_gre, blu_in => p2_blu, choix => choix_vector, donnee => p3_data, en_win => en_win3, so_win => en_win4, reset_n => reset_p, clock => llc2 ); PALET4 : palet generic map ( code_red => 0, code_gre => 1, code_blu => 0, seuilpixel => seuil_pixel, seuilligne => seuil_ligne, hauteur_min => hauteur_min, largeur_min => largeur_min ) port map ( cpt_line => cpt_hs, cpt_row => row_p3, -- hs cpt_row_out => row_p4, red_out => p4_red, gre_out => p4_gre, blu_out => p4_blu, red_in => p3_red, gre_in => p3_gre, blu_in => p3_blu, choix => choix_vector, donnee => p4_data, en_win => en_win4, so_win => en_win5, reset_n => reset_p, clock => llc2 ); PALET5 : palet generic map ( code_red => 1, code_gre => 0, code_blu => 0, seuilpixel => seuil_pixel, seuilligne => seuil_ligne, hauteur_min => hauteur_min, largeur_min => largeur_min ) port map ( cpt_line => cpt_hs, cpt_row => row_p4, -- hs cpt_row_out => row_p5, red_out => p5_red, gre_out => p5_gre, blu_out => p5_blu, red_in => p4_red, gre_in => p4_gre, blu_in => p4_blu, choix => choix_vector, donnee => p5_data, en_win => en_win5, so_win => en_win6, reset_n => reset_p, clock => llc2 ); PALET6 : palet generic map ( code_red => 0, code_gre => 1, code_blu => 0, seuilpixel => seuil_pixel, seuilligne => seuil_ligne, hauteur_min => hauteur_min, largeur_min => largeur_min ) port map ( cpt_line => cpt_hs, cpt_row => row_p5, -- hs cpt_row_out => row_p6, red_out => p6_red, gre_out => p6_gre, blu_out => p6_blu, red_in => p5_red, gre_in => p5_gre, blu_in => p5_blu, choix => choix_vector, donnee => p6_data, en_win => en_win6, so_win => en_win7, reset_n => reset_p, clock => llc2 ); PALET7 : palet generic map ( code_red => 1, code_gre => 0, code_blu => 0, seuilpixel => seuil_pixel, seuilligne => seuil_ligne, hauteur_min => hauteur_min, largeur_min => largeur_min ) port map ( cpt_line => cpt_hs, cpt_row => row_p6, -- hs cpt_row_out => row_p7, red_out => p7_red, gre_out => p7_gre, blu_out => p7_blu, red_in => p6_red, gre_in => p6_gre, blu_in => p6_blu, choix => choix_vector, donnee => p7_data, en_win => en_win7, so_win => en_win8, reset_n => reset_p, clock => llc2 ); PALET8 : palet generic map ( code_red => 0, code_gre => 1, code_blu => 0, seuilpixel => seuil_pixel, seuilligne => seuil_ligne, hauteur_min => hauteur_min, largeur_min => largeur_min ) port map ( cpt_line => cpt_hs, cpt_row => row_p7, -- hs cpt_row_out => row_p8, red_out => p8_red, gre_out => p8_gre, blu_out => p8_blu, red_in => p7_red, gre_in => p7_gre, blu_in => p7_blu, choix => choix_vector, donnee => p8_data, en_win => en_win8, so_win => en_win9, reset_n => reset_p, clock => llc2 ); PALET9 : palet generic map ( code_red => 1, code_gre => 0, code_blu => 0, seuilpixel => seuil_pixel, seuilligne => seuil_ligne, hauteur_min => hauteur_min, largeur_min => largeur_min ) port map ( cpt_line => cpt_hs, cpt_row => row_p8, -- hs cpt_row_out => row_p9, red_out => p9_red, gre_out => p9_gre, blu_out => p9_blu, red_in => p8_red, gre_in => p8_gre, blu_in => p8_blu, choix => choix_vector, donnee => p9_data, en_win => en_win9, so_win => en_win10, reset_n => reset_p, clock => llc2 ); PALET10 : palet generic map ( code_red => 0, code_gre => 1, code_blu => 0, seuilpixel => seuil_pixel, seuilligne => seuil_ligne, hauteur_min => hauteur_min, largeur_min => largeur_min ) port map ( cpt_line => cpt_hs, cpt_row => row_p9, -- hs cpt_row_out => row_p10, red_out => p10_red, gre_out => p10_gre, blu_out => p10_blu, red_in => p9_red, gre_in => p9_gre, blu_in => p9_blu, choix => choix_vector, donnee => p10_data, en_win => en_win10, so_win => en_win11, reset_n => reset_p, clock => llc2 ); PALET11 : palet generic map ( code_red => 1, code_gre => 0, code_blu => 0, seuilpixel => seuil_pixel, seuilligne => seuil_ligne, hauteur_min => hauteur_min, largeur_min => largeur_min ) port map ( cpt_line => cpt_hs, cpt_row => row_p10, -- hs cpt_row_out => row_p11, red_out => p11_red, gre_out => p11_gre, blu_out => p11_blu, red_in => p10_red, gre_in => p10_gre, blu_in => p10_blu, choix => choix_vector, donnee => p11_data, en_win => en_win11, so_win => en_win12, reset_n => reset_p, clock => llc2 ); PALET12 : palet generic map ( code_red => 0, code_gre => 1, code_blu => 0, seuilpixel => seuil_pixel, seuilligne => seuil_ligne, hauteur_min => hauteur_min, largeur_min => largeur_min ) port map ( cpt_line => cpt_hs, cpt_row => row_p11, -- hs cpt_row_out => row_p12, red_out => p12_red, gre_out => p12_gre, blu_out => p12_blu, red_in => p11_red, gre_in => p11_gre, blu_in => p11_blu, choix => choix_vector, donnee => p12_data, en_win => en_win12, so_win => en_win13, reset_n => reset_p, clock => llc2 ); PALET13 : palet generic map ( code_red => 1, code_gre => 0, code_blu => 0, seuilpixel => seuil_pixel, seuilligne => seuil_ligne, hauteur_min => hauteur_min, largeur_min => largeur_min ) port map ( cpt_line => cpt_hs, cpt_row => row_p12, -- hs cpt_row_out => row_p13, red_out => p13_red, gre_out => p13_gre, blu_out => p13_blu, red_in => p12_red, gre_in => p12_gre, blu_in => p12_blu, choix => choix_vector, donnee => p13_data, en_win => en_win13, so_win => en_win14, reset_n => reset_p, clock => llc2 ); PALET14 : palet generic map ( code_red => 0, code_gre => 1, code_blu => 0, seuilpixel => seuil_pixel, seuilligne => seuil_ligne, hauteur_min => hauteur_min, largeur_min => largeur_min ) port map ( cpt_line => cpt_hs, cpt_row => row_p13, -- hs -- cpt_row_out => row_p14, red_out => p14_red, gre_out => p14_gre, blu_out => p14_blu, red_in => p13_red, gre_in => p13_gre, blu_in => p13_blu, choix => choix_vector, donnee => p14_data, en_win => en_win14, -- so_win => en_win15, reset_n => reset_p, clock => llc2 ); OUT_RED <= (IN_RED and not(BYPASS)) or (p14_red and BYPASS); OUT_GRE <= (IN_GRE and not(BYPASS)) or (p14_gre and BYPASS); OUT_BLU <= (IN_BLU and not(BYPASS)) or (p14_blu and BYPASS); ------------------------------------------------------------------------------- IN_RED <= EPROM(0); IN_GRE <= EPROM(1); IN_BLU <= EPROM(2); HREF_XIL <= HREF; VREF_XIL <= VREF; LLC2_XIL <= LLC2; INT4 <= s_int4; INT7 <= s_int7; INT6 <= s_int6; INT5 <= s_int5; ------------------------------------------------------------------------------- comptage_ligne : process (llc2, reset_l) begin if reset_l = '0' then cpt_hs <= 0; hs_old <= HREF; elsif rising_edge(llc2) then if (hs_old = '1' and HREF = '0') then cpt_hs <= cpt_hs + 1; hs_old <= HREF; else hs_old <= HREF; end if; end if; end process; ------------------------------------------------------------------------------- reset_l <= resetn and VREF; -------------------------------------------------------------------------------- comptage_pixel : process (llc2, reset_x) begin if reset_x = '0' then cpt_pixel <= 0; elsif rising_edge(llc2) then cpt_pixel <= cpt_pixel + 1; end if; end process comptage_pixel; ------------------------------------------------------------------------------- reset_x <= resetn and HREF; -------------------------------------------------------------------------------- reset_palet : process (resetn, cpt_hs) -- reset du palet a chaque trame begin if resetn = '0' or cpt_hs=0 then reset_p <= '0'; else reset_p <= '1'; end if; end process; ------------------------------------------------------------------------------- reset_filtre : process (resetn, cpt_pixel) -- reset du filtre a chaque ligne begin if resetn = '0' or cpt_pixel = 0 then reset_f <= '0'; else reset_f <= '1'; end if; end process; ------------------------------------------------------------------------------- pixel_vector <= std_logic_vector(to_unsigned(cpt_pixel, 10)); line_vector <= std_logic_vector(to_unsigned(cpt_hs, 9)); s_int7 <= pixel_vector(4); s_int5 <= s_int7 and s_int4 and s_int6; ------------------------------------------------------------------------------- -- choix_vector <= pixel_vector(6 downto 5); -- 4 choix -- palet_vector <= line_vector(1 downto 0)&pixel_vector(8 downto 7); -- 16 palets choix_vector <= cpt_strobe(1 downto 0); palet_vector <= cpt_strobe(5 downto 2); ------------------------------------------------------------------------------- cpt_d_out : process (resetn, s_int4, llc2) begin if resetn = '0' or s_int4 = '0' then cpt_strobe <= "000000"; elsif rising_edge(llc2) then if old_strobe = '0' and strobe = '1' and s_int4 = '1' then cpt_strobe <= cpt_strobe + "000001"; end if; end if; end process; ------------------------------------------------------------------------------- detect_strobe : process(resetn, llc2) begin if resetn = '0' then old_strobe <= strobe; elsif rising_edge(llc2) then old_strobe <= strobe; end if; end process; ------------------------------------------------------------------------------- envoie_donnees : process (llc2, resetn) begin if resetn = '0' then s_int4 <= '0'; s_int6 <= '0'; elsif rising_edge(llc2) then if line_vector(8 downto 2) = "1000111" then s_int4 <= '1'; s_int6 <= not pixel_vector(9); else s_int4 <= '0'; s_int6 <= '0'; end if; end if; end process; ------------------------------------------------------------------------------- multiplex: process(palet_vector) begin case palet_vector is when "0000" => d_out <= p1_data; when "0001" => d_out <= p2_data; when "0010" => d_out <= p3_data; when "0011" => d_out <= p4_data; when "0100" => d_out <= p5_data; when "0101" => d_out <= p6_data; when "0110" => d_out <= p7_data; when "0111" => d_out <= p8_data; when "1000" => d_out <= p9_data; when "1001" => d_out <= p10_data; when "1010" => d_out <= p11_data; when "1011" => d_out <= p12_data; when "1100" => d_out <= p13_data; when "1101" => d_out <= p14_data; when others => d_out <= "000000000000"; end case; end process; ------------------------------------------------------------------------------- end structure; ------------------------------------------------------------------------------- -------------------------------------------------------------------------------