-------------------------------------------------------------------------------- -- Company: -- Engineer: Joerg Wolfram -- -- Create Date: 17.02.2007 -- Design Name: -- Module Name: fbas_enc -- Project Name: -- Target Device: -- Tool versions: -- Description: colour video signal generation for 16MHz clock -- -- Revision: 0.21 -- License: LGPL -------------------------------------------------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity fbas_encoder is port( enclock : in std_logic; -- main clock hsync : in std_logic; -- horizontal sync signal vsync : in std_logic; -- vertical sync signal rgb : in std_logic_vector(2 downto 0); -- rgb signal cgsel : in std_logic; -- colour/grey select pnmode : in std_logic; -- pal/ntsc mode vid : out std_logic_vector(4 downto 0)); -- video output end entity fbas_encoder; architecture clock16 of fbas_encoder is signal carrier: std_logic_vector(14 downto 0); signal bcounter: std_logic_vector(3 downto 0); signal oddeven: std_logic; signal burst,bstop: std_logic; signal vout: std_logic_vector(4 downto 0); signal romin: std_logic_vector(7 downto 0); begin ------------------------------------------------------------------------------- --- DDS for carrier generation ------------------------------------------------------------------------------- process (enclock,pnmode) is begin if (rising_edge(enclock)) then if (pnmode='0') then carrier <= carrier + 4540; --9080 else carrier <= carrier + 7331; end if; end if; end process; ------------------------------------------------------------------------------- --- burst generator ------------------------------------------------------------------------------- process (bcounter) is begin if (bcounter="0000") then bstop <= '1'; else bstop <= '0'; end if; end process; process (hsync,vsync,bstop,carrier(14)) is begin if ((hsync='0') and (vsync='1')) then bcounter <= "0011"; elsif (rising_edge(carrier(14))) then if (bstop='0') then bcounter <= bcounter + 1; end if; end if; end process; burst <= bcounter(3); ------------------------------------------------------------------------------- --- odd/even line is used only in PAL mode ------------------------------------------------------------------------------- process (hsync,pnmode) is begin if (pnmode = '1') then oddeven <= '0'; elsif (rising_edge(hsync)) then oddeven <= not(oddeven); end if; end process; ------------------------------------------------------------------------------- --- vid signal generation ------------------------------------------------------------------------------- romin(7)<=oddeven; romin(6)<=cgsel; romin(5 downto 3)<=rgb; romin(2 downto 0)<=carrier(14 downto 12); -------------------------------------------------------------------------------- -- the ROM tables -------------------------------------------------------------------------------- process (romin,hsync,vsync,burst,pnmode) is begin if ((hsync='0')) then vout <= (others => '0'); else if (burst='1') then ---burst mode if ((romin(7)='1') or (pnmode='1')) then ---odd lines case romin(2 downto 0) is when "000" => vout <= "00110"; when "001" => vout <= "00100"; when "010" => vout <= "00110"; when "011" => vout <= "01000"; when "100" => vout <= "01011"; when "101" => vout <= "01101"; when "110" => vout <= "01011"; when "111" => vout <= "01000"; when others => vout <= "01000"; end case; else case romin(2 downto 0) is when "000" => vout <= "01011"; when "001" => vout <= "01000"; when "010" => vout <= "00110"; when "011" => vout <= "00100"; when "100" => vout <= "00110"; when "101" => vout <= "01000"; when "110" => vout <= "01011"; when "111" => vout <= "01101"; when others => vout <= "01000"; end case; end if; else case romin is when "00000000" => vout <= "01000"; when "01000000" => vout <= "01000"; when "00000001" => vout <= "01000"; when "01000001" => vout <= "01000"; when "00000010" => vout <= "01000"; when "01000010" => vout <= "01000"; when "00000011" => vout <= "01000"; when "01000011" => vout <= "01000"; when "00000100" => vout <= "01000"; when "01000100" => vout <= "01000"; when "00000101" => vout <= "01000"; when "01000101" => vout <= "01000"; when "00000110" => vout <= "01000"; when "01000110" => vout <= "01000"; when "00000111" => vout <= "01000"; when "01000111" => vout <= "01000"; when "00001000" => vout <= "01010"; when "01001000" => vout <= "01001"; when "00001001" => vout <= "01010"; when "01001001" => vout <= "01101"; when "00001010" => vout <= "01010"; when "01001010" => vout <= "01111"; when "00001011" => vout <= "01010"; when "01001011" => vout <= "01110"; when "00001100" => vout <= "01010"; when "01001100" => vout <= "01100"; when "00001101" => vout <= "01010"; when "01001101" => vout <= "01000"; when "00001110" => vout <= "01010"; when "01001110" => vout <= "00111"; when "00001111" => vout <= "01010"; when "01001111" => vout <= "00111"; when "00010000" => vout <= "01110"; when "01010000" => vout <= "10101"; when "00010001" => vout <= "01110"; when "01010001" => vout <= "10001"; when "00010010" => vout <= "01110"; when "01010010" => vout <= "01101"; when "00010011" => vout <= "01110"; when "01010011" => vout <= "01001"; when "00010100" => vout <= "01110"; when "01010100" => vout <= "01000"; when "00010101" => vout <= "01110"; when "01010101" => vout <= "01011"; when "00010110" => vout <= "01110"; when "01010110" => vout <= "10000"; when "00010111" => vout <= "01110"; when "01010111" => vout <= "10100"; when "00011000" => vout <= "10000"; when "01011000" => vout <= "10110"; when "00011001" => vout <= "10000"; when "01011001" => vout <= "10110"; when "00011010" => vout <= "10000"; when "01011010" => vout <= "10011"; when "00011011" => vout <= "10000"; when "01011011" => vout <= "01111"; when "00011100" => vout <= "10000"; when "01011100" => vout <= "01011"; when "00011101" => vout <= "10000"; when "01011101" => vout <= "01011"; when "00011110" => vout <= "10000"; when "01011110" => vout <= "01110"; when "00011111" => vout <= "10000"; when "01011111" => vout <= "10010"; when "00100000" => vout <= "10100"; when "01100000" => vout <= "01111"; when "00100001" => vout <= "10100"; when "01100001" => vout <= "01110"; when "00100010" => vout <= "10100"; when "01100010" => vout <= "10001"; when "00100011" => vout <= "10100"; when "01100011" => vout <= "10110"; when "00100100" => vout <= "10100"; when "01100100" => vout <= "11001"; when "00100101" => vout <= "10100"; when "01100101" => vout <= "11001"; when "00100110" => vout <= "10100"; when "01100110" => vout <= "10111"; when "00100111" => vout <= "10100"; when "01100111" => vout <= "10010"; when "00101000" => vout <= "10110"; when "01101000" => vout <= "10000"; when "00101001" => vout <= "10110"; when "01101001" => vout <= "10011"; when "00101010" => vout <= "10110"; when "01101010" => vout <= "11000"; when "00101011" => vout <= "10110"; when "01101011" => vout <= "11011"; when "00101100" => vout <= "10110"; when "01101100" => vout <= "11100"; when "00101101" => vout <= "10110"; when "01101101" => vout <= "11001"; when "00101110" => vout <= "10110"; when "01101110" => vout <= "10101"; when "00101111" => vout <= "10110"; when "01101111" => vout <= "10001"; when "00110000" => vout <= "11010"; when "01110000" => vout <= "11010"; when "00110001" => vout <= "11010"; when "01110001" => vout <= "10111"; when "00110010" => vout <= "11010"; when "01110010" => vout <= "10110"; when "00110011" => vout <= "11010"; when "01110011" => vout <= "10110"; when "00110100" => vout <= "11010"; when "01110100" => vout <= "11001"; when "00110101" => vout <= "11010"; when "01110101" => vout <= "11100"; when "00110110" => vout <= "11010"; when "01110110" => vout <= "11110"; when "00110111" => vout <= "11010"; when "01110111" => vout <= "11110"; when "00111000" => vout <= "11100"; when "01111000" => vout <= "11100"; when "00111001" => vout <= "11100"; when "01111001" => vout <= "11100"; when "00111010" => vout <= "11100"; when "01111010" => vout <= "11100"; when "00111011" => vout <= "11100"; when "01111011" => vout <= "11100"; when "00111100" => vout <= "11100"; when "01111100" => vout <= "11100"; when "00111101" => vout <= "11100"; when "01111101" => vout <= "11100"; when "00111110" => vout <= "11100"; when "01111110" => vout <= "11100"; when "00111111" => vout <= "11100"; when "01111111" => vout <= "11100"; when "10000000" => vout <= "01000"; when "11000000" => vout <= "01000"; when "10000001" => vout <= "01000"; when "11000001" => vout <= "01000"; when "10000010" => vout <= "01000"; when "11000010" => vout <= "01000"; when "10000011" => vout <= "01000"; when "11000011" => vout <= "01000"; when "10000100" => vout <= "01000"; when "11000100" => vout <= "01000"; when "10000101" => vout <= "01000"; when "11000101" => vout <= "01000"; when "10000110" => vout <= "01000"; when "11000110" => vout <= "01000"; when "10000111" => vout <= "01000"; when "11000111" => vout <= "01000"; when "10001000" => vout <= "01010"; when "11001000" => vout <= "01100"; when "10001001" => vout <= "01010"; when "11001001" => vout <= "01110"; when "10001010" => vout <= "01010"; when "11001010" => vout <= "01111"; when "10001011" => vout <= "01010"; when "11001011" => vout <= "01101"; when "10001100" => vout <= "01010"; when "11001100" => vout <= "01001"; when "10001101" => vout <= "01010"; when "11001101" => vout <= "00111"; when "10001110" => vout <= "01010"; when "11001110" => vout <= "00111"; when "10001111" => vout <= "01010"; when "11001111" => vout <= "01000"; when "10010000" => vout <= "01110"; when "11010000" => vout <= "01000"; when "10010001" => vout <= "01110"; when "11010001" => vout <= "01001"; when "10010010" => vout <= "01110"; when "11010010" => vout <= "01101"; when "10010011" => vout <= "01110"; when "11010011" => vout <= "10001"; when "10010100" => vout <= "01110"; when "11010100" => vout <= "10101"; when "10010101" => vout <= "01110"; when "11010101" => vout <= "10100"; when "10010110" => vout <= "01110"; when "11010110" => vout <= "10000"; when "10010111" => vout <= "01110"; when "11010111" => vout <= "01011"; when "10011000" => vout <= "10000"; when "11011000" => vout <= "01011"; when "10011001" => vout <= "10000"; when "11011001" => vout <= "01111"; when "10011010" => vout <= "10000"; when "11011010" => vout <= "10011"; when "10011011" => vout <= "10000"; when "11011011" => vout <= "10110"; when "10011100" => vout <= "10000"; when "11011100" => vout <= "10110"; when "10011101" => vout <= "10000"; when "11011101" => vout <= "10010"; when "10011110" => vout <= "10000"; when "11011110" => vout <= "01110"; when "10011111" => vout <= "10000"; when "11011111" => vout <= "01011"; when "10100000" => vout <= "10100"; when "11100000" => vout <= "11001"; when "10100001" => vout <= "10100"; when "11100001" => vout <= "10110"; when "10100010" => vout <= "10100"; when "11100010" => vout <= "10001"; when "10100011" => vout <= "10100"; when "11100011" => vout <= "01110"; when "10100100" => vout <= "10100"; when "11100100" => vout <= "01111"; when "10100101" => vout <= "10100"; when "11100101" => vout <= "10010"; when "10100110" => vout <= "10100"; when "11100110" => vout <= "10111"; when "10100111" => vout <= "10100"; when "11100111" => vout <= "11001"; when "10101000" => vout <= "10110"; when "11101000" => vout <= "11100"; when "10101001" => vout <= "10110"; when "11101001" => vout <= "11011"; when "10101010" => vout <= "10110"; when "11101010" => vout <= "11000"; when "10101011" => vout <= "10110"; when "11101011" => vout <= "10011"; when "10101100" => vout <= "10110"; when "11101100" => vout <= "10000"; when "10101101" => vout <= "10110"; when "11101101" => vout <= "10001"; when "10101110" => vout <= "10110"; when "11101110" => vout <= "10101"; when "10101111" => vout <= "10110"; when "11101111" => vout <= "11001"; when "10110000" => vout <= "11010"; when "11110000" => vout <= "11001"; when "10110001" => vout <= "11010"; when "11110001" => vout <= "10110"; when "10110010" => vout <= "11010"; when "11110010" => vout <= "10110"; when "10110011" => vout <= "11010"; when "11110011" => vout <= "10111"; when "10110100" => vout <= "11010"; when "11110100" => vout <= "11010"; when "10110101" => vout <= "11010"; when "11110101" => vout <= "11110"; when "10110110" => vout <= "11010"; when "11110110" => vout <= "11110"; when "10110111" => vout <= "11010"; when "11110111" => vout <= "11100"; when "10111000" => vout <= "11100"; when "11111000" => vout <= "11100"; when "10111001" => vout <= "11100"; when "11111001" => vout <= "11100"; when "10111010" => vout <= "11100"; when "11111010" => vout <= "11100"; when "10111011" => vout <= "11100"; when "11111011" => vout <= "11100"; when "10111100" => vout <= "11100"; when "11111100" => vout <= "11100"; when "10111101" => vout <= "11100"; when "11111101" => vout <= "11100"; when "10111110" => vout <= "11100"; when "11111110" => vout <= "11100"; when "10111111" => vout <= "11100"; when "11111111" => vout <= "11100"; when others => vout <= "01000"; end case; end if; end if; end process; ------------------------------------------------------------------------------- --- signal output ------------------------------------------------------------------------------- process (vout,enclock) is begin if (rising_edge(enclock)) then vid <= vout; end if; end process; end architecture clock16;