mdcttb_pkg.vhd

来自「Pure hardware JPEG Encoder design. Packa」· VHDL 代码 · 共 468 行 · 第 1/2 页

VHD
468
字号
----------------------------------------------------------------------------------                                                                            ----                          V H D L    F I L E                                ----                          COPYRIGHT (C) 2006                                ----                                                                            -------------------------------------------------------------------------------------- Title       : MDCTTB_PKG-- Design      : MDCT Core-- Author      : Michal Krepa-------------------------------------------------------------------------------------- File        : MDCTTB_PKG.VHD-- Created     : Sat Mar 5 2006--------------------------------------------------------------------------------------  Description : Package for testbench simulation----------------------------------------------------------------------------------library IEEE;  use IEEE.STD_LOGIC_1164.all;  use IEEE.STD_LOGIC_ARITH.all;--  use IEEE.NUMERIC_STD.all;  use IEEE.MATH_REAL.all;library STD;  use STD.TEXTIO.all;  library WORK;  use WORK.MDCT_PKG.all;package MDCTTB_PKG is        ----------------------------------------------    -- constant section 1    ----------------------------------------------    constant MAX_IMAGE_SIZE_X : INTEGER := 1280;    constant MAX_IMAGE_SIZE_Y : INTEGER := 1280;    ----------------------------------------------    -- type section    ----------------------------------------------    type MATRIX_TYPE   is array (0 to N-1,0 TO N-1) of REAL;    type I_MATRIX_TYPE is array (0 to N-1,0 TO N-1) of INTEGER;    type COEM_TYPE     is array (0 to N/2-1, 0 to N/2-1)           of SIGNED(ROMDATA_W-1 downto 0);    type VECTOR4       is array (0 to N/2-1) of REAL;    type N_LINES_TYPE  is array (0 to N-1)          of STD_LOGIC_VECTOR(0 to MAX_IMAGE_SIZE_X*IP_W-1);    type IMAGE_TYPE    is array (0 to MAX_IMAGE_SIZE_Y-1,                                 0 to MAX_IMAGE_SIZE_X-1) of INTEGER;                                     ----------------------------------------------    -- function section    ----------------------------------------------    procedure CMP_MATRIX(ref_matrix   : in I_MATRIX_TYPE;                        dcto_matrix    : in I_MATRIX_TYPE;                       max_error      : in INTEGER;                       error_matrix   : out I_MATRIX_TYPE;                       error_cnt      : inout INTEGER);    function STR(int: INTEGER; base: INTEGER) return STRING;    function COMPUTE_REF_DCT1D(input_matrix : I_MATRIX_TYPE; shift : BOOLEAN                        ) return I_MATRIX_TYPE;    function COMPUTE_REF_IDCT(X : I_MATRIX_TYPE) return I_MATRIX_TYPE;    function COMPUTE_PSNR(ref_input : I_MATRIX_TYPE;                         reconstr_input : I_MATRIX_TYPE) return REAL;    function COMPUTE_PSNR(ref_input : IMAGE_TYPE;                        reconstr_input : IMAGE_TYPE;                       ysize : INTEGER;                       xsize : INTEGER                       ) return REAL;                       ----------------------------------------------    -- constant section 2    ----------------------------------------------      -- set below to true to enable quantization in testbench    constant CLK_FREQ_C        : INTEGER := 50;    constant HOLD_TIME         : TIME := 1 ns;    constant ENABLE_QUANTIZATION_C : BOOLEAN := FALSE;     constant HEX_BASE          : INTEGER := 16;    constant DEC_BASE          : INTEGER := 10;    constant RUN_FULL_IMAGE    : BOOLEAN := FALSE;    constant FILEIN_NAME_C     : STRING := "SOURCE\TESTBENCH\lena512.txt";    constant FILEERROR_NAME_C  : STRING := "SOURCE\TESTBENCH\imagee.txt";    constant FILEIMAGEO_NAME_C : STRING := "SOURCE\TESTBENCH\imageo.txt";    constant MAX_ERROR_1D      : INTEGER := 1;    constant MAX_ERROR_2D      : INTEGER := 4;    constant MAX_PIX_VAL       : INTEGER := 2**IP_W-1;    constant null_data_r       : MATRIX_TYPE :=                           (                          (000.0,000.0,000.0,000.0,000.0,000.0,000.0,000.0),                          (000.0,000.0,000.0,000.0,000.0,000.0,000.0,000.0),                          (000.0,000.0,000.0,000.0,000.0,000.0,000.0,000.0),                          (000.0,000.0,000.0,000.0,000.0,000.0,000.0,000.0),                          (000.0,000.0,000.0,000.0,000.0,000.0,000.0,000.0),                          (000.0,000.0,000.0,000.0,000.0,000.0,000.0,000.0),                          (000.0,000.0,000.0,000.0,000.0,000.0,000.0,000.0),                          (000.0,000.0,000.0,000.0,000.0,000.0,000.0,000.0)                          );         constant input_data0   : I_MATRIX_TYPE :=                           (                          (139,144,149,153,155,155,155,155),                          (144,151,153,156,159,156,156,156),                          (150,155,160,163,158,156,156,156),                          (159,161,162,160,160,159,159,159),                          (159,160,161,162,162,155,155,155),                          (161,161,161,161,160,157,157,157),                          (162,162,161,163,162,157,157,157),                          (162,162,161,161,163,158,158,158)                          );        constant input_data1   : I_MATRIX_TYPE :=                           (                          (255,255,255,000,000,255,254,255),                          (255,255,255,000,000,255,254,000),                          (255,255,255,000,000,255,254,255),                          (255,255,255,000,000,255,254,000),                          (254,000,255,255,000,255,254,255),                          (254,000,255,255,000,255,254,000),                          (254,000,255,255,000,255,254,255),                          (254,000,255,255,000,255,254,000)                          );                              constant input_data2   : I_MATRIX_TYPE :=                           (                          (000,000,000,000,000,000,000,000),                          (000,000,000,000,000,000,000,000),                          (000,000,000,000,000,000,000,000),                          (000,000,000,000,000,000,000,000),                          (000,000,000,000,000,000,000,000),                          (000,000,000,000,000,000,000,000),                          (000,000,000,000,000,000,000,000),                          (000,000,000,000,000,000,000,000)                          );    constant input_data3   : I_MATRIX_TYPE :=                           (                          (55,89,0,2,35,34,100,255),                          (144,151,153,151,159,156,156,156),                          (150,155,165,163,158,126,156,156),                          (254,000,255,255,000,245,254,255),                          (159,199,161,162,162,133,155,165),                          (231,000,255,235,000,255,254,253),                          (162,162,161,163,162,157,157,157),                          (11,12,167,165,166,167,101,108)                          );                              constant input_data4   : I_MATRIX_TYPE :=                           (                          (135,14,145,15,155,15,155,15),                          (140,15,151,15,152,15,153,15),                          (154,15,165,16,156,15,157,15),                          (158,16,168,16,169,15,150,15),                          (15,161,16,162,16,153,15,154),                          (165,16,166,16,167,15,158,15),                          (16,169,16,160,16,152,15,153),                          (164,16,165,16,165,15,156,15)                          );                               -- from JPEG standard (but not in standard itself!)                          constant Q_JPEG_STD : I_MATRIX_TYPE :=                           (                          (16,11,10,16,24,40,51,61),                          (12,12,14,19,26,58,60,55),                          (14,13,16,24,40,57,69,56),                          (14,17,22,29,51,87,80,62),                          (18,22,37,56,68,109,103,77),                          (24,35,55,64,81,104,113,92),                          (49,64,78,87,103,121,120,101),                          (72,92,95,98,112,100,103,99)                          );         -- CANON EOS10D super fine quality                          constant Q_CANON10D : I_MATRIX_TYPE :=                           (                                                                     (1,  1,  1,  1,  1,  1,  2,  2),                          (1,  1, 	1, 	1, 	1, 	2, 	4, 	4),                          (1,  1, 	1, 	1, 	1, 	3, 	3, 	5),                          (1,  1, 	1, 	2, 	3, 	3, 	5, 	5),                          (1,  1, 	3, 	3, 	4, 	4, 	5, 	5),                          (1,  3, 	3, 	3, 	4, 	5, 	6, 	6),                          (2,  3, 	3, 	5, 	3, 	6, 	5, 	5),                          (3,  3, 	4, 	3, 	6, 	4, 	5, 	5)                                   );                              -- quantization matrix used in testbench                          constant Q_MATRIX_USED : I_MATRIX_TYPE := Q_CANON10D;                              constant Ce : COEM_TYPE :=                            (                            (CONV_SIGNED(AP,ROMDATA_W),CONV_SIGNED(AP,ROMDATA_W),CONV_SIGNED(AP,ROMDATA_W),CONV_SIGNED(AP,ROMDATA_W)),                            (CONV_SIGNED(BP,ROMDATA_W),CONV_SIGNED(CP,ROMDATA_W),CONV_SIGNED(CM,ROMDATA_W),CONV_SIGNED(BM,ROMDATA_W)),                            (CONV_SIGNED(AP,ROMDATA_W),CONV_SIGNED(AM,ROMDATA_W),CONV_SIGNED(AM,ROMDATA_W),CONV_SIGNED(AP,ROMDATA_W)),                            (CONV_SIGNED(CP,ROMDATA_W),CONV_SIGNED(BM,ROMDATA_W),CONV_SIGNED(BP,ROMDATA_W),CONV_SIGNED(CM,ROMDATA_W))                            );                                constant Co : COEM_TYPE :=                            (                            (CONV_SIGNED(DP,ROMDATA_W),CONV_SIGNED(EP,ROMDATA_W),CONV_SIGNED(FP,ROMDATA_W),CONV_SIGNED(GP,ROMDATA_W)),                            (CONV_SIGNED(EP,ROMDATA_W),CONV_SIGNED(GM,ROMDATA_W),CONV_SIGNED(DM,ROMDATA_W),CONV_SIGNED(FM,ROMDATA_W)),                            (CONV_SIGNED(FP,ROMDATA_W),CONV_SIGNED(DM,ROMDATA_W),CONV_SIGNED(GP,ROMDATA_W),CONV_SIGNED(EP,ROMDATA_W)),                            (CONV_SIGNED(GP,ROMDATA_W),CONV_SIGNED(FM,ROMDATA_W),CONV_SIGNED(EP,ROMDATA_W),CONV_SIGNED(DM,ROMDATA_W))                            );end MDCTTB_PKG;---------------------------------------------------- PACKAGE BODY--------------------------------------------------                        package body MDCTTB_PKG is    --------------------------------------------------------------------------  -- converts an INTEGER into a CHARACTER  -- for 0 to 9 the obvious mapping is used, higher  -- values are mapped to the CHARACTERs A-Z  -- (this is usefull for systems with base > 10)  -- (adapted from Steve Vogwell's posting in comp.lang.vhdl)   --------------------------------------------------------------------------  function CHR(int: INTEGER) return CHARACTER is   variable c: CHARACTER;  begin    case int is      when  0 => c := '0';      when  1 => c := '1';      when  2 => c := '2';      when  3 => c := '3';      when  4 => c := '4';      when  5 => c := '5';      when  6 => c := '6';      when  7 => c := '7';      when  8 => c := '8';      when  9 => c := '9';      when 10 => c := 'A';      when 11 => c := 'B';      when 12 => c := 'C';

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?