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 + -
显示快捷键?