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;
40 startgen : in std_logic
44 architecture rtl of idct2 is
46 function mysigned_mul(a,b : std_logic_vector) return std_logic_vector is
47 variable z : std_logic_vector(a'length + b'length -1 downto 0);
49 z := std_logic_vector(signed(a) * signed(b));
54 function mysigned_add(a,b : std_logic_vector) return std_logic_vector is
55 variable ex_a : std_logic_vector(a'length downto 0);
56 variable ex_b : std_logic_vector(b'length downto 0);
57 variable z1 : std_logic_vector(a'length downto 0);
58 variable z2 : std_logic_vector(b'length downto 0);
60 ex_a := a(a'left) & a;
61 ex_b := b(b'left) & b;
62 if( a'length > b'length)then
63 z1 := std_logic_vector(signed(ex_a) + signed(ex_b));
66 z2 := std_logic_vector(signed(ex_a) + signed(ex_b));
71 function round1(indata : std_logic_vector(32 downto 0)) return std_logic_vector is
72 variable judge :std_logic;
73 variable z : std_logic_vector(14 downto 0);
77 z := indata(32 downto 18);
79 z := indata(32 downto 18) + 1;
84 function round2(indata : std_logic_vector(32 downto 0); pol : std_logic) return std_logic_vector is
85 variable judge : std_logic;
86 variable tmpdata : std_logic_vector(32 downto 0);
87 variable z : std_logic_vector(14 downto 0);
90 tmpdata := not indata + 1 ;
96 z := tmpdata(32 downto 18) + 1;
98 z := tmpdata(32 downto 18);
103 constant S_ZERO : SIGNED := "0000000000";
104 constant S_TWOFIVEFIVE : SIGNED := "0011111111";
106 function round3(indata : std_logic_vector(17 downto 0)) return std_logic_vector is
107 variable judge : std_logic;
108 variable z : std_logic_vector(12 downto 0);
109 variable value : integer;
113 if (judge = '0') then
114 z := indata(17 downto 5);
116 z := indata(17 downto 5) + 1;
118 if notx(z) then value := to_integer(signed(z)); end if;
119 if (value < -128) then
125 return(z(7 downto 0));
130 subtype coeff23 is std_logic_vector(16 downto 0);
131 type coeff_array1 is array(0 to 31) of coeff23;
132 constant coeff_rom : coeff_array1 :=
134 ("01011010100000101","01011010100000101","01011010100000101","01011010100000101",
135 "01111101100010101","01101010011011011","01000111000111010","00011000111110001",
136 "01110110010000011","00110000111111000","11001111000001001","10001001101111101",
137 "01101010011011011","11100111000001111","10000010011101100","10111000111000111",
138 "01011010100000101","10100101011111100","10100101011111100","01011010100000101",
139 "01000111000111010","10000010011101100","00011000111110001","01101010011011011",
140 "00110000111111000","10001001101111101","01110110010000011","11001111000001001",
141 "00011000111110001","10111000111000111","01101010011011011","10000010011101100");
144 type tablereg_type is array (0 to 3) of std_logic_vector(16 downto 0);
145 type accumulator_type is array (0 to 7) of std_logic_vector(17 downto 0);
146 type resultreg_type is array (0 to 7) of std_logic_vector(7 downto 0);
150 inreg : std_logic_vector(15 downto 0);
151 accumulator : accumulator_type;
152 result_reg : resultreg_type;
156 counter : std_logic_vector(6 downto 0);
159 type all_reg is record
164 type node1_array is array (0 to 3) of std_logic_vector(16 downto 0);
165 type node2_array is array (0 to 3) of std_logic_vector(32 downto 0);
166 type node3_array is array (0 to 7) of std_logic_vector(14 downto 0);
167 type node4_array is array (0 to 7) of std_logic_vector(17 downto 0);
168 type node5_array is array (0 to 7) of std_logic_vector(18 downto 0);
169 type node6_array is array (0 to 7) of std_logic_vector(7 downto 0);
171 signal r, rin : all_reg;
172 --signal sig_node1_0 : std_logic_vector(16 downto 0);
173 --signal sig_node2_0 : std_logic_vector(32 downto 0);
174 --signal sig_node3_0 : std_logic_vector(14 downto 0);
175 --signal sig_node4_0 : std_logic_vector(17 downto 0);
176 --signal sig_node5_0 : std_logic_vector(18 downto 0);
177 --signal sig_node6_0 : std_logic_vector(7 downto 0);
178 --signal sig_node1_3 : std_logic_vector(16 downto 0);
179 --signal sig_node2_3 : std_logic_vector(32 downto 0);
180 --signal sig_node3_4 : std_logic_vector(14 downto 0);
181 --signal sig_node4_4 : std_logic_vector(17 downto 0);
182 --signal sig_node5_4 : std_logic_vector(18 downto 0);
183 --signal sig_node6_4 : std_logic_vector(7 downto 0);
188 comb : process(r, rst, strobe1, ready2, coeffin, startgen)
189 variable v : all_reg;
190 variable node1 : node1_array;
191 variable node2 : node2_array;
192 variable node3 : node3_array;
193 variable node4 : node4_array;
194 variable node5 : node5_array;
195 variable node6 : node6_array;
196 variable node7 : std_logic_vector(9 downto 0);
197 variable node8 : std_logic_vector(9 downto 0);
198 variable pol : std_logic;
200 variable count_num : integer;
201 variable vstrobe2 : std_logic;
202 variable vready1 : std_logic;
207 count_num := to_integer(unsigned(r.control_reg.counter));
209 v.data_reg.inreg := coeffin;
212 when 2 | 10 | 18 | 26 | 34 | 42 | 50 | 58 =>
213 node1(0) := coeff_rom(4);
214 node1(1) := coeff_rom(5);
215 node1(2) := coeff_rom(6);
216 node1(3) := coeff_rom(7);
217 when 3 | 11 | 19 | 27 | 35 | 43 | 51 | 59 =>
218 node1(0) := coeff_rom(8);
219 node1(1) := coeff_rom(9);
220 node1(2) := coeff_rom(10);
221 node1(3) := coeff_rom(11);
222 when 4 | 12 | 20 | 28 | 36 | 44 | 52 | 60 =>
223 node1(0) := coeff_rom(12);
224 node1(1) := coeff_rom(13);
225 node1(2) := coeff_rom(14);
226 node1(3) := coeff_rom(15);
227 when 5 | 13 | 21 | 29 | 37 | 45 | 53 | 61 =>
228 node1(0) := coeff_rom(16);
229 node1(1) := coeff_rom(17);
230 node1(2) := coeff_rom(18);
231 node1(3) := coeff_rom(19);
232 when 6 | 14 | 22 | 30 | 38 | 46 | 54 | 62 =>
233 node1(0) := coeff_rom(20);
234 node1(1) := coeff_rom(21);
235 node1(2) := coeff_rom(22);
236 node1(3) := coeff_rom(23);
237 when 7 | 15 | 23 | 31 | 39 | 47 | 55 | 63 =>
238 node1(0) := coeff_rom(24);
239 node1(1) := coeff_rom(25);
240 node1(2) := coeff_rom(26);
241 node1(3) := coeff_rom(27);
242 when 8 | 16 | 24 | 32 | 40 | 48 | 56 | 64 =>
243 node1(0) := coeff_rom(28);
244 node1(1) := coeff_rom(29);
245 node1(2) := coeff_rom(30);
246 node1(3) := coeff_rom(31);
248 node1(0) := coeff_rom(0);
249 node1(1) := coeff_rom(1);
250 node1(2) := coeff_rom(2);
251 node1(3) := coeff_rom(3);
255 node2(i) := mysigned_mul(node1(i), r.data_reg.inreg);
256 node3(i) := round1(node2(i));
260 -- when 3 | 5 | 7 | 9 | 11 | 13 | 15 | 17 | 19 | 21 | 23 | ..... | 65
261 -- when 2 4 6 8 10 12 14 16 18 20 22 64
263 if((count_num mod 2) = 0 and (count_num >= 2) and (count_num <= 64))then
269 node3(4) := round2(node2(3), pol);
270 node3(5) := round2(node2(2), pol);
271 node3(6) := round2(node2(1), pol);
272 node3(7) := round2(node2(0), pol);
274 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
276 node4(i) := (others => '0');
280 node4(i) := r.data_reg.accumulator(i);
285 node5(i) := mysigned_add(node3(i), node4(i));
286 v.data_reg.accumulator(i) := node5(i)(17 downto 0);
287 node6(i) := round3(r.data_reg.accumulator(i));
290 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
292 v.data_reg.result_reg(i) := node6(i);
296 v.data_reg.result_reg(i) := r.data_reg.result_reg(i+1);
298 v.data_reg.result_reg(7) := (others => '0');
301 node7 := mysigned_add(r.data_reg.result_reg(0),"010000000");
303 if((count_num >= 10) and (count_num <= 73))then
308 if ((count_num = 0 and strobe1 = '1') or count_num /= 0) then
309 v.control_reg.counter := std_logic_vector(to_unsigned(count_num + 1,7));
310 if(count_num = 73)then
311 v.control_reg.counter := (others => '0');
315 if(ready2 = '1' and count_num <= 63)then
320 if rst = '0' or startgen = '1' then
321 v.data_reg.inreg := (others => '0');
323 v.data_reg.accumulator(i) := (others => '0');
324 v.data_reg.result_reg(i) := (others => '0');
326 v.control_reg.counter := (others => '0');
330 outdata <= node7(7 downto 0);
336 -- sig_node1_0 <= node1(0);
337 -- sig_node2_0 <= node2(0);
338 -- sig_node3_0 <= node3(0);
339 -- sig_node4_0 <= node4(0);
340 -- sig_node5_0 <= node5(0);
341 -- sig_node6_0 <= node6(0);
342 -- sig_node1_3 <= node1(3);
343 -- sig_node2_3 <= node2(3);
344 -- sig_node3_4 <= node3(4);
345 -- sig_node4_4 <= node4(4);
346 -- sig_node5_4 <= node5(4);
347 -- sig_node6_4 <= node6(4);
353 if rising_edge(clk) then