1 ------------------------------------------------------------------------------
2 -- Copyright (C) 2011, Kenichi Kurimoto
4 -- This program is free software; you can redistribute it and/or modify
5 -- it under the terms of the GNU General Public License as published by
6 -- the Free Software Foundation; either version 2 of the License, or
7 -- (at your option) any later version.
9 -- This program is distributed in the hope that it will be useful,
10 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
11 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 -- GNU General Public License for more details.
14 -- You should have received a copy of the GNU General Public License
15 -- along with this program; if not, write to the Free Software
16 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 -----------------------------------------------------------------------------
20 -- Author: Kenichi Kurimoto
21 -- Description: 2nd IDCT calculation for jpeg decode
22 ------------------------------------------------------------------------------
25 use ieee.std_logic_1164.all;
26 use ieee.numeric_std.all;
32 port ( rst : in std_ulogic;
34 ready1 : out std_logic;
35 strobe1 : in std_logic;
36 coeffin : in std_logic_vector (15 downto 0);
37 outdata : out std_logic_vector (7 downto 0);
38 ready2 : in std_logic;
39 strobe2 : out std_logic
43 architecture rtl of idct2 is
45 function mysigned_mul(a,b : std_logic_vector) return std_logic_vector is
46 variable z : std_logic_vector(a'length + b'length -1 downto 0);
48 z := std_logic_vector(signed(a) * signed(b));
53 function mysigned_add(a,b : std_logic_vector) return std_logic_vector is
54 variable ex_a : std_logic_vector(a'length downto 0);
55 variable ex_b : std_logic_vector(b'length downto 0);
56 variable z1 : std_logic_vector(a'length downto 0);
57 variable z2 : std_logic_vector(b'length downto 0);
59 ex_a := a(a'left) & a;
60 ex_b := b(b'left) & b;
61 if( a'length > b'length)then
62 z1 := std_logic_vector(signed(ex_a) + signed(ex_b));
65 z2 := std_logic_vector(signed(ex_a) + signed(ex_b));
70 function round1(indata : std_logic_vector(32 downto 0)) return std_logic_vector is
71 variable judge :std_logic;
72 variable z : std_logic_vector(14 downto 0);
76 z := indata(32 downto 18);
78 z := indata(32 downto 18) + 1;
83 function round2(indata : std_logic_vector(32 downto 0); pol : std_logic) return std_logic_vector is
84 variable judge : std_logic;
85 variable tmpdata : std_logic_vector(32 downto 0);
86 variable z : std_logic_vector(14 downto 0);
89 tmpdata := not indata + 1 ;
95 z := tmpdata(32 downto 18) + 1;
97 z := tmpdata(32 downto 18);
102 constant S_ZERO : SIGNED := "0000000000";
103 constant S_TWOFIVEFIVE : SIGNED := "0011111111";
105 function round3(indata : std_logic_vector(17 downto 0)) return std_logic_vector is
106 variable judge : std_logic;
107 variable z : std_logic_vector(12 downto 0);
108 variable value : integer;
112 if (judge = '0') then
113 z := indata(17 downto 5);
115 z := indata(17 downto 5) + 1;
117 if notx(z) then value := to_integer(signed(z)); end if;
118 if (value < -128) then
124 return(z(7 downto 0));
129 subtype coeff23 is std_logic_vector(16 downto 0);
130 type coeff_array1 is array(0 to 31) of coeff23;
131 constant coeff_rom : coeff_array1 :=
133 ("01011010100000101","01011010100000101","01011010100000101","01011010100000101",
134 "01111101100010101","01101010011011011","01000111000111010","00011000111110001",
135 "01110110010000011","00110000111111000","11001111000001001","10001001101111101",
136 "01101010011011011","11100111000001111","10000010011101100","10111000111000111",
137 "01011010100000101","10100101011111100","10100101011111100","01011010100000101",
138 "01000111000111010","10000010011101100","00011000111110001","01101010011011011",
139 "00110000111111000","10001001101111101","01110110010000011","11001111000001001",
140 "00011000111110001","10111000111000111","01101010011011011","10000010011101100");
143 type tablereg_type is array (0 to 3) of std_logic_vector(16 downto 0);
144 type accumulator_type is array (0 to 7) of std_logic_vector(17 downto 0);
145 type resultreg_type is array (0 to 7) of std_logic_vector(7 downto 0);
149 inreg : std_logic_vector(15 downto 0);
150 accumulator : accumulator_type;
151 result_reg : resultreg_type;
155 counter : std_logic_vector(6 downto 0);
158 type all_reg is record
163 type node1_array is array (0 to 3) of std_logic_vector(16 downto 0);
164 type node2_array is array (0 to 3) of std_logic_vector(32 downto 0);
165 type node3_array is array (0 to 7) of std_logic_vector(14 downto 0);
166 type node4_array is array (0 to 7) of std_logic_vector(17 downto 0);
167 type node5_array is array (0 to 7) of std_logic_vector(18 downto 0);
168 type node6_array is array (0 to 7) of std_logic_vector(7 downto 0);
170 signal r, rin : all_reg;
171 --signal sig_node1_0 : std_logic_vector(16 downto 0);
172 --signal sig_node2_0 : std_logic_vector(32 downto 0);
173 --signal sig_node3_0 : std_logic_vector(14 downto 0);
174 --signal sig_node4_0 : std_logic_vector(17 downto 0);
175 --signal sig_node5_0 : std_logic_vector(18 downto 0);
176 --signal sig_node6_0 : std_logic_vector(7 downto 0);
177 --signal sig_node1_3 : std_logic_vector(16 downto 0);
178 --signal sig_node2_3 : std_logic_vector(32 downto 0);
179 --signal sig_node3_4 : std_logic_vector(14 downto 0);
180 --signal sig_node4_4 : std_logic_vector(17 downto 0);
181 --signal sig_node5_4 : std_logic_vector(18 downto 0);
182 --signal sig_node6_4 : std_logic_vector(7 downto 0);
187 comb : process(r, rst, strobe1, ready2, coeffin)
188 variable v : all_reg;
189 variable node1 : node1_array;
190 variable node2 : node2_array;
191 variable node3 : node3_array;
192 variable node4 : node4_array;
193 variable node5 : node5_array;
194 variable node6 : node6_array;
195 variable node7 : std_logic_vector(9 downto 0);
196 variable node8 : std_logic_vector(9 downto 0);
197 variable pol : std_logic;
199 variable count_num : integer;
200 variable vstrobe2 : std_logic;
201 variable vready1 : std_logic;
206 count_num := to_integer(unsigned(r.control_reg.counter));
208 v.data_reg.inreg := coeffin;
211 when 2 | 10 | 18 | 26 | 34 | 42 | 50 | 58 =>
212 node1(0) := coeff_rom(4);
213 node1(1) := coeff_rom(5);
214 node1(2) := coeff_rom(6);
215 node1(3) := coeff_rom(7);
216 when 3 | 11 | 19 | 27 | 35 | 43 | 51 | 59 =>
217 node1(0) := coeff_rom(8);
218 node1(1) := coeff_rom(9);
219 node1(2) := coeff_rom(10);
220 node1(3) := coeff_rom(11);
221 when 4 | 12 | 20 | 28 | 36 | 44 | 52 | 60 =>
222 node1(0) := coeff_rom(12);
223 node1(1) := coeff_rom(13);
224 node1(2) := coeff_rom(14);
225 node1(3) := coeff_rom(15);
226 when 5 | 13 | 21 | 29 | 37 | 45 | 53 | 61 =>
227 node1(0) := coeff_rom(16);
228 node1(1) := coeff_rom(17);
229 node1(2) := coeff_rom(18);
230 node1(3) := coeff_rom(19);
231 when 6 | 14 | 22 | 30 | 38 | 46 | 54 | 62 =>
232 node1(0) := coeff_rom(20);
233 node1(1) := coeff_rom(21);
234 node1(2) := coeff_rom(22);
235 node1(3) := coeff_rom(23);
236 when 7 | 15 | 23 | 31 | 39 | 47 | 55 | 63 =>
237 node1(0) := coeff_rom(24);
238 node1(1) := coeff_rom(25);
239 node1(2) := coeff_rom(26);
240 node1(3) := coeff_rom(27);
241 when 8 | 16 | 24 | 32 | 40 | 48 | 56 | 64 =>
242 node1(0) := coeff_rom(28);
243 node1(1) := coeff_rom(29);
244 node1(2) := coeff_rom(30);
245 node1(3) := coeff_rom(31);
247 node1(0) := coeff_rom(0);
248 node1(1) := coeff_rom(1);
249 node1(2) := coeff_rom(2);
250 node1(3) := coeff_rom(3);
254 node2(i) := mysigned_mul(node1(i), r.data_reg.inreg);
255 node3(i) := round1(node2(i));
259 -- when 3 | 5 | 7 | 9 | 11 | 13 | 15 | 17 | 19 | 21 | 23 | ..... | 65
260 -- when 2 4 6 8 10 12 14 16 18 20 22 64
262 if((count_num mod 2) = 0 and (count_num >= 2) and (count_num <= 64))then
268 node3(4) := round2(node2(3), pol);
269 node3(5) := round2(node2(2), pol);
270 node3(6) := round2(node2(1), pol);
271 node3(7) := round2(node2(0), pol);
273 if((count_num = 1) or (count_num = 9) or (count_num = 17) or (count_num = 25) or (count_num = 33) or (count_num = 41) or (count_num = 49) or (count_num = 57)) then
275 node4(i) := (others => '0');
279 node4(i) := r.data_reg.accumulator(i);
284 node5(i) := mysigned_add(node3(i), node4(i));
285 v.data_reg.accumulator(i) := node5(i)(17 downto 0);
286 node6(i) := round3(r.data_reg.accumulator(i));
289 if((count_num = 9) or (count_num = 17) or (count_num = 25) or (count_num = 33) or (count_num = 41) or (count_num = 49) or (count_num = 57) or (count_num = 65)) then
291 v.data_reg.result_reg(i) := node6(i);
295 v.data_reg.result_reg(i) := r.data_reg.result_reg(i+1);
297 v.data_reg.result_reg(7) := (others => '0');
300 node7 := mysigned_add(r.data_reg.result_reg(0),"010000000");
302 if((count_num >= 10) and (count_num <= 73))then
307 if ((count_num = 0 and strobe1 = '1') or count_num /= 0) then
308 v.control_reg.counter := std_logic_vector(to_unsigned(count_num + 1,7));
309 if(count_num = 73)then
310 v.control_reg.counter := (others => '0');
314 if(ready2 = '1' and count_num <= 63)then
321 v.data_reg.accumulator(i) := (others => '0');
322 v.data_reg.result_reg(i) := (others => '0');
324 v.control_reg.counter := (others => '0');
328 outdata <= node7(7 downto 0);
334 -- sig_node1_0 <= node1(0);
335 -- sig_node2_0 <= node2(0);
336 -- sig_node3_0 <= node3(0);
337 -- sig_node4_0 <= node4(0);
338 -- sig_node5_0 <= node5(0);
339 -- sig_node6_0 <= node6(0);
340 -- sig_node1_3 <= node1(3);
341 -- sig_node2_3 <= node2(3);
342 -- sig_node3_4 <= node3(4);
343 -- sig_node4_4 <= node4(4);
344 -- sig_node5_4 <= node5(4);
345 -- sig_node6_4 <= node6(4);
351 if rising_edge(clk) then