OpenCores
URL https://opencores.org/ocsvn/graphiti/graphiti/trunk

Subversion Repositories graphiti

[/] [graphiti/] [trunk/] [xilinx/] [rgb2yuv.vhd] - Rev 8

Compare with Previous | Blame | View Log

-------------------------------------------------------------------------------
--	MiniGA
--  Author: Thomas Pototschnig (thomas.pototschnig@gmx.de)
--
--  License: Creative Commons Attribution-NonCommercial-ShareAlike 2.0 License
--           http://creativecommons.org/licenses/by-nc-sa/2.0/de/
--
--  If you want to use MiniGA for commercial purposes please contact the author
-------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
entity rgb2yuv is
    Port ( clk : in std_logic;
           reset : in std_logic;
			  in_r, in_g, in_b : in std_logic_vector (4 downto 0); -- signed
			  out_y, out_u, out_v : out std_logic_vector (11 downto 0)); -- unsigned
end rgb2yuv;
 
architecture Behavioral of rgb2yuv is
begin
	process (clk, reset)
		variable multu : signed (11 downto 0) := conv_signed (517,12);
		variable multv : signed (11 downto 0) := conv_signed (929,12);
		variable var_y : signed (11 downto 0);
		variable in_rs : signed (11 downto 0);
		variable in_gs : signed (11 downto 0);
		variable in_bs : signed (11 downto 0);
 
		variable worku24 : signed (23 downto 0);
		variable workv24 : signed (23 downto 0);
 
		variable rsigned : signed (11 downto 0) := conv_signed(0,12);
		variable bsigned : signed (11 downto 0) := conv_signed(0,12);
 
	begin
		if reset='0' then
			out_u <= (others => '0');
			out_v <= (others => '0');
			out_y <= (others => '0');
		elsif clk='1' and clk'event then
			case in_r is
				when "00000" => in_rs := "000000000000"; -- 0.0000
				when "00001" => in_rs := "000000001001"; -- 0.0094
				when "00010" => in_rs := "000000010011"; -- 0.0187
				when "00011" => in_rs := "000000011100"; -- 0.0281
				when "00100" => in_rs := "000000100110"; -- 0.0375
				when "00101" => in_rs := "000000110000"; -- 0.0469
				when "00110" => in_rs := "000000111001"; -- 0.0562
				when "00111" => in_rs := "000001000011"; -- 0.0656
				when "01000" => in_rs := "000001001100"; -- 0.0750
				when "01001" => in_rs := "000001010110"; -- 0.0844
				when "01010" => in_rs := "000001100000"; -- 0.0938
				when "01011" => in_rs := "000001101001"; -- 0.1031
				when "01100" => in_rs := "000001110011"; -- 0.1125
				when "01101" => in_rs := "000001111100"; -- 0.1219
				when "01110" => in_rs := "000010000110"; -- 0.1313
				when "01111" => in_rs := "000010010000"; -- 0.1406
				when "10000" => in_rs := "000010011001"; -- 0.1500
				when "10001" => in_rs := "000010100011"; -- 0.1594
				when "10010" => in_rs := "000010101100"; -- 0.1687
				when "10011" => in_rs := "000010110110"; -- 0.1781
				when "10100" => in_rs := "000011000000"; -- 0.1875
				when "10101" => in_rs := "000011001001"; -- 0.1969
				when "10110" => in_rs := "000011010011"; -- 0.2062
				when "10111" => in_rs := "000011011100"; -- 0.2156
				when "11000" => in_rs := "000011100110"; -- 0.2250
				when "11001" => in_rs := "000011110000"; -- 0.2344
				when "11010" => in_rs := "000011111001"; -- 0.2437
				when "11011" => in_rs := "000100000011"; -- 0.2531
				when "11100" => in_rs := "000100001100"; -- 0.2625
				when "11101" => in_rs := "000100010110"; -- 0.2719
				when "11110" => in_rs := "000100100000"; -- 0.2813
				when "11111" => in_rs := "000100101001"; -- 0.2906
				when others => in_rs := (others => '0');
			end case;
 
			case in_g is
				when "00000" => in_gs := "000000000000"; -- 0.0000
				when "00001" => in_gs := "000000010010"; -- 0.0184
				when "00010" => in_gs := "000000100101"; -- 0.0369
				when "00011" => in_gs := "000000111000"; -- 0.0553
				when "00100" => in_gs := "000001001011"; -- 0.0737
				when "00101" => in_gs := "000001011110"; -- 0.0922
				when "00110" => in_gs := "000001110001"; -- 0.1106
				when "00111" => in_gs := "000010000100"; -- 0.1291
				when "01000" => in_gs := "000010010111"; -- 0.1475
				when "01001" => in_gs := "000010101001"; -- 0.1659
				when "01010" => in_gs := "000010111100"; -- 0.1844
				when "01011" => in_gs := "000011001111"; -- 0.2028
				when "01100" => in_gs := "000011100010"; -- 0.2213
				when "01101" => in_gs := "000011110101"; -- 0.2397
				when "01110" => in_gs := "000100001000"; -- 0.2581
				when "01111" => in_gs := "000100011011"; -- 0.2766
				when "10000" => in_gs := "000100101110"; -- 0.2950
				when "10001" => in_gs := "000101000000"; -- 0.3134
				when "10010" => in_gs := "000101010011"; -- 0.3319
				when "10011" => in_gs := "000101100110"; -- 0.3503
				when "10100" => in_gs := "000101111001"; -- 0.3687
				when "10101" => in_gs := "000110001100"; -- 0.3872
				when "10110" => in_gs := "000110011111"; -- 0.4056
				when "10111" => in_gs := "000110110010"; -- 0.4241
				when "11000" => in_gs := "000111000101"; -- 0.4425
				when "11001" => in_gs := "000111011000"; -- 0.4609
				when "11010" => in_gs := "000111101010"; -- 0.4794
				when "11011" => in_gs := "000111111101"; -- 0.4978
				when "11100" => in_gs := "001000010000"; -- 0.5162
				when "11101" => in_gs := "001000100011"; -- 0.5347
				when "11110" => in_gs := "001000110110"; -- 0.5531
				when "11111" => in_gs := "001001001001"; -- 0.5716
				when others => in_gs := (others => '0');
			end case;
 
			case in_b is
				when "00000" => in_bs := "000000000000"; -- 0.0000
				when "00001" => in_bs := "000000000011"; -- 0.0034
				when "00010" => in_bs := "000000000111"; -- 0.0069
				when "00011" => in_bs := "000000001010"; -- 0.0103
				when "00100" => in_bs := "000000001110"; -- 0.0138
				when "00101" => in_bs := "000000010001"; -- 0.0172
				when "00110" => in_bs := "000000010101"; -- 0.0206
				when "00111" => in_bs := "000000011000"; -- 0.0241
				when "01000" => in_bs := "000000011100"; -- 0.0275
				when "01001" => in_bs := "000000011111"; -- 0.0309
				when "01010" => in_bs := "000000100011"; -- 0.0344
				when "01011" => in_bs := "000000100110"; -- 0.0378
				when "01100" => in_bs := "000000101010"; -- 0.0413
				when "01101" => in_bs := "000000101101"; -- 0.0447
				when "01110" => in_bs := "000000110001"; -- 0.0481
				when "01111" => in_bs := "000000110100"; -- 0.0516
				when "10000" => in_bs := "000000111000"; -- 0.0550
				when "10001" => in_bs := "000000111011"; -- 0.0584
				when "10010" => in_bs := "000000111111"; -- 0.0619
				when "10011" => in_bs := "000001000010"; -- 0.0653
				when "10100" => in_bs := "000001000110"; -- 0.0688
				when "10101" => in_bs := "000001001001"; -- 0.0722
				when "10110" => in_bs := "000001001101"; -- 0.0756
				when "10111" => in_bs := "000001010000"; -- 0.0791
				when "11000" => in_bs := "000001010100"; -- 0.0825
				when "11001" => in_bs := "000001011000"; -- 0.0859
				when "11010" => in_bs := "000001011011"; -- 0.0894
				when "11011" => in_bs := "000001011111"; -- 0.0928
				when "11100" => in_bs := "000001100010"; -- 0.0963
				when "11101" => in_bs := "000001100110"; -- 0.0997
				when "11110" => in_bs := "000001101001"; -- 0.1031
				when "11111" => in_bs := "000001101101"; -- 0.1066
				when others => in_bs := (others => '0');
			end case;
 
			rsigned := (others => '0');
			bsigned := (others => '0');
 
			rsigned (9 downto 5) := signed(in_r);
			bsigned (9 downto 5) := signed(in_b);
 
			var_y := signed(in_rs) + signed(in_gs) + signed(in_bs);
 
			worku24 := (bsigned-signed(var_y))* multu;
			workv24 := (rsigned-signed(var_y))* multv;
 
			out_u <= conv_std_logic_vector(worku24 (21 downto 10),12);
			out_v <= conv_std_logic_vector(workv24 (21 downto 10),12);
			out_y <= conv_std_logic_vector (var_y, var_y'length);
		end if;
	end process;
 
end Behavioral;
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.