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] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 habicht
 
2
--/**************************************************************************************************************
3
--*
4
--*   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
5
--*
6
--*   FPGA Design 
7
--* 
8
--* Copyright 2012   Mario Mauerer (MM), Lukas Schrittwieser (LS), ETH Zurich
9
--*
10
--*    This program is free software: you can redistribute it and/or modify
11
--*    it under the terms of the GNU General Public License as published by
12
--*    the Free Software Foundation, either version 3 of the License, or
13
--*    (at your option) any later version.
14
--*
15
--*    This program is distributed in the hope that it will be useful,
16
--*    but WITHOUT ANY WARRANTY; without even the implied warranty of
17
--*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
--*    GNU General Public License for more details.
19
--*
20
--*    You should have received a copy of the GNU General Public License
21
--*    along with this program.  If not, see <http://www.gnu.org/licenses/>.
22
--*
23
--***************************************************************************************************************
24
--*
25
--* Change Log:
26
--*
27
--* Version 1.0 - 2012/6/21 - LS
28
--*   started file
29
--*
30
--*
31
--***************************************************************************************************************
32
--*
33
--* Naming convention:  http://dz.ee.ethz.ch/en/information/hdl-help/vhdl-naming-conventions.html
34
--*
35
--***************************************************************************************************************
36
--*
37
--* 
38
--*
39
--***************************************************************************************************************
40
 
41
library IEEE;
42
use IEEE.STD_LOGIC_1164.all;
43
use IEEE.NUMERIC_STD.all;
44
 
45
library UNISIM;
46
use UNISIM.VComponents.all;
47
 
48
entity historyBuffer is
49
 
50
 
51
  port (
52
    ClkxCI          : in  std_logic;
53
    RstxRI          : in  std_logic;
54
    WriteInxDI      : in  std_logic_vector(7 downto 0);
55
    WExSI           : in  std_logic;
56
    NextWrAdrxDO    : out std_logic_vector(11 downto 0);  -- memory address at which the next byte will be written
57
    RExSI           : in  std_logic;    -- initiate a memory read back
58
    ReadBackAdrxDI  : in  std_logic_vector(11 downto 2);  -- for speed up read back is only word adressable
59
    ReadBackxDO     : out std_logic_vector(16*8-1 downto 0);
60
    ReadBackDonexSO : out std_logic);  -- indicates that requested read back data is available
61
 
62
end historyBuffer;
63
 
64
 
65
architecture Behavioral of historyBuffer is
66
 
67
  signal WrPtrxDN, WrPtrxDP         : std_logic_vector(11 downto 0) := (others => '0');
68
  signal RamWrAdrxD                 : std_logic_vector(13 downto 0);  --  address for all memroy banks
69
  signal Ram0RdAdrAxD, Ram0RdAdrBxD : std_logic_vector(13 downto 0);
70
  signal Ram1RdAdrAxD, Ram1RdAdrBxD : std_logic_vector(13 downto 0);
71
  signal Ram0AdrAxD, Ram1AdrAxD     : std_logic_vector(13 downto 0);
72
  signal RamWrDataxD                : std_logic_vector(31 downto 0);
73
  signal Ram0OutAxD, Ram0OutBxD     : std_logic_vector(32 downto 0);
74
  signal Ram1OutAxD, Ram1OutBxD     : std_logic_vector(31 downto 0);
75
  signal Ram0WExS, Ram1WExS         : std_logic;
76
 
77
  signal RdAdrIntxD                       : integer;  -- to split up long expressions (type casts)
78
  signal Ram0RdAdrBasexD, Ram1RdAdrBasexD : integer;
79
 
80
  signal LastReadBackAdrxDN, LastReadBackAdrxDP : std_logic_vector(11 downto 2);
81
 
82
begin
83
 
84
  RamWrAdrxD <= "000000" & WrPtrxDP(11 downto 3);
85
 
86
-- Note: If the requested address is not a multiple of 8 (ie bit 2 is 1) the
87
-- first word (4 bytes) we read is in ram 1. Therefore the adress for ram 0 has
88
-- to be incremented by 1. 
89
  RdAdrIntxD      <= to_integer(unsigned(ReadBackAdrxDI(11 downto 3)));
90
  Ram0RdAdrBasexD <= RdAdrIntxD   when ReadBackAdrxDI(2) = '0' else RdAdrIntxD+1;
91
  Ram1RdAdrBasexD <= RdAdrIntxD;
92
  Ram0RdAdrAxD    <= "000000" & std_logic_vector(unsigned(Ram0RdAdrBasexD, 9));
93
  Ram0RdAdrBxD    <= "000000" & std_logic_vector(unsigned(Ram0RdAdrBasexD+1, 9));
94
  Ram1RdAdrAxD    <= "000000" & std_logic_vector(unsigned(Ram1RdAdrBasexD, 9));
95
  Ram1RdAdrBxD    <= "000000" & std_logic_vector(unsigned(Ram1RdAdrBasexD+1, 9));
96
  -- select port A address based on read/write mode
97
  Ram0AdrAxD      <= Ram0RdAdrAxD when WExSI = '0' else ("000000", WrPtrxDP(11 downto 3));
98
  Ram1AdrAxD      <= Ram1RdAdrBxD when WExSI = '0' else ("000000", WrPtrxDP(11 downto 3));
99
 
100
  RamWrDataxD <= WriteInxDI & WriteInxDI & WriteInxDI & WriteInxDI;
101
 
102
  -- The memory behaves like a register -> save requested adress for output decoder
103
  LastReadBackAdrxDN <= ReadBackAdrxDI;
104
 
105
  -- the read back value is reordered depending on wether the requested address
106
-- is a multiple of 8 or not. See comment above.
107
  ReadBackxDO <= (Ram0OutAxD, Ram1OutAxD, Ram0OutBxD, Ram1OutBxD) when LastReadBackAdrxDP(2) = '0' \
108
                 else (Ram1OutAxD, Ram0OutAxD, Ram1OutBxD, Ram0OutBxD);
109
 
110
  -- implement a write address counter
111
  wrCntPrcs : process (WExSI, WrPtrxDP)
112
  begin
113
    WrPtrxDN <= WrPtrxDP;
114
    Ram0WExS <= "0000";
115
    Ram1WExS <= "0000";
116
    if WExSI = '1' then
117
      WrPtrxDN <= std_logic_vector(unsigned(to_integer(unsigned(WrPtrxDP))+1, 12));
118
      -- decode lower 3 bits to the 8 write enable lines
119
      if WrPtrxDP(2) = '0' then
120
        -- write to ram 0
121
        Ram0WExS(to_integer(unsigned(WrPtrxDP(1 downto 0)))) <= '1';
122
      else
123
        Ram1WExS(to_integer(unsigned(WrPtrxDP(1 downto 0)))) <= '1';
124
      end if;
125
    end if;
126
  end process wrCntPrcs;
127
 
128
  NextWrAdrxDO <= WrPtrxDP;
129
 
130
  process (ClkxCI, RstxRI)
131
  begin  -- process
132
    if RstxRI = '1' then
133
      LastReadBackAdrxDP <= (others => '0');
134
      WrPtrxDP           <= (others => '0');
135
 
136
    elsif ClkxCI'event and ClkxCI = '1' then  -- rising clock edge
137
      LastReadBackAdrxDP <= LastReadBackAdrxDN;
138
      WrPtrxDP           <= WrPtrxDN;
139
    end if;
140
  end process;
141
 
142
  -- port A is used to write and read (lower bytes) data, port B is for read only
143
  HistMem0Inst : RAMB16BWER
144
    generic map (
145
      -- DATA_WIDTH_A/DATA_WIDTH_B: 0, 1, 2, 4, 9, 18, or 36
146
      DATA_WIDTH_A        => 36,
147
      DATA_WIDTH_B        => 36,
148
      -- DOA_REG/DOB_REG: Optional output register (0 or 1)
149
      DOA_REG             => 0,
150
      DOB_REG             => 0,
151
      -- EN_RSTRAM_A/EN_RSTRAM_B: Enable/disable RST
152
      EN_RSTRAM_A         => true,
153
      EN_RSTRAM_B         => true,
154
      -- INIT_A/INIT_B: Initial values on output port
155
      INIT_A              => X"000000000",
156
      INIT_B              => X"000000000",
157
      -- INIT_FILE: Optional file used to specify initial RAM contents
158
      INIT_FILE           => "NONE",
159
      -- RSTTYPE: "SYNC" or "ASYNC" 
160
      RSTTYPE             => "SYNC",
161
      -- RST_PRIORITY_A/RST_PRIORITY_B: "CE" or "SR" 
162
      RST_PRIORITY_A      => "CE",
163
      RST_PRIORITY_B      => "CE",
164
      -- SIM_COLLISION_CHECK: Collision check enable "ALL", "WARNING_ONLY", "GENERATE_X_ONLY" or "NONE" 
165
      SIM_COLLISION_CHECK => "ALL",
166
      -- SIM_DEVICE: Must be set to "SPARTAN6" for proper simulation behavior
167
      SIM_DEVICE          => "SPARTAN6",
168
      -- SRVAL_A/SRVAL_B: Set/Reset value for RAM output
169
      SRVAL_A             => X"000000000",
170
      SRVAL_B             => X"000000000",
171
      -- WRITE_MODE_A/WRITE_MODE_B: "WRITE_FIRST", "READ_FIRST", or "NO_CHANGE" 
172
      WRITE_MODE_A        => "WRITE_FIRST",
173
      WRITE_MODE_B        => "WRITE_FIRST"
174
      )
175
    port map (
176
      -- Port A Data: 32-bit (each) Port A data
177
      DOA    => Ram0OutAxD,             -- 32-bit A port data output
178
      DOPA   => open,                   -- 4-bit A port parity output
179
      -- Port B Data: 32-bit (each) Port B data
180
      DOB    => Ram0OutBxD,
181
      DOPB   => open,
182
      -- Port A Address/Control Signals: 14-bit (each) Port A address and control signals
183
      ADDRA  => Ram0AdrAxD,             -- 14-bit A port address input
184
      CLKA   => ClkxCI,                 -- 1-bit A port clock input
185
      ENA    => '1',                    -- 1-bit A port enable input
186
      REGCEA => '1',           -- 1-bit A port register clock enable input
187
      RSTA   => RstxRI,        -- 1-bit A port register set/reset input
188
      WEA    => Ram0WExS,      -- 4-bit Port A byte-wide write enable input
189
      -- Port A Data: 32-bit (each) Port A data
190
      DIA    => RamWrDataxD,            -- 32-bit A port data input
191
      DIPA   => "0000",                 -- 4-bit A port parity input
192
      -- Port B Address/Control Signals: 14-bit (each) Port B address and control signals
193
      ADDRB  => Ram0RdAdrBxD,           -- 14-bit B port address input
194
      CLKB   => ClkxCI,                 -- 1-bit B port clock input
195
      ENB    => '0',                    -- 1-bit B port enable input
196
      REGCEB => '0',           -- 1-bit B port register clock enable input
197
      RSTB   => RstxRI,        -- 1-bit B port register set/reset input
198
      WEB    => x"0",          -- 4-bit Port B byte-wide write enable input
199
      -- Port B Data: 32-bit (each) Port B data
200
      DIB    => x"00000000",            -- 32-bit B port data input
201
      DIPB   => x"0"                    -- 4-bit B port parity input
202
      );
203
 
204
 
205
  -- RAM 1
206
  -- port A is used to write and read (lower bytes) data, port B is for read only
207
  HistMem1Inst : RAMB16BWER
208
    generic map (
209
      -- DATA_WIDTH_A/DATA_WIDTH_B: 0, 1, 2, 4, 9, 18, or 36
210
      DATA_WIDTH_A        => 36,
211
      DATA_WIDTH_B        => 36,
212
      -- DOA_REG/DOB_REG: Optional output register (0 or 1)
213
      DOA_REG             => 0,
214
      DOB_REG             => 0,
215
      -- EN_RSTRAM_A/EN_RSTRAM_B: Enable/disable RST
216
      EN_RSTRAM_A         => true,
217
      EN_RSTRAM_B         => true,
218
      -- INIT_A/INIT_B: Initial values on output port
219
      INIT_A              => X"000000000",
220
      INIT_B              => X"000000000",
221
      -- INIT_FILE: Optional file used to specify initial RAM contents
222
      INIT_FILE           => "NONE",
223
      -- RSTTYPE: "SYNC" or "ASYNC" 
224
      RSTTYPE             => "SYNC",
225
      -- RST_PRIORITY_A/RST_PRIORITY_B: "CE" or "SR" 
226
      RST_PRIORITY_A      => "CE",
227
      RST_PRIORITY_B      => "CE",
228
      -- SIM_COLLISION_CHECK: Collision check enable "ALL", "WARNING_ONLY", "GENERATE_X_ONLY" or "NONE" 
229
      SIM_COLLISION_CHECK => "ALL",
230
      -- SIM_DEVICE: Must be set to "SPARTAN6" for proper simulation behavior
231
      SIM_DEVICE          => "SPARTAN6",
232
      -- SRVAL_A/SRVAL_B: Set/Reset value for RAM output
233
      SRVAL_A             => X"000000000",
234
      SRVAL_B             => X"000000000",
235
      -- WRITE_MODE_A/WRITE_MODE_B: "WRITE_FIRST", "READ_FIRST", or "NO_CHANGE" 
236
      WRITE_MODE_A        => "WRITE_FIRST",
237
      WRITE_MODE_B        => "WRITE_FIRST"
238
      )
239
    port map (
240
      -- Port A Data: 32-bit (each) Port A data
241
      DOA    => Ram1OutAxD,             -- 32-bit A port data output
242
      DOPA   => open,                   -- 4-bit A port parity output
243
      -- Port B Data: 32-bit (each) Port B data
244
      DOB    => Ram1OutBxD,
245
      DOPB   => open,
246
      -- Port A Address/Control Signals: 14-bit (each) Port A address and control signals
247
      ADDRA  => Ram1AdrAxD,    -- port A is used to write and read (lower bytes) data, port B is for read only
248
  HistMem0Inst : RAMB16BWER
249
    generic map (
250
      -- DATA_WIDTH_A/DATA_WIDTH_B: 0, 1, 2, 4, 9, 18, or 36
251
      DATA_WIDTH_A        => 36,
252
      DATA_WIDTH_B        => 36,
253
      -- DOA_REG/DOB_REG: Optional output register (0 or 1)
254
      DOA_REG             => 0,
255
      DOB_REG             => 0,
256
      -- EN_RSTRAM_A/EN_RSTRAM_B: Enable/disable RST
257
      EN_RSTRAM_A         => true,
258
      EN_RSTRAM_B         => true,
259
      -- INIT_A/INIT_B: Initial values on output port
260
      INIT_A              => X"000000000",
261
      INIT_B              => X"000000000",
262
      -- INIT_FILE: Optional file used to specify initial RAM contents
263
      INIT_FILE           => "NONE",
264
      -- RSTTYPE: "SYNC" or "ASYNC" 
265
      RSTTYPE             => "SYNC",
266
      -- RST_PRIORITY_A/RST_PRIORITY_B: "CE" or "SR" 
267
      RST_PRIORITY_A      => "CE",
268
      RST_PRIORITY_B      => "CE",
269
      -- SIM_COLLISION_CHECK: Collision check enable "ALL", "WARNING_ONLY", "GENERATE_X_ONLY" or "NONE" 
270
      SIM_COLLISION_CHECK => "ALL",
271
      -- SIM_DEVICE: Must be set to "SPARTAN6" for proper simulation behavior
272
      SIM_DEVICE          => "SPARTAN6",
273
      -- SRVAL_A/SRVAL_B: Set/Reset value for RAM output
274
      SRVAL_A             => X"000000000",
275
      SRVAL_B             => X"000000000",
276
      -- WRITE_MODE_A/WRITE_MODE_B: "WRITE_FIRST", "READ_FIRST", or "NO_CHANGE" 
277
      WRITE_MODE_A        => "WRITE_FIRST",
278
      WRITE_MODE_B        => "WRITE_FIRST"
279
      )
280
    port map (
281
      -- Port A Data: 32-bit (each) Port A data
282
      DOA    => Ram0OutAxD,             -- 32-bit A port data output
283
      DOPA   => open,                   -- 4-bit A port parity output
284
      -- Port B Data: 32-bit (each) Port B data
285
      DOB    => Ram0OutBxD,
286
      DOPB   => open,
287
      -- Port A Address/Control Signals: 14-bit (each) Port A address and control signals
288
      ADDRA  => Ram0AdrAxD,             -- 14-bit A port address input
289
      CLKA   => ClkxCI,                 -- 1-bit A port clock input
290
      ENA    => ,                       -- 1-bit A port enable input
291
      REGCEA => '1',          -- 1-bit A port register clock enable input
292
      RSTA   => RstxRI,       -- 1-bit A port register set/reset input
293
      WEA    => "1111",       -- 4-bit Port A byte-wide write enable input
294
      -- Port A Data: 32-bit (each) Port A data
295
      DIA    => RamWrDataxD,            -- 32-bit A port data input
296
      DIPA   => "0000",                 -- 4-bit A port parity input
297
      -- Port B Address/Control Signals: 14-bit (each) Port B address and control signals
298
      ADDRB  => Ram0RdAdrBxD,                       -- 14-bit B port address input
299
      CLKB   => ClkxCI,                 -- 1-bit B port clock input
300
      ENB    => '0',                    -- 1-bit B port enable input
301
      REGCEB => '0',          -- 1-bit B port register clock enable input
302
      RSTB   => RstxRI,       -- 1-bit B port register set/reset input
303
      WEB    => x"0",         -- 4-bit Port B byte-wide write enable input
304
      -- Port B Data: 32-bit (each) Port B data
305
      DIB    => x"00000000",            -- 32-bit B port data input
306
      DIPB   => x"0"                    -- 4-bit B port parity input
307
      );         -- 14-bit A port address input
308
      CLKA   => ClkxCI,                 -- 1-bit A port clock input
309
      ENA    => '1',                    -- 1-bit A port enable input
310
      REGCEA => '1',           -- 1-bit A port register clock enable input
311
      RSTA   => RstxRI,        -- 1-bit A port register set/reset input
312
      WEA    => Ram1WExS,      -- 4-bit Port A byte-wide write enable input
313
      -- Port A Data: 32-bit (each) Port A data
314
      DIA    => RamWrDataxD,            -- 32-bit A port data input
315
      DIPA   => "0000",                 -- 4-bit A port parity input
316
      -- Port B Address/Control Signals: 14-bit (each) Port B address and control signals
317
      ADDRB  => Ram1RdAdrBxD,           -- 14-bit B port address input
318
      CLKB   => ClkxCI,                 -- 1-bit B port clock input
319
      ENB    => '0',                    -- 1-bit B port enable input
320
      REGCEB => '0',           -- 1-bit B port register clock enable input
321
      RSTB   => RstxRI,        -- 1-bit B port register set/reset input
322
      WEB    => x"0",          -- 4-bit Port B byte-wide write enable input
323
      -- Port B Data: 32-bit (each) Port B data
324
      DIB    => x"00000000",            -- 32-bit B port data input
325
      DIPB   => x"0"                    -- 4-bit B port parity input
326
      );
327
 
328
end Behavioral;
329
 
330
 
331
 

powered by: WebSVN 2.1.0

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