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

Subversion Repositories mkjpeg

[/] [mkjpeg/] [trunk/] [design/] [quantizer/] [QUANTIZER.vhd] - Blame information for rev 25

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 25 mikel262
--------------------------------------------------------------------------------
2
--                                                                            --
3
--                          V H D L    F I L E                                --
4
--                          COPYRIGHT (C) 2006                                --
5
--                                                                            --
6
--------------------------------------------------------------------------------
7
--                                                                            --
8
-- Title       : DIVIDER                                                      --
9
-- Design      : DCT QUANTIZER                                                --
10
-- Author      : Michal Krepa                                                 --
11
--                                                                            --
12
--------------------------------------------------------------------------------
13
--                                                                            --
14
-- File        : QUANTIZER.VHD                                                --
15
-- Created     : Sun Aug 27 2006                                              --
16
--                                                                            --
17
--------------------------------------------------------------------------------
18
--                                                                            --
19
--  Description : Pipelined DCT Quantizer                                     --
20
--  Pipeline delay: 2*SIZE_C+INTERN_PIPE_C                                    --
21
--------------------------------------------------------------------------------
22
 
23
--------------------------------------------------------------------------------
24
 
25
library IEEE;
26
  use IEEE.STD_LOGIC_1164.All;
27
  use IEEE.NUMERIC_STD.all;
28
 
29
entity quantizer is
30
  generic
31
    (
32
      SIZE_C        : INTEGER := 12;
33
      RAMQADDR_W    : INTEGER := 6;
34
      RAMQDATA_W    : INTEGER := 8
35
    );
36
  port
37
    (
38
      rst        : in  STD_LOGIC;
39
      clk        : in  STD_LOGIC;
40
      di         : in  STD_LOGIC_VECTOR(SIZE_C-1 downto 0);
41
      divalid    : in  STD_LOGIC;
42
      qdata      : in  std_logic_vector(7 downto 0);
43
      qwaddr     : in  std_logic_vector(5 downto 0);
44
      qwren      : in  std_logic;
45
 
46
      do         : out STD_LOGIC_VECTOR(SIZE_C-1 downto 0);
47
      dovalid    : out STD_LOGIC
48
    );
49
end quantizer;
50
 
51
architecture rtl of quantizer is
52
 
53
  constant INTERN_PIPE_C : INTEGER := 3;
54
 
55
  signal romaddr_s     : UNSIGNED(RAMQADDR_W-1 downto 0);
56
  signal slv_romaddr_s : STD_LOGIC_VECTOR(RAMQADDR_W-1 downto 0);
57
  signal romdatao_s    : STD_LOGIC_VECTOR(RAMQDATA_W-1 downto 0);
58
  signal divisor_s     : STD_LOGIC_VECTOR(SIZE_C-1 downto 0);
59
  signal remainder_s   : STD_LOGIC_VECTOR(SIZE_C-1 downto 0);
60
  signal do_s          : STD_LOGIC_VECTOR(SIZE_C-1 downto 0);
61
  signal round_s       : STD_LOGIC;
62
  signal di_d1         : std_logic_vector(SIZE_C-1 downto 0);
63
 
64
  signal pipeline_reg  : STD_LOGIC_VECTOR(4 downto 0);
65
  signal sign_bit_pipe : std_logic_vector(SIZE_C+INTERN_PIPE_C+1-1 downto 0);
66
  signal do_rdiv       : STD_LOGIC_VECTOR(SIZE_C-1 downto 0);
67
begin
68
 
69
  ----------------------------
70
  -- RAMQ
71
  ----------------------------
72
  U_RAMQ : entity work.RAMZ
73
    generic map
74
    (
75
      RAMADDR_W    => RAMQADDR_W,
76
      RAMDATA_W    => RAMQDATA_W
77
    )
78
    port map
79
    (
80
      d           => qdata,
81
      waddr       => qwaddr,
82
      raddr       => slv_romaddr_s,
83
      we          => qwren,
84
      clk         => CLK,
85
 
86
      q           => romdatao_s
87
    );
88
 
89
  ----------------------------
90
  -- S_DIVIDER
91
  ----------------------------
92
  --U_S_DIVIDER : entity work.s_divider
93
  --  generic map
94
  --  ( 
95
  --     SIZE_C => SIZE_C 
96
  --  )            
97
  --  port map
98
  --  (
99
  --     rst         => rst,
100
  --     clk         => clk,
101
  --     a           => di_d1,
102
  --     d           => divisor_s,
103
  --     
104
  --     q           => do_s,    
105
  --     r           => remainder_s, -- if ever used, needs to be 1T delayed
106
  --     round       => round_s
107
  --  ); 
108
 
109
  divisor_s(RAMQDATA_W-1 downto 0)      <= romdatao_s;
110
  divisor_s(SIZE_C-1 downto RAMQDATA_W) <= (others => '0');
111
 
112
  r_divider : entity work.r_divider
113
  port map
114
  (
115
       rst   => rst,
116
       clk   => clk,
117
       a     => di_d1,
118
       d     => romdatao_s,
119
 
120
       q     => do_s
121
  ) ;
122
  do <= do_s;
123
  slv_romaddr_s <= STD_LOGIC_VECTOR(romaddr_s);
124
 
125
  ------------------------------
126
  ---- round to nearest integer
127
  ------------------------------
128
  --process(clk)
129
  --begin
130
  --  if clk = '1' and clk'event then
131
  --    if rst = '1' then
132
  --      do <= (others => '0');
133
  --    else
134
  --      -- round to nearest integer?
135
  --      if round_s = '1' then
136
  --        -- negative number, subtract 1
137
  --        if sign_bit_pipe(sign_bit_pipe'length-1) = '1' then
138
  --          do <= STD_LOGIC_VECTOR(SIGNED(do_s)-TO_SIGNED(1,SIZE_C));
139
  --        -- positive number, add 1
140
  --        else
141
  --          do <= STD_LOGIC_VECTOR(SIGNED(do_s)+TO_SIGNED(1,SIZE_C));
142
  --        end if;
143
  --      else
144
  --        do <= do_s;
145
  --      end if;
146
  --    end if; 
147
  --  end if;
148
  --end process;
149
 
150
  ----------------------------
151
  -- address incrementer
152
  ----------------------------
153
  process(clk)
154
  begin
155
    if clk = '1' and clk'event then
156
      if rst = '1' then
157
        romaddr_s     <= (others => '0');
158
        pipeline_reg  <= (OTHERS => '0');
159
        di_d1         <= (OTHERS => '0');
160
        sign_bit_pipe <= (others => '0');
161
      else
162
        if divalid = '1' then
163
          romaddr_s <= romaddr_s + TO_UNSIGNED(1,RAMQADDR_W);
164
        end if;
165
 
166
        pipeline_reg <= pipeline_reg(pipeline_reg'length-2 downto 0) & divalid;
167
 
168
        di_d1 <= di;
169
 
170
        sign_bit_pipe <= sign_bit_pipe(sign_bit_pipe'length-2 downto 0) & di(SIZE_C-1);
171
      end if;
172
    end if;
173
  end process;
174
 
175
  dovalid <= pipeline_reg(pipeline_reg'high);
176
 
177
end rtl;
178
--------------------------------------------------------------------------------

powered by: WebSVN 2.1.0

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