]> AND Private Git Repository - blast.git/blob - rgb3sx8_to_gs.vhd
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
06abc7be879cddf5dce2b5c83a00c34293fedb4f
[blast.git] / rgb3sx8_to_gs.vhd
1 -------------------------------------------------------------------------------
2 --
3 --  File          : rgb3sx8_to_gs.vhd
4 --  Related files : 
5 --
6 --  Author(s)     : stephane Domas (sdomas@univ-fcomte.fr)
7 --
8 --  Creation Date : 2017/10/16
9 --
10 --  Description   : This IP does a conversion from rgb24 (8 bits/serial) to grayscale                  
11 --
12 --  Note          : rgb24 (8 bits/serial) pixels are composed of three 8 bits
13 --                  values that are consumed on port rgb_in, in the following
14 --                  order : blue, green, red.
15 --                  output value on gs_out is computed with (red+green+blue)/3
16 --
17 -------------------------------------------------------------------------------
18
19 library IEEE;
20 use IEEE.std_logic_1164.all;
21 use IEEE.numeric_std.all;
22
23 entity rgb3sx8_to_gs is
24   generic(
25     dsp_in_width  : natural := 18;
26     dsp_out_width : natural := 36
27     );
28   port(
29     clk           : in  std_logic;
30     reset         : in  std_logic;
31     rgb_in        : in  std_logic_vector(7 downto 0);
32     rgb_in_enb    : in  std_logic;
33     gs_out        : out std_logic_vector(7 downto 0);
34     gs_out_enb    : out std_logic
35
36     );
37 end rgb3sx8_to_gs;
38
39
40 architecture rtl of rgb3sx8_to_gs is
41
42   -- Signals
43   signal do_mult  : std_logic;
44   signal do_out   : std_logic;
45   signal count    : unsigned (2 downto 0);
46   signal accum    : unsigned(dsp_in_width-1 downto 0);
47   signal result   : unsigned(dsp_out_width-1 downto 0);
48   signal cst_mult : unsigned(dsp_in_width-1 downto 0);  -- eq. 87382 to do /3
49
50 begin
51
52   cst_mult <= to_unsigned(87382, 18);
53
54   accum_process : process (clk, reset)
55   begin
56     if reset = '1' then
57       count   <= to_unsigned(0, 3);
58       accum   <= to_unsigned(0, dsp_in_width);
59       do_mult <= '0';
60
61     elsif rising_edge(clk) then
62
63       do_mult <= '0';
64
65       if rgb_in_enb = '1' then
66
67         if count = 0 then
68           accum <= resize(unsigned(rgb_in), dsp_in_width);
69           count <= to_unsigned(1, 3);
70         elsif count = 1 then
71           accum <= accum + resize(unsigned(rgb_in), dsp_in_width);
72           count <= to_unsigned(2, 3);
73         elsif count = 2 then
74           accum   <= accum + resize(unsigned(rgb_in), dsp_in_width);
75           count   <= to_unsigned(0, 3);
76           do_mult <= '1';
77         end if;
78       end if;
79     end if;
80
81   end process accum_process;
82
83   mult_process : process (clk, reset)
84   begin
85     if reset = '1' then
86       result <= to_unsigned(0, dsp_out_width);
87       do_out <= '0';
88     elsif rising_edge(clk) then
89
90       do_out <= '0';
91       if do_mult = '1' then
92         result <= accum * cst_mult;
93         do_out <= '1';
94       end if;
95     end if;
96   end process mult_process;
97
98   gs_out        <= std_logic_vector(result(dsp_in_width+7 downto dsp_in_width));
99   gs_out_enb    <= do_out;
100
101 end rtl;
102