OpenCores
URL https://opencores.org/ocsvn/lzrw1-compressor-core/lzrw1-compressor-core/trunk

Subversion Repositories lzrw1-compressor-core

[/] [lzrw1-compressor-core/] [trunk/] [hw/] [xst_14_2/] [history.vhd] - Rev 2

Compare with Previous | Blame | View Log

 
--/**************************************************************************************************************
--*
--*   B i t H o u n d   -   A n   F P G A   B a s e d   L o g i c   A n a l y z e r
--*
--*   FPGA Design 
--* 
--* Copyright 2012   Mario Mauerer (MM), Lukas Schrittwieser (LS), ETH Zurich
--*
--*    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 3 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, see <http://www.gnu.org/licenses/>.
--*
--***************************************************************************************************************
--*
--* Change Log:
--*
--* Version 1.0 - 2012/6/21 - LS
--*   started file
--*
--*
--***************************************************************************************************************
--*
--* Naming convention:  http://dz.ee.ethz.ch/en/information/hdl-help/vhdl-naming-conventions.html
--*
--***************************************************************************************************************
--*
--* 
--*
--***************************************************************************************************************
 
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
 
library UNISIM;
use UNISIM.VComponents.all;
 
entity historyBuffer is
 
 
  port (
    ClkxCI          : in  std_logic;
    RstxRI          : in  std_logic;
    WriteInxDI      : in  std_logic_vector(7 downto 0);
    WExSI           : in  std_logic;
    NextWrAdrxDO    : out std_logic_vector(11 downto 0);  -- memory address at which the next byte will be written
    RExSI           : in  std_logic;    -- initiate a memory read back
    ReadBackAdrxDI  : in  std_logic_vector(11 downto 2);  -- for speed up read back is only word adressable
    ReadBackxDO     : out std_logic_vector(16*8-1 downto 0);
    ReadBackDonexSO : out std_logic);  -- indicates that requested read back data is available
 
end historyBuffer;
 
 
architecture Behavioral of historyBuffer is
 
  signal WrPtrxDN, WrPtrxDP         : std_logic_vector(11 downto 0) := (others => '0');
  signal RamWrAdrxD                 : std_logic_vector(13 downto 0);  --  address for all memroy banks
  signal Ram0RdAdrAxD, Ram0RdAdrBxD : std_logic_vector(13 downto 0);
  signal Ram1RdAdrAxD, Ram1RdAdrBxD : std_logic_vector(13 downto 0);
  signal Ram0AdrAxD, Ram1AdrAxD     : std_logic_vector(13 downto 0);
  signal RamWrDataxD                : std_logic_vector(31 downto 0);
  signal Ram0OutAxD, Ram0OutBxD     : std_logic_vector(32 downto 0);
  signal Ram1OutAxD, Ram1OutBxD     : std_logic_vector(31 downto 0);
  signal Ram0WExS, Ram1WExS         : std_logic;
 
  signal RdAdrIntxD                       : integer;  -- to split up long expressions (type casts)
  signal Ram0RdAdrBasexD, Ram1RdAdrBasexD : integer;
 
  signal LastReadBackAdrxDN, LastReadBackAdrxDP : std_logic_vector(11 downto 2);
 
begin
 
  RamWrAdrxD <= "000000" & WrPtrxDP(11 downto 3);
 
-- Note: If the requested address is not a multiple of 8 (ie bit 2 is 1) the
-- first word (4 bytes) we read is in ram 1. Therefore the adress for ram 0 has
-- to be incremented by 1. 
  RdAdrIntxD      <= to_integer(unsigned(ReadBackAdrxDI(11 downto 3)));
  Ram0RdAdrBasexD <= RdAdrIntxD   when ReadBackAdrxDI(2) = '0' else RdAdrIntxD+1;
  Ram1RdAdrBasexD <= RdAdrIntxD;
  Ram0RdAdrAxD    <= "000000" & std_logic_vector(unsigned(Ram0RdAdrBasexD, 9));
  Ram0RdAdrBxD    <= "000000" & std_logic_vector(unsigned(Ram0RdAdrBasexD+1, 9));
  Ram1RdAdrAxD    <= "000000" & std_logic_vector(unsigned(Ram1RdAdrBasexD, 9));
  Ram1RdAdrBxD    <= "000000" & std_logic_vector(unsigned(Ram1RdAdrBasexD+1, 9));
  -- select port A address based on read/write mode
  Ram0AdrAxD      <= Ram0RdAdrAxD when WExSI = '0' else ("000000", WrPtrxDP(11 downto 3));
  Ram1AdrAxD      <= Ram1RdAdrBxD when WExSI = '0' else ("000000", WrPtrxDP(11 downto 3));
 
  RamWrDataxD <= WriteInxDI & WriteInxDI & WriteInxDI & WriteInxDI;
 
  -- The memory behaves like a register -> save requested adress for output decoder
  LastReadBackAdrxDN <= ReadBackAdrxDI;
 
  -- the read back value is reordered depending on wether the requested address
-- is a multiple of 8 or not. See comment above.
  ReadBackxDO <= (Ram0OutAxD, Ram1OutAxD, Ram0OutBxD, Ram1OutBxD) when LastReadBackAdrxDP(2) = '0' \
                 else (Ram1OutAxD, Ram0OutAxD, Ram1OutBxD, Ram0OutBxD);
 
  -- implement a write address counter
  wrCntPrcs : process (WExSI, WrPtrxDP)
  begin
    WrPtrxDN <= WrPtrxDP;
    Ram0WExS <= "0000";
    Ram1WExS <= "0000";
    if WExSI = '1' then
      WrPtrxDN <= std_logic_vector(unsigned(to_integer(unsigned(WrPtrxDP))+1, 12));
      -- decode lower 3 bits to the 8 write enable lines
      if WrPtrxDP(2) = '0' then
        -- write to ram 0
        Ram0WExS(to_integer(unsigned(WrPtrxDP(1 downto 0)))) <= '1';
      else
        Ram1WExS(to_integer(unsigned(WrPtrxDP(1 downto 0)))) <= '1';
      end if;
    end if;
  end process wrCntPrcs;
 
  NextWrAdrxDO <= WrPtrxDP;
 
  process (ClkxCI, RstxRI)
  begin  -- process
    if RstxRI = '1' then
      LastReadBackAdrxDP <= (others => '0');
      WrPtrxDP           <= (others => '0');
 
    elsif ClkxCI'event and ClkxCI = '1' then  -- rising clock edge
      LastReadBackAdrxDP <= LastReadBackAdrxDN;
      WrPtrxDP           <= WrPtrxDN;
    end if;
  end process;
 
  -- port A is used to write and read (lower bytes) data, port B is for read only
  HistMem0Inst : RAMB16BWER
    generic map (
      -- DATA_WIDTH_A/DATA_WIDTH_B: 0, 1, 2, 4, 9, 18, or 36
      DATA_WIDTH_A        => 36,
      DATA_WIDTH_B        => 36,
      -- DOA_REG/DOB_REG: Optional output register (0 or 1)
      DOA_REG             => 0,
      DOB_REG             => 0,
      -- EN_RSTRAM_A/EN_RSTRAM_B: Enable/disable RST
      EN_RSTRAM_A         => true,
      EN_RSTRAM_B         => true,
      -- INIT_A/INIT_B: Initial values on output port
      INIT_A              => X"000000000",
      INIT_B              => X"000000000",
      -- INIT_FILE: Optional file used to specify initial RAM contents
      INIT_FILE           => "NONE",
      -- RSTTYPE: "SYNC" or "ASYNC" 
      RSTTYPE             => "SYNC",
      -- RST_PRIORITY_A/RST_PRIORITY_B: "CE" or "SR" 
      RST_PRIORITY_A      => "CE",
      RST_PRIORITY_B      => "CE",
      -- SIM_COLLISION_CHECK: Collision check enable "ALL", "WARNING_ONLY", "GENERATE_X_ONLY" or "NONE" 
      SIM_COLLISION_CHECK => "ALL",
      -- SIM_DEVICE: Must be set to "SPARTAN6" for proper simulation behavior
      SIM_DEVICE          => "SPARTAN6",
      -- SRVAL_A/SRVAL_B: Set/Reset value for RAM output
      SRVAL_A             => X"000000000",
      SRVAL_B             => X"000000000",
      -- WRITE_MODE_A/WRITE_MODE_B: "WRITE_FIRST", "READ_FIRST", or "NO_CHANGE" 
      WRITE_MODE_A        => "WRITE_FIRST",
      WRITE_MODE_B        => "WRITE_FIRST"
      )
    port map (
      -- Port A Data: 32-bit (each) Port A data
      DOA    => Ram0OutAxD,             -- 32-bit A port data output
      DOPA   => open,                   -- 4-bit A port parity output
      -- Port B Data: 32-bit (each) Port B data
      DOB    => Ram0OutBxD,
      DOPB   => open,
      -- Port A Address/Control Signals: 14-bit (each) Port A address and control signals
      ADDRA  => Ram0AdrAxD,             -- 14-bit A port address input
      CLKA   => ClkxCI,                 -- 1-bit A port clock input
      ENA    => '1',                    -- 1-bit A port enable input
      REGCEA => '1',           -- 1-bit A port register clock enable input
      RSTA   => RstxRI,        -- 1-bit A port register set/reset input
      WEA    => Ram0WExS,      -- 4-bit Port A byte-wide write enable input
      -- Port A Data: 32-bit (each) Port A data
      DIA    => RamWrDataxD,            -- 32-bit A port data input
      DIPA   => "0000",                 -- 4-bit A port parity input
      -- Port B Address/Control Signals: 14-bit (each) Port B address and control signals
      ADDRB  => Ram0RdAdrBxD,           -- 14-bit B port address input
      CLKB   => ClkxCI,                 -- 1-bit B port clock input
      ENB    => '0',                    -- 1-bit B port enable input
      REGCEB => '0',           -- 1-bit B port register clock enable input
      RSTB   => RstxRI,        -- 1-bit B port register set/reset input
      WEB    => x"0",          -- 4-bit Port B byte-wide write enable input
      -- Port B Data: 32-bit (each) Port B data
      DIB    => x"00000000",            -- 32-bit B port data input
      DIPB   => x"0"                    -- 4-bit B port parity input
      );
 
 
  -- RAM 1
  -- port A is used to write and read (lower bytes) data, port B is for read only
  HistMem1Inst : RAMB16BWER
    generic map (
      -- DATA_WIDTH_A/DATA_WIDTH_B: 0, 1, 2, 4, 9, 18, or 36
      DATA_WIDTH_A        => 36,
      DATA_WIDTH_B        => 36,
      -- DOA_REG/DOB_REG: Optional output register (0 or 1)
      DOA_REG             => 0,
      DOB_REG             => 0,
      -- EN_RSTRAM_A/EN_RSTRAM_B: Enable/disable RST
      EN_RSTRAM_A         => true,
      EN_RSTRAM_B         => true,
      -- INIT_A/INIT_B: Initial values on output port
      INIT_A              => X"000000000",
      INIT_B              => X"000000000",
      -- INIT_FILE: Optional file used to specify initial RAM contents
      INIT_FILE           => "NONE",
      -- RSTTYPE: "SYNC" or "ASYNC" 
      RSTTYPE             => "SYNC",
      -- RST_PRIORITY_A/RST_PRIORITY_B: "CE" or "SR" 
      RST_PRIORITY_A      => "CE",
      RST_PRIORITY_B      => "CE",
      -- SIM_COLLISION_CHECK: Collision check enable "ALL", "WARNING_ONLY", "GENERATE_X_ONLY" or "NONE" 
      SIM_COLLISION_CHECK => "ALL",
      -- SIM_DEVICE: Must be set to "SPARTAN6" for proper simulation behavior
      SIM_DEVICE          => "SPARTAN6",
      -- SRVAL_A/SRVAL_B: Set/Reset value for RAM output
      SRVAL_A             => X"000000000",
      SRVAL_B             => X"000000000",
      -- WRITE_MODE_A/WRITE_MODE_B: "WRITE_FIRST", "READ_FIRST", or "NO_CHANGE" 
      WRITE_MODE_A        => "WRITE_FIRST",
      WRITE_MODE_B        => "WRITE_FIRST"
      )
    port map (
      -- Port A Data: 32-bit (each) Port A data
      DOA    => Ram1OutAxD,             -- 32-bit A port data output
      DOPA   => open,                   -- 4-bit A port parity output
      -- Port B Data: 32-bit (each) Port B data
      DOB    => Ram1OutBxD,
      DOPB   => open,
      -- Port A Address/Control Signals: 14-bit (each) Port A address and control signals
      ADDRA  => Ram1AdrAxD,    -- port A is used to write and read (lower bytes) data, port B is for read only
  HistMem0Inst : RAMB16BWER
    generic map (
      -- DATA_WIDTH_A/DATA_WIDTH_B: 0, 1, 2, 4, 9, 18, or 36
      DATA_WIDTH_A        => 36,
      DATA_WIDTH_B        => 36,
      -- DOA_REG/DOB_REG: Optional output register (0 or 1)
      DOA_REG             => 0,
      DOB_REG             => 0,
      -- EN_RSTRAM_A/EN_RSTRAM_B: Enable/disable RST
      EN_RSTRAM_A         => true,
      EN_RSTRAM_B         => true,
      -- INIT_A/INIT_B: Initial values on output port
      INIT_A              => X"000000000",
      INIT_B              => X"000000000",
      -- INIT_FILE: Optional file used to specify initial RAM contents
      INIT_FILE           => "NONE",
      -- RSTTYPE: "SYNC" or "ASYNC" 
      RSTTYPE             => "SYNC",
      -- RST_PRIORITY_A/RST_PRIORITY_B: "CE" or "SR" 
      RST_PRIORITY_A      => "CE",
      RST_PRIORITY_B      => "CE",
      -- SIM_COLLISION_CHECK: Collision check enable "ALL", "WARNING_ONLY", "GENERATE_X_ONLY" or "NONE" 
      SIM_COLLISION_CHECK => "ALL",
      -- SIM_DEVICE: Must be set to "SPARTAN6" for proper simulation behavior
      SIM_DEVICE          => "SPARTAN6",
      -- SRVAL_A/SRVAL_B: Set/Reset value for RAM output
      SRVAL_A             => X"000000000",
      SRVAL_B             => X"000000000",
      -- WRITE_MODE_A/WRITE_MODE_B: "WRITE_FIRST", "READ_FIRST", or "NO_CHANGE" 
      WRITE_MODE_A        => "WRITE_FIRST",
      WRITE_MODE_B        => "WRITE_FIRST"
      )
    port map (
      -- Port A Data: 32-bit (each) Port A data
      DOA    => Ram0OutAxD,             -- 32-bit A port data output
      DOPA   => open,                   -- 4-bit A port parity output
      -- Port B Data: 32-bit (each) Port B data
      DOB    => Ram0OutBxD,
      DOPB   => open,
      -- Port A Address/Control Signals: 14-bit (each) Port A address and control signals
      ADDRA  => Ram0AdrAxD,             -- 14-bit A port address input
      CLKA   => ClkxCI,                 -- 1-bit A port clock input
      ENA    => ,                       -- 1-bit A port enable input
      REGCEA => '1',          -- 1-bit A port register clock enable input
      RSTA   => RstxRI,       -- 1-bit A port register set/reset input
      WEA    => "1111",       -- 4-bit Port A byte-wide write enable input
      -- Port A Data: 32-bit (each) Port A data
      DIA    => RamWrDataxD,            -- 32-bit A port data input
      DIPA   => "0000",                 -- 4-bit A port parity input
      -- Port B Address/Control Signals: 14-bit (each) Port B address and control signals
      ADDRB  => Ram0RdAdrBxD,                       -- 14-bit B port address input
      CLKB   => ClkxCI,                 -- 1-bit B port clock input
      ENB    => '0',                    -- 1-bit B port enable input
      REGCEB => '0',          -- 1-bit B port register clock enable input
      RSTB   => RstxRI,       -- 1-bit B port register set/reset input
      WEB    => x"0",         -- 4-bit Port B byte-wide write enable input
      -- Port B Data: 32-bit (each) Port B data
      DIB    => x"00000000",            -- 32-bit B port data input
      DIPB   => x"0"                    -- 4-bit B port parity input
      );         -- 14-bit A port address input
      CLKA   => ClkxCI,                 -- 1-bit A port clock input
      ENA    => '1',                    -- 1-bit A port enable input
      REGCEA => '1',           -- 1-bit A port register clock enable input
      RSTA   => RstxRI,        -- 1-bit A port register set/reset input
      WEA    => Ram1WExS,      -- 4-bit Port A byte-wide write enable input
      -- Port A Data: 32-bit (each) Port A data
      DIA    => RamWrDataxD,            -- 32-bit A port data input
      DIPA   => "0000",                 -- 4-bit A port parity input
      -- Port B Address/Control Signals: 14-bit (each) Port B address and control signals
      ADDRB  => Ram1RdAdrBxD,           -- 14-bit B port address input
      CLKB   => ClkxCI,                 -- 1-bit B port clock input
      ENB    => '0',                    -- 1-bit B port enable input
      REGCEB => '0',           -- 1-bit B port register clock enable input
      RSTB   => RstxRI,        -- 1-bit B port register set/reset input
      WEB    => x"0",          -- 4-bit Port B byte-wide write enable input
      -- Port B Data: 32-bit (each) Port B data
      DIB    => x"00000000",            -- 32-bit B port data input
      DIPB   => x"0"                    -- 4-bit B port parity input
      );
 
end Behavioral;
 
 
 
 

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.