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

Subversion Repositories xmatchpro

[/] [xmatchpro/] [trunk/] [xmw4-comdec/] [xmatch_sim7/] [src/] [lc_assembler.vhd] - Blame information for rev 9

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 9 eejlny
--This library is free software; you can redistribute it and/or
2
--modify it under the terms of the GNU Lesser General Public
3
--License as published by the Free Software Foundation; either
4
--version 2.1 of the License, or (at your option) any later version.
5
 
6
--This library is distributed in the hope that it will be useful,
7
--but WITHOUT ANY WARRANTY; without even the implied warranty of
8
--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
9
--Lesser General Public License for more details.
10
 
11
--You should have received a copy of the GNU Lesser General Public
12
--License along with this library; if not, write to the Free Software
13
--Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
14
 
15
-- e_mail : j.l.nunez-yanez@byacom.co.uk
16
 
17
----------------------------------
18
--  ENTITY       = LC_ASSEMBLER --
19
--  version      = 1.0          --
20
--  last update  = 16/06/99     --
21
--  author       = Jose Nunez   --
22
----------------------------------
23
 
24
 
25
-- FUNCTION
26
-- assembles literal characters into a left aligned format.
27
-- input match type determines which bytes are valid.
28
 
29
 
30
-- PIN LIST
31
-- MASK         = valid bytes
32
-- MATCH_TYPE   = input match type (active low), i.e a low indicates that the corresponding
33
--                byte in LITERAL_DATA is valid.
34
-- LITERAL_DATA = input literal data characters
35
-- CODE         = output bytes assembled in left justified format adding miss type if needed
36
-- LENGTH       = length of output code in bits
37
 
38
library ieee,dzx;
39
use ieee.std_logic_1164.all;
40
 
41
 
42
entity LC_ASSEMBLER is
43
port
44
(
45
    MASK : in bit_vector(4 downto 0);
46
        MATCH_TYPE : in bit_vector(3 downto 0);
47
    LITERAL_DATA : in bit_vector(31 downto 0);
48
        CODE : out bit_vector(33 downto 0);
49
        MISS : out bit;
50
        LENGTH : out bit_vector(5 downto 0)
51
);
52
 
53
 
54
end LC_ASSEMBLER;
55
 
56
architecture FIRST of LC_ASSEMBLER is
57
 
58
signal MISS_TYPE_CODE : bit_vector(33 downto 0);
59
signal MISS_TYPE_LENGTH : bit_vector(5 downto 0);
60
signal CODE_AUX : bit_vector(33 downto 0);
61
signal LENGTH_AUX : bit_vector(5 downto 0);
62
signal MISS_AUX : bit;
63
 
64
 
65
component MISS_TYPE_CODER
66
port
67
(
68
        MASK : in bit_vector(4 downto 0);
69
        LITERAL_DATA :in bit_vector(31 downto 0);
70
        CODE : out bit_vector(33 downto 0);
71
        LENGTH : out bit_vector(5 downto 0)
72
);
73
end component;
74
 
75
begin
76
 
77
MSS_CODER : MISS_TYPE_CODER
78
port map
79
(
80
        MASK => MASK,
81
        LITERAL_DATA => LITERAL_DATA,
82
        CODE => MISS_TYPE_CODE,
83
        LENGTH => MISS_TYPE_LENGTH
84
);
85
 
86
 
87
ASSEMBLE : process(MATCH_TYPE, LITERAL_DATA, MISS_TYPE_CODE, MISS_TYPE_LENGTH)
88
variable BYTE3 : bit_vector(7 downto 0);
89
variable BYTE2 : bit_vector(7 downto 0);
90
variable BYTE1 : bit_vector(7 downto 0);
91
variable BYTE0 : bit_vector(7 downto 0);
92
 
93
 
94
begin
95
 
96
BYTE3 := LITERAL_DATA(31 downto 24);
97
BYTE2 := LITERAL_DATA(23 downto 16);
98
BYTE1 := LITERAL_DATA(15 downto 8);
99
BYTE0 := LITERAL_DATA(7 downto 0);
100
 
