OpenCores
URL https://opencores.org/ocsvn/dirac/dirac/trunk

Subversion Repositories dirac

[/] [dirac/] [trunk/] [src/] [testbench/] [DECODERTESTBENCH.VHD] - Rev 9

Go to most recent revision | Compare with Previous | Blame | View Log

-- ***** BEGIN LICENSE BLOCK *****
-- 
-- $Id: DECODERTESTBENCH.VHD,v 1.1 2006-09-06 18:41:06 petebleackley Exp $ $Name: not supported by cvs2svn $
-- *
-- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
-- *
-- * The contents of this file are subject to the Mozilla Public License
-- * Version 1.1 (the "License"); you may not use this file except in compliance
-- * with the License. You may obtain a copy of the License at
-- * http://www.mozilla.org/MPL/
-- *
-- * Software distributed under the License is distributed on an "AS IS" basis,
-- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
-- * the specific language governing rights and limitations under the License.
-- *
-- * The Original Code is BBC Research and Development code.
-- *
-- * The Initial Developer of the Original Code is the British Broadcasting
-- * Corporation.
-- * Portions created by the Initial Developer are Copyright (C) 2004.
-- * All Rights Reserved.
-- *
-- * Contributor(s): Peter Bleackley (Original author)
-- *
-- * Alternatively, the contents of this file may be used under the terms of
-- * the GNU General Public License Version 2 (the "GPL"), or the GNU Lesser
-- * Public License Version 2.1 (the "LGPL"), in which case the provisions of
-- * the GPL or the LGPL are applicable instead of those above. If you wish to
-- * allow use of your version of this file only under the terms of the either
-- * the GPL or LGPL and not to allow others to use your version of this file
-- * under the MPL, indicate your decision by deleting the provisions above
-- * and replace them with the notice and other provisions required by the GPL
-- * or LGPL. If you do not delete the provisions above, a recipient may use
-- * your version of this file under the terms of any one of the MPL, the GPL
-- * or the LGPL.
-- * ***** END LICENSE BLOCK ***** */
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
use IEEE.std_logic_textio.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use STD.textio.all;


entity DECODERTESTBENCH is
end DECODERTESTBENCH;

architecture BEHAVIOUR of DECODERTESTBENCH is

        component ARITHMETICDECODER
        port (ENABLE : in std_logic;
                DATA_IN : in std_logic;
                NEWCONTEXT : in std_logic;
                CONTEXT_SELECT : in std_logic_vector (5 downto 0);
                HALVECOUNTS : in std_logic;
                RESET : in std_logic;
                CLOCK : in std_logic;
                SENDING : out std_logic;
                DATA_OUT : out std_logic);
        end component ARITHMETICDECODER;
        component EXP_GOLOMB_DECODER
        port (  ENABLE : in std_logic;
                DATA_IN : in std_logic;
                RESET : in std_logic;
                CLOCK : in std_logic;
                READY : out std_logic;
                DATA_OUT : out std_logic_vector (31 downto 0));
        end component EXP_GOLOMB_DECODER;
        signal BYTES_INPUT : std_logic_vector (31 downto 0);
        type STATUS is (OFFSET,FIND_START,GET_SIZE,FEED_DATA,PAUSE,FINISHED);
        signal DECODER_STATE : STATUS := OFFSET;
        signal ENABLE_DECODER : std_logic;
        signal DECODER_DATA_IN : std_logic;
        signal NEWCONTEXT : std_logic;
        signal CONTEXT_SELECT : std_logic_vector (5 downto 0);
        signal HALVECOUNTS : std_logic;
        signal FLUSH : std_logic;
        signal RESET : std_logic;
        signal CLOCK : std_logic := '0';
        signal SENDING : std_logic;
        signal DATA_OUT : std_logic;
        signal GETCONTEXT : std_logic;
        signal EG_ENABLE : std_logic;
        signal EG_DATA_IN : std_logic;
        signal EG_READY : std_logic;
        signal INIT : std_logic := '1';
--      signal LAST_BYTE : integer;
--      signal AFTER_FLUSH : std_logic;
--      signal BITPOS2 : integer;
--      signal COMPDATA : integer;
        signal BYTES_TO_DECODE : std_logic_vector (31 downto 0);
        type CHARFILE is file of character;
        file HEADERFILE : CHARFILE open read_mode is "test1.hdr";
        file DIRACFILE : CHARFILE open read_mode is "test1.dr1";
        file CONTEXTFILE : CHARFILE open read_mode is "test1.ctx";
        file TARGETFILE : CHARFILE open read_mode is "test1.dr0";
        type INTARRAY is array (5 downto 0) of integer;
        constant PERIOD : time := 10 ns;
begin

