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

Subversion Repositories lzrw1-compressor-core

[/] [lzrw1-compressor-core/] [trunk/] [hw/] [HDL/] [outputEncoder.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 habicht
--/**************************************************************************************************************
2
--*
3
--*    L Z R W 1   E N C O D E R   C O R E
4
--*
5
--*  A high throughput loss less data compression core.
6
--* 
7
--* Copyright 2012-2013   Lukas Schrittwieser (LS)
8
--*
9
--*    This program is free software: you can redistribute it and/or modify
10
--*    it under the terms of the GNU General Public License as published by
11
--*    the Free Software Foundation, either version 2 of the License, or
12
--*    (at your option) any later version.
13
--*
14
--*    This program is distributed in the hope that it will be useful,
15
--*    but WITHOUT ANY WARRANTY; without even the implied warranty of
16
--*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
--*    GNU General Public License for more details.
18
--*
19
--*    You should have received a copy of the GNU General Public License
20
--*    along with this program; if not, write to the Free Software
21
--*    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
22
--*    Or see <http://www.gnu.org/licenses/>
23
--*
24
--***************************************************************************************************************
25
--*
26
--* Change Log:
27
--*
28
--* Version 1.0 - 2012/6/30 - LS
29
--*   started file
30
--*
31
--* Version 1.0 - 2013/04/05 - LS
32
--*   release
33
--*
34
--***************************************************************************************************************
35
--*
36
--* Naming convention:  http://dz.ee.ethz.ch/en/information/hdl-help/vhdl-naming-conventions.html
37
--*
38
--***************************************************************************************************************
39
--*
40
--* Encodes the length/distance pair or the literal to the output data stream
41
--*
42
--***************************************************************************************************************
43
 
44
library IEEE;
45
use IEEE.STD_LOGIC_1164.all;
46
use IEEE.NUMERIC_STD.all;
47
 
48
library UNISIM;
49
use UNISIM.VComponents.all;
50
 
51
entity outputEncoder is
52
 
53
  generic (
54
    frameSize   : integer := 8;         -- number of data items per frame
55
    minMatchLen : integer := 3;  -- minimal match length that will be encoded as length/offset pair
56
    maxMatchLen : integer := 16);  -- max allowed value for length (must not be bigger than 16)
57
 
58
  port (
59
    ClkxCI          : in  std_logic;
60
    RstxRI          : in  std_logic;    -- Active high sync reset
61
    OffsetxDI       : in  std_logic_vector(11 downto 0);  -- stream history offset for matches
62
    MatchLengthxDI  : in  integer range 0 to maxMatchLen;  -- stream match length in bytes
63
    EnxSI           : in  std_logic;    -- Process input data if high
64
    EndOfDataxSI    : in  std_logic;  -- flushes internal buffers and creates an end-of-data symbol
65
    LiteralxDI      : in  std_logic_vector(7 downto 0);  -- literal byte from the data stream to be encoded (needed if there was no match)
66
    BodyStrobexSO   : out std_logic;  -- strobe signal: is assert when a new item is available
67
    BodyOutxDO      : out std_logic_vector(7 downto 0);  -- encoded data output
68
    HeaderStrobexSO : out std_logic;
69
    HeaderOutxDO    : out std_logic_vector(frameSize-1 downto 0);
70
    DonexSO         : out std_logic);  -- indicates that the end of data symbol has been created
71
 
72
end outputEncoder;
73
 
74
architecture Behavorial of outputEncoder is
75
 
76
 
77
  signal suppressCntxDN, suppressCntxDP   : integer range 0 to maxMatchLen := 0;  -- data output supression for bytes that have already been encoded
78
  signal FlagBytexDN, FlagBytexDP         : std_logic_vector(frameSize-1 downto 0);  -- stores the literal / pair flags for 8 output bytes
79
  signal FlagCntxDN, FlagCntxDP           : integer range 0 to frameSize   := 0;  -- number of bytes in the output buffer
80
  signal HeaderStrobexSN, HeaderStrobexSP : std_logic                      := '0';
81
  signal DonexSN, DonexSP                 : std_logic                      := '0';
82
 
83
  signal suppressBytexS : std_logic := '0';
84
  signal EncodeAsPairxS : std_logic := '0';  -- signals that this match will be encoded as offset/length pair
85
  signal PairxD         : std_logic_vector(15 downto 0);  -- offset/length pair represented in two bytes
86
 
87
-- type outputBufferType is array (frameSize downto 0) of std_logic_vector(7 downto 0);  -- one more byte to store the overflow byte if we have a pair
88
--  signal OutBufxDN, OutBufxDP           : outputBufferType := (others => (others => '0'));  -- buffer to assemble compressed data blocks
89
  signal OutBufInxD                     : std_logic_vector(7 downto 0);  -- input byte for output buffer
90
  signal ShiftOutBufxS                  : std_logic;
91
  signal OverflowBufxDN, OverflowBufxDP : std_logic_vector(7 downto 0);
92
  signal OvfValidxSN, OvfValidxSP       : std_logic;
93
  --signal FlushxSN, FlushxSP             : std_logic;  -- indicates that buffers should be flushed (end of data processing)
94
  signal EndOfDataxSN, EndOfDataxSP     : std_logic := '0';  -- set when an end of data condition is detected
95
 
96
 
97
begin  -- Behavorial
98
 
99
 
100
  -- every match that is long enough will be encoded as offset/length pair
101
  EncodeAsPairxS <= '1' when MatchLengthxDI >= minMatchLen or EndOfDataxSI = '1' else '0';
102
 
103
  process (EndOfDataxSI, MatchLengthxDI, OffsetxDI)
104
  begin  -- process
105
    PairxD <= std_logic_vector(to_unsigned(MatchLengthxDI-1, 4)) & OffsetxDI;
106
  end process;
107
 
108
  -- purpose: implements an output data suppress counter for bytes which have already been encoded in a previous match
109
  suppressCntPrcs : process (EncodeAsPairxS, EnxSI, MatchLengthxDI,
110
                             suppressCntxDP)
111
  begin  -- process suppressCntPrcs
112
    suppressCntxDN <= suppressCntxDP;   -- default: do nothing
113
    suppressBytexS <= '0';
114
    if EnxSI = '1' then
115
      if suppressCntxDP > 0 then
116
        -- this byte has already been encoded -> suppress it
117
        suppressBytexS <= '1';
118
        suppressCntxDN <= suppressCntxDP - 1;
119
      else
120
        -- check if have to reload the counter
121
        if EncodeAsPairxS = '1' then
122
          suppressCntxDN <= MatchLengthxDI - 1;  -- -1 because this one byte is processed now, we suppress (discard) the next length-1 bytes
123
        end if;
124
      end if;
125
    end if;
126
  end process suppressCntPrcs;
127
 
128
  bufCntPrcs : process (DonexSP, EncodeAsPairxS, EndOfDataxSI, EndOfDataxSP,
129
                        EnxSI, FlagBytexDP, FlagCntxDP, LiteralxDI,
130
                        OverflowBufxDP, OvfValidxSP, PairxD, suppressBytexS)
131
  begin  -- process bufCntPrcs
132
    OutBufInxD      <= (others => '-');  -- use - to improve optimization
133
    OverflowBufxDN  <= OverflowBufxDP;
134
    FlagBytexDN     <= FlagBytexDP;
135
    OvfValidxSN     <= '0';
136
    ShiftOutBufxS   <= '0';
137
    FlagCntxDN      <= FlagCntxDP;
138
    HeaderStrobexSN <= '0';
139
    DonexSN         <= DonexSP;
140
    EndOfDataxSN    <= EndOfDataxSP or EndOfDataxSI;  -- remember an end-of-data condition
141
    if EnxSI = '1' and suppressBytexS = '0' and EndOfDataxSP = '0' then
142
      ShiftOutBufxS <= '1';
143
      if EncodeAsPairxS = '1' then
144
        -- we encode data as a pair, this means we have two bytes
145
        OverflowBufxDN          <= PairxD(7 downto 0);  -- save second byte in overflow buffer
146
        OutBufInxD              <= PairxD(15 downto 8);  -- big endian encoding
147
        FlagBytexDN(FlagCntxDP) <= '1';  -- mark bytes as offset/length pair
148
        OvfValidxSN             <= '1';  -- mark that we have a byte in the overflow buffer
149
        -- note: we don't check for end of frame here as the frame isn't over
150
        -- now (there is a second byte in the overflow buffer)
151
      else
152
        -- encode data as literal
153
        OutBufInxD              <= LiteralxDI;
154
        FlagBytexDN(FlagCntxDP) <= '0';
155
        -- check for end of frame
156
        if FlagCntxDP = frameSize-1 then
157
          FlagCntxDN      <= 0;
158
          HeaderStrobexSN <= '1';
159
        else
160
          FlagCntxDN <= FlagCntxDP + 1;
161
        end if;
162
      end if;
163
    end if;
164
 
165
    if OvfValidxSP = '1' then  -- this is ok, as we can not have two pairs on consecutive clock cycles (one pair encodes >= 3 bytes)
166
      -- copy byte from overflow buffer into output shift register
167
      OutBufInxD    <= OverflowBufxDP;
168
      ShiftOutBufxS <= '1';
169
      -- check for the end of a frame
170
      if FlagCntxDP = frameSize-1 then
171
        FlagCntxDN      <= 0;
172
        HeaderStrobexSN <= '1';
173
      else
174
        FlagCntxDN <= FlagCntxDP + 1;
175
      end if;
176
      if EndOfDataxSP = '1' then
177
        -- this is the very last byte in the stream
178
        HeaderStrobexSN <= '1';         -- send the last header byte(s)
179
        EndOfDataxSN    <= '0';  -- transmission of end of data flag is done
180
        DonexSN         <= '1';
181
      end if;
182
    end if;
183
 
184
    if EndOfDataxSP = '1' and OvfValidxSP = '0' and EnxSI = '0' then
185
      -- an end of data was requested, insert the eof symbol (length/offset pair with a length of zero)
186
      OverflowBufxDN          <= x"00";
187
      OvfValidxSN             <= '1';
188
      FlagBytexDN(FlagCntxDP) <= '1';
189
      OutBufInxD              <= x"00";
190
      ShiftOutBufxS           <= '1';
191
 
192
    end if;
193
 
194
  end process bufCntPrcs;
195
 
196
  BodyOutxDO      <= OutBufInxD;
197
  BodyStrobexSO   <= ShiftOutBufxS;
198
  HeaderOutxDO    <= FlagBytexDP;
199
  HeaderStrobexSO <= HeaderStrobexSP;
200
  DonexSO         <= DonexSP;
201
 
202
  -- purpose: implements the flip flops
203
  -- type   : sequential
204
  regs : process (ClkxCI)
205
  begin  -- process regs
206
    if ClkxCI'event and ClkxCI = '1' then  -- rising clock edge
207
      if RstxRI = '1' then
208
        suppressCntxDP  <= 0;
209
        FlagCntxDP      <= 0;
210
        OvfValidxSP     <= '0';
211
        OverflowBufxDP  <= (others => '0');
212
        EndOfDataxSP    <= '0';
213
        FlagBytexDP     <= (others => '0');
214
        HeaderStrobexSP <= '0';
215
        DonexSP         <= '0';
216
      else
217
        suppressCntxDP  <= suppressCntxDN;
218
        FlagCntxDP      <= FlagCntxDN;
219
        OvfValidxSP     <= OvfValidxSN;
220
        OverflowBufxDP  <= OverflowBufxDN;
221
        EndOfDataxSP    <= EndOfDataxSN;
222
        FlagBytexDP     <= FlagBytexDN;
223
        HeaderStrobexSP <= HeaderStrobexSN;
224
        DonexSP         <= DonexSN;
225
      end if;
226
    end if;
227
  end process regs;
228
 
229
 
230
end Behavorial;
231
 

powered by: WebSVN 2.1.0

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