101
case MATCH_TYPE is
102
 
103
    when "1111" => CODE_AUX <= MISS_TYPE_CODE;LENGTH_AUX <= MISS_TYPE_LENGTH;MISS_AUX <= '1';
104
    when "1110" => CODE_AUX <= MISS_TYPE_CODE;LENGTH_AUX <= MISS_TYPE_LENGTH;MISS_AUX <= '1';
105
    when "1101" => CODE_AUX <= MISS_TYPE_CODE;LENGTH_AUX <= MISS_TYPE_LENGTH;MISS_AUX <= '1';
106
    when "1100" => CODE_AUX <= BYTE3 & BYTE2 & "000000000000000000"; LENGTH_AUX <= "010000";MISS_AUX <= '0';
107
    when "1011" => CODE_AUX <= MISS_TYPE_CODE;LENGTH_AUX <= MISS_TYPE_LENGTH;MISS_AUX <= '1';
108
    when "1010" => CODE_AUX <= MISS_TYPE_CODE;LENGTH_AUX <= MISS_TYPE_LENGTH;MISS_AUX <= '1';
109
    when "1001" => CODE_AUX <= BYTE3 & BYTE0 & "000000000000000000"; LENGTH_AUX <= "010000";MISS_AUX <= '0';
110
    when "1000" => CODE_AUX <= BYTE3 & "00000000000000000000000000"; LENGTH_AUX <= "001000";MISS_AUX <= '0';
111
    when "0111" => CODE_AUX <= MISS_TYPE_CODE;LENGTH_AUX <= MISS_TYPE_LENGTH;MISS_AUX <= '1';
112
    when "0110" => CODE_AUX <= BYTE2 & BYTE1 & "000000000000000000"; LENGTH_AUX <= "010000";MISS_AUX <= '0';
113
    when "0101" => CODE_AUX <= MISS_TYPE_CODE;LENGTH_AUX <= MISS_TYPE_LENGTH;MISS_AUX <= '1';
114
    when "0100" => CODE_AUX <= BYTE2 & "00000000000000000000000000"; LENGTH_AUX <= "001000";MISS_AUX <= '0';
115
    when "0011" => CODE_AUX <= BYTE1 & BYTE0 & "000000000000000000"; LENGTH_AUX <= "010000";MISS_AUX <= '0';
116
    when "0010" => CODE_AUX <= BYTE1 & "00000000000000000000000000"; LENGTH_AUX <= "001000";MISS_AUX <= '0';
117
    when "0001" => CODE_AUX <= BYTE0 & "00000000000000000000000000"; LENGTH_AUX <= "001000";MISS_AUX <= '0';
118
    when "0000" => CODE_AUX <= "0000000000000000000000000000000000"; LENGTH_AUX <= "000000";MISS_AUX <= '0';
119
end case;
120
end process ASSEMBLE;
121
 
122
 
123
DECIDE : process ( CODE_AUX, LENGTH_AUX, MASK, MATCH_TYPE, MISS_AUX, MISS_TYPE_CODE, MISS_TYPE_LENGTH)
124
begin
125
 
126
if (MASK(1) = '1') then -- full word
127
        CODE <= CODE_AUX;
128
        LENGTH <= LENGTH_AUX;
129
        MISS <= MISS_AUX;
130
elsif (MATCH_TYPE = "0000") then -- partial word but full match
131
        CODE <= CODE_AUX;
132
        LENGTH <= LENGTH_AUX;
133
        MISS <= MISS_AUX;
134
else -- partial word and partial match
135
        CODE <= MISS_TYPE_CODE;
136
        LENGTH <= MISS_TYPE_LENGTH;
137
        MISS <= '1';
138
end if;
139
 
140
end process DECIDE;
141
 
142
end FIRST; -- end of architecture
143
 
144
 

powered by: WebSVN 2.1.0

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