UUT : ARITHMETICDECODER
        port map(ENABLE => ENABLE_DECODER,
                DATA_IN => DECODER_DATA_IN,
                NEWCONTEXT => NEWCONTEXT,
                CONTEXT_SELECT => CONTEXT_SELECT,
                HALVECOUNTS => HALVECOUNTS,
                RESET => RESET,
                CLOCK => CLOCK,
                SENDING => SENDING,
                DATA_OUT => DATA_OUT);
                
EGD : EXP_GOLOMB_DECODER
        port map(ENABLE => EG_ENABLE,
                DATA_IN => EG_DATA_IN,
                RESET => RESET,
                CLOCK => CLOCK,
                READY => EG_READY,
                DATA_OUT => BYTES_TO_DECODE);
                
                
        CLOCK <= not CLOCK after PERIOD/2;
        
--DELAY_FLUSH_SIGNAL : process (CLOCK)
--begin
--      if CLOCK'event and CLOCK = '1' then
--              AFTER_FLUSH <= FLUSH;
--      end if;
--end process DELAY_FLUSH_SIGNAL;
        
TESTBENCH : process (CLOCK)
variable SCAN : INTARRAY;
variable READPLACE : integer := 5;
variable BITPOSITION : integer;
variable DIRACDATA : integer;
variable DIRACREAD : character;
variable TARGETREAD : character;
variable PAUSECOUNT : integer;
begin
        if CLOCK'event and CLOCK='1' then
                if DECODER_STATE = OFFSET then
                        if READPLACE = 0 then
                                DECODER_STATE <= FIND_START;
                                BITPOSITION := 0;
                --      elsif AFTER_FLUSH = '1' and READPLACE = 4 then
                --              SCAN(5) := LAST_BYTE;
                        else
                                if READPLACE < 5 and INIT = '1' then
                                        INIT <= '0';
                                end if;
                                read(TARGETFILE,TARGETREAD);
                                SCAN(READPLACE) := character'pos(TARGETREAD);
                                READPLACE := READPLACE - 1;
                                
                        end if;
                elsif DECODER_STATE = FIND_START then
                        if SCAN (5 downto 1) = ( 16#42#, 16#42#, 16#43#, 16#44#, 16#AC# ) then
                                --BITPOS2 <= BITPOSITION;
                                --COMPDATA <= SCAN(0);
                                DECODER_STATE <= GET_SIZE;
                                if BITPOSITION = 0 then
                                        BITPOSITION := 128;
                                end if;
                        elsif SCAN(5 downto 1) = (16#42#, 16#42#, 16#43#, 16#44#, 16#D0# ) then
                                DECODER_STATE <= FINISHED;
                        elsif BITPOSITION = 0 then
                                read(TARGETFILE,TARGETREAD);
                                read(HEADERFILE,DIRACREAD);
                                SCAN(0) := character'pos(TARGETREAD);
                                DIRACDATA := character'pos(DIRACREAD);
                                BITPOSITION := 128;
                        else
                                for I in 5 downto 1 loop
                                        if SCAN(I) > 127 then
                                                SCAN(I) := SCAN(I) - 128;
                                        end if;
                                        SCAN(I) := SCAN(I)*2;
                                        if SCAN(I-1) > 127 then
                                                SCAN(I) := SCAN(I) + 1;
                                        end if;
                                end loop;
                                if SCAN(0) > 127 then
                                        SCAN(0) := SCAN(0) - 128;
                                end if;
                                SCAN(0) := SCAN(0)*2;
                                BITPOSITION := BITPOSITION/2;
                        end if;
                elsif DECODER_STATE = GET_SIZE then
                        if EG_READY = '1' then
                                DECODER_STATE <= FEED_DATA;
                                BITPOSITION := 128;
                                EG_ENABLE <= '0';
                                BYTES_INPUT <= (others => '0');
                        elsif EG_ENABLE = '1' then
                                EG_ENABLE <= '0';
                        else
                                if BITPOSITION = 128 then
                                        READ(HEADERFILE,DIRACREAD);
                                        DIRACDATA := character'pos(DIRACREAD);
                                end if;
                                if (DIRACDATA rem (BITPOSITION*2))/BITPOSITION = 1 then
                                        EG_DATA_IN <= '1';
                                else
                                        EG_DATA_IN <= '0';
                                end if;
                                EG_ENABLE <= '1';
                                if BITPOSITION = 1 then
                                        BITPOSITION := 128;
                                else
                                        BITPOSITION := BITPOSITION/2;
                                end if;
                        end if;
                elsif DECODER_STATE = FEED_DATA then
                        if FLUSH = '1' then
                                DECODER_STATE <= OFFSET;
                                ENABLE_DECODER <= '0';
                        --      if BITPOSITION = 128 then
                        --              READPLACE := 4;
                        --      else
                                        READPLACE := 5;
                        --      end if;
                        elsif BITPOSITION = 0 then
                                DECODER_STATE <= PAUSE;
                                BYTES_INPUT <= BYTES_INPUT + 1;
                                ENABLE_DECODER <= '0';
                                PAUSECOUNT := 0;
                        else
                                if BITPOSITION = 128 then
                                        if BYTES_INPUT < BYTES_TO_DECODE then
                                                read(DIRACFILE,DIRACREAD);
                                                DIRACDATA := character'pos(DIRACREAD);
                                        else
                                                DIRACDATA := 0;
                                        end if;
                                end if;
                                if (DIRACDATA rem (BITPOSITION*2))/BITPOSITION = 1 then
                                        DECODER_DATA_IN <= '1';
                                else
                                        DECODER_DATA_IN <= '0';
                                end if;
                                ENABLE_DECODER <= '1';
                                BITPOSITION := BITPOSITION/2;
                        end if;
                elsif DECODER_STATE = PAUSE then
                        if FLUSH = '1' then
                                DECODER_STATE <= OFFSET;
                                READPLACE := 5;
                        elsif PAUSECOUNT > 7 then
                                DECODER_STATE <= FEED_DATA;
                                BITPOSITION := 128;
                        elsif SENDING = '1' then
                                PAUSECOUNT := 0;
                        else
                                PAUSECOUNT := PAUSECOUNT+1;
                        end if;
                else --DECODER_STATE = FINISHED;
                        report "Finished" severity failure;
                end if;
        end if;
end process TESTBENCH;

RESET <= INIT or FLUSH;

GETCONTEXT <= (RESET or SENDING) and not NEWCONTEXT;

CONTEXT : process (CLOCK)
variable CONTEXTREAD : character;
variable CONTEXTDATA : integer;
variable READPOSITION : integer;
variable NUMBER_READ : integer :=0;
begin
        if CLOCK'event and CLOCK = '1' then
                if GETCONTEXT = '1' then
                        read(CONTEXTFILE,CONTEXTREAD);
                        NUMBER_READ := NUMBER_READ + 1;
                        CONTEXTDATA := character'pos(CONTEXTREAD);
                        if (CONTEXTDATA rem 2) = 1 then
                                FLUSH <= '1';
                        else
                                FLUSH <= '0';
                                if(CONTEXTDATA rem 4)/2 = 1 then
                                        HALVECOUNTS <= '1';
                                else
                                        HALVECOUNTS <= '0';
                                end if;
                                READPOSITION := 128;
                                for I in 5 downto 0 loop
                                        if (CONTEXTDATA rem (READPOSITION*2))/READPOSITION = 1 then
                                                CONTEXT_SELECT(I) <= '1';
                                        else
                                                CONTEXT_SELECT(I) <= '0';
                                        end if;
                                READPOSITION := READPOSITION/2;
                                end loop;
                                NEWCONTEXT <= '1';
                        end if;
                else
                        NEWCONTEXT <= '0';
                        FLUSH <= '0';
                        HALVECOUNTS <= '0';
                end if;
        end if;
end process CONTEXT;


CHECK_RESULTS : process (CLOCK)
variable DATA : integer;
variable COMPARISON : integer;
variable COMP2 : integer;
--variable BITPOSITION : integer;
variable INDEX : integer;
variable COMPREAD : character;
begin
        if CLOCK'event and CLOCK = '1' then
                if RESET = '1' then
                --      DATA := 0;
                --      BITPOSITION := BITPOS2;
                --      read(TARGETFILE,COMPREAD);
                --      COMPARISON := character'pos(COMPREAD);
                --      COMP2 := 0;
                        INDEX := 128;
                elsif SENDING = '1' then
                        if INDEX = 128 then
                                DATA := 0;
                                read(TARGETFILE,COMPREAD);
                                COMPARISON := character'pos(COMPREAD);
                                COMP2 := 0;
                        end if;
                        if DATA_OUT = '1' then
                                DATA:=DATA+INDEX;
                        end if;
                        if (COMPARISON rem (INDEX*2))/INDEX = 1 then
                                COMP2 := COMP2 + INDEX;
                        end if;
                        assert COMP2 = DATA report "Decoder has Diverged" severity failure;
                        if INDEX = 1 then
                --              read(TARGETFILE,COMPREAD);
                --              COMPARISON := character'pos(COMPREAD);
                --              LAST_BYTE <= COMPARISON;
                --              COMP2 := 0;
                --              DATA := 0;
                        --      BITPOSITION := 128;
                                INDEX := 128;
                        else
                        --      BITPOSITION := BITPOSITION/2;
                                INDEX := INDEX/2;
                        end if;
                end if;
        end if;
end process CHECK_RESULTS;

end architecture BEHAVIOUR;

                                
                                                
                                
                                
                                
                
        
                

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.