------------------------------------------------------------------------------ -- Copyright (C) 2011, Kenichi Kurimoto -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 2 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ----------------------------------------------------------------------------- -- Entity: huffdctycc -- File: huffdctycc.vhd -- Author: Kenichi Kurimoto -- Description: huffman decoder,2D-DCT,upsample,and YCbCr-RGB translation -- for jpeg decode ------------------------------------------------------------------------------ library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use std.textio.all; use ieee.std_logic_textio.all; library grlib; use grlib.amba.all; use grlib.stdlib.all; use grlib.devices.all; library techmap; use techmap.gencomp.all; library kuri; use kuri.mjpeg.all; entity huffdctycc is generic ( memtech : integer := DEFMEMTECH; shindex : integer := 0; haddr : integer := 0; hmask : integer := 16#fff#; hirq : integer := 0; pindex : integer := 0; paddr : integer := 0; pmask : integer := 16#fff#; mhindex : integer := 0; chprot : integer := 3); port ( rst : in std_ulogic; clk : in std_ulogic; ahbmi : in ahb_mst_in_type; ahbmo : out ahb_mst_out_type; ahbsi : in ahb_slv_in_type; ahbso : out ahb_slv_out_type; apbi : in apb_slv_in_type; apbo : out apb_slv_out_type ); end; architecture rtl of huffdctycc is signal kready1, kready2, kready3, kready4, kready5, kready6, kstrobe1, kstrobeq, kstrobe2, kstrobe3, kstrobe4, kstrobe5, kstrobe6: std_logic; signal kdata1 : std_logic_vector(11 downto 0); signal kaddress1 : std_logic_vector(5 downto 0); signal kdata2 : std_logic_vector(11 downto 0); signal kdataq1 : std_logic_vector(7 downto 0); signal kdataq2 : std_logic_vector(7 downto 0); signal kdata3 : std_logic_vector(15 downto 0); signal kdata4 : std_logic_vector(15 downto 0); signal kdata5 : std_logic_vector(7 downto 0); signal kdata6 : std_logic_vector(23 downto 0); signal error : std_logic_vector(2 downto 0); signal jpg_setting : jpg_set_type; signal startgen : std_logic; signal kaddq : std_logic_vector(7 downto 0); signal krdq : std_logic; signal krddataq : std_logic_vector(7 downto 0); -- pragma translate_off file out_file1 : text open write_mode is "aft_huff.txt"; file out_file2 : text open write_mode is "aft_huffmem.txt"; file out_file3 : text open write_mode is "aft_dct1.txt"; file out_file4 : text open write_mode is "aft_dctmem.txt"; file out_file5 : text open write_mode is "aft_dct2.txt"; file out_file6 : text open write_mode is "aft_yccmem.txt"; -- pragma translate_on begin huffman : huff generic map(memtech => memtech,shindex => shindex , haddr => haddr, hmask => hmask, hirq => hirq, pindex => pindex, paddr => paddr, pmask => pmask) port map(rst => rst, clk => clk, ahbsi => ahbsi, ahbso => ahbso, apbi => apbi, apbo => apbo, kready => kready1, kstrobe => kstrobe1, kdata => kdata1, kaddress => kaddress1, jpg_setting => jpg_setting, error => error, startgen => startgen, kstrobeq => kstrobeq, kdataq => kdataq1, kaddq => kaddq, krddataq => krddataq, krdq => krdq); dctmem1 : huffmemcont generic map(memtech => memtech) port map(rst => rst, clk => clk, kready1 => kready1, kstrobe1 => kstrobe1, kaddress1 => kaddress1, kdata1 => kdata1, kready2 => kready2, kstrobe2 => kstrobe2, kdata2 => kdata2, error =>error(0), samp_fact => jpg_setting.samp_fact, kstrobeq1 => kstrobeq, kdataq1 => kdataq1, kdataq2 => kdataq2, kaddq => kaddq, krdq => krdq, krddataq => krddataq, startgen => startgen); dct1 : idct1 port map(rst => rst, clk => clk, ready1 => kready2, strobe1 => kstrobe2, coeffin => kdata2, quantin => kdataq2, outdata => kdata3, ready2 => kready3, strobe2 => kstrobe3, startgen => startgen); dctmem2 : dctmem2cont generic map(memtech => memtech) port map(rst => rst, clk => clk, kready1 => kready3, kstrobe1 => kstrobe3, kdata1 => kdata3, kready2 => kready4, kstrobe2 => kstrobe4, kdata2 => kdata4, error => error(1), startgen => startgen); dct2 : idct2 port map(rst => rst, clk => clk, ready1 => kready4, strobe1 => kstrobe4, coeffin => kdata4, outdata => kdata5, ready2 => kready5, strobe2 => kstrobe5, startgen => startgen); yccmem : yccmemcont generic map(memtech => memtech) port map(rst => rst, clk => clk, kready1 => kready5, kstrobe1 => kstrobe5, kdata1 => kdata5, kready2 => kready6, kstrobe2 => kstrobe6, kdata2 => kdata6, samp_fact => jpg_setting.samp_fact, error => error(2), startgen => startgen); ycb : yccrgb generic map(memtech => memtech, hirq => hirq, mhindex => mhindex, chprot => chprot) port map(rst => rst, clk => clk, ahbmi => ahbmi, ahbmo => ahbmo, kready => kready6, kstrobe => kstrobe6, kdata => kdata6, xmcumax => jpg_setting.xmcumax, ymcumax => jpg_setting.ymcumax, incaddy => jpg_setting.incaddy, incaddmcux => jpg_setting.incaddmcux, incaddmcuy => jpg_setting.incaddmcuy, fbstartadd => jpg_setting.fbstartadd, startgen => startgen); -- pragma translate_off writeout : process(clk,kstrobe1, kstrobe2, kstrobe3, kstrobe4, kstrobe5,kstrobe6, kdata1, kdata2, kdata3,kdata4,kdata5,kdata6) variable lc1 : line; variable lc2 : line; variable lc3 : line; variable lc4 : line; variable lc5 : line; variable lc6 : line; variable data1 : std_logic_vector(11 downto 0); variable data2 : std_logic_vector(11 downto 0); variable data3 : std_logic_vector(15 downto 0); variable data4 : std_logic_vector(15 downto 0); variable data5 : std_logic_vector(7 downto 0); variable data6 : std_logic_vector(23 downto 0); begin if rising_edge(clk)then if (kstrobe1 = '1')then data1 := kdata1; hwrite(lc1, kdata1, RIGHT, 3); writeline(out_file1,lc1); end if; if (kstrobe2 = '1')then hwrite(lc2, kdata2, RIGHT, 3); writeline(out_file2,lc2); end if; if(kstrobe3 = '1')then hwrite(lc3, kdata3, RIGHT, 4); writeline(out_file3,lc3); end if; if (kstrobe4 = '1')then hwrite(lc4, kdata4, RIGHT, 4); writeline(out_file4,lc4); end if; if(kstrobe5 = '1')then hwrite(lc5, kdata5, RIGHT, 2); writeline(out_file5,lc5); end if; if(kstrobe6 = '1')then hwrite(lc6, kdata6, RIGHT, 6); writeline(out_file6, lc6); end if; end if; end process; -- pragma translate_on end;