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

Subversion Repositories xmatchpro

[/] [xmatchpro/] [trunk/] [xmw4-comdec/] [xmatch_sim7/] [src/] [ob_assem.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       = OB_ASSEM    --
19
--  version      = 1.0         --
20
--  last update  = 19/05/98    --
21
--  author       = Jose Nunez  --
22
---------------------------------
23
 
24
 
25
-- FUNCTION
26
-- Assembles output tuples according to the 4 bit MATCH_TYPE
27
-- If bit N of MATCH_TYPE is LOW then byte A of CAM_DATA is
28
-- valid and should be output to byte A of DOUT, otherwise
29
-- byte A of LITERAL_DATA should be output to DOUT.
30
-- This is effectively 4 X (8 X 2-to-1 MUX).
31
 
32
 
33
-- PIN LIST
34
-- CAM_DATA     =  32 bit data from the CAM array
35
-- LITERAL_DATA =  32 bits of literal data
36
-- MATCH_TYPE   =  4 bit bus to indicate which BYTES of
37
--                  CAM_DATA are valid
38
-- DOUT         =  output of 32 bits of valid data
39
 
40
 
41
library ieee,dzx;
42
use ieee.std_logic_1164.all;
43
use dzx.attributes.all;
44
 
45
entity OB_ASSEM is
46
port
47
(
48
      RAM_DATA : in std_logic_vector(31 downto 0) ;
49
          RAM_MASK : in std_logic_vector(3 downto 0);
50
      LITERAL_DATA : in bit_vector(31 downto 0);
51
          LITERAL_MASK : in bit_vector(4 downto 0);
52
      MATCH_TYPE : in bit_vector(3 downto 0) ;
53
          MOUT : out bit_vector(3 downto 0);
54
      DOUT : out bit_vector(31 downto 0)
55
);
56
 
57
 
58
 
59
 
60
end OB_ASSEM;
61
 
62
 
63
architecture ASSEMBLE of OB_ASSEM is
64
 
65
signal CAM_DATA : bit_vector(31 downto 0);
66
signal MISS_DATA : bit_vector(31 downto 0);
67
 
68
begin
69
 
70
CAM_DATA <= To_bitvector(RAM_DATA);
71
 
72
MISS_ASSEMBLE : process(LITERAL_MASK, LITERAL_DATA)
73
begin
74
 
75
case LITERAL_MASK is
76
 
77
 when "10000" => MISS_DATA <= x"20000000";
78
 when "11000" => MISS_DATA <= LITERAL_DATA(31 downto 24) & x"200000";
79
 when "11100" => MISS_DATA <= LITERAL_DATA(31 downto 24) & LITERAL_DATA(23 downto 16) & x"2000";
80
 when "11110" => MISS_DATA <= LITERAL_DATA(31 downto 24) & LITERAL_DATA(23 downto 16) & LITERAL_DATA(15 downto 8) & x"20";
81
 when "11111" => MISS_DATA <= LITERAL_DATA(31 downto 24) & LITERAL_DATA(23 downto 16) & LITERAL_DATA(15 downto 8) & LITERAL_DATA(7 downto 0);
82
 when others => MISS_DATA <= x"00000000";
83
 
84
end case;
85
 
86
end process MISS_ASSEMBLE;
87
 
88
 
89
DECIDE : process (CAM_DATA , RAM_MASK, LITERAL_DATA , MATCH_TYPE, MISS_DATA, LITERAL_MASK)
90
 
91
begin
92
 
93
case MATCH_TYPE is
94
        when "0000" =>  DOUT(31 downto 24) <= CAM_DATA(31 downto 24);
95
                        DOUT(23 downto 16) <= CAM_DATA(23 downto 16);
96
                        DOUT(15 downto 8)  <= CAM_DATA(15 downto 8);
97
                        DOUT(7 downto 0)   <= CAM_DATA(7 downto 0);
98
                        MOUT <= To_bitvector(RAM_MASK);
99
 
100
        when "0001" =>  DOUT(31 downto 24) <= CAM_DATA(31 downto 24);
101
                        DOUT(23 downto 16) <= CAM_DATA(23 downto 16);
102
                        DOUT(15 downto 8)  <= CAM_DATA(15 downto 8);
103
                        DOUT(7 downto 0)   <= LITERAL_DATA(31 downto 24);
104
                        MOUT <= "1111";
105
 
106
        when "0010" =>  DOUT(31 downto 24) <= CAM_DATA(31 downto 24);
107
                        DOUT(23 downto 16) <= CAM_DATA(23 downto 16);
108
                        DOUT(15 downto 8)  <= LITERAL_DATA(31 downto 24);
109
                        DOUT(7 downto 0)   <= CAM_DATA(7 downto 0);
110
                        MOUT <= "1111";
111
 
112
        when "0011" =>  DOUT(31 downto 24) <= CAM_DATA(31 downto 24);
113
                        DOUT(23 downto 16) <= CAM_DATA(23 downto 16);
114
                        DOUT(15 downto 8)  <= LITERAL_DATA(31 downto 24);
115
                        DOUT(7 downto 0)   <= LITERAL_DATA(23 downto 16);
116
                        MOUT <= "1111";
117
 
118
        when "0100" =>  DOUT(31 downto 24) <= CAM_DATA(31 downto 24);
119
                        DOUT(23 downto 16) <= LITERAL_DATA(31 downto 24);
120
                        DOUT(15 downto 8)  <= CAM_DATA(15 downto 8);
121
                        DOUT(7 downto 0)   <= CAM_DATA(7 downto 0);
122
                        MOUT <= "1111";
123
 
124
        when "0110" =>  DOUT(31 downto 24) <= CAM_DATA(31 downto 24);
125
                        DOUT(23 downto 16) <= LITERAL_DATA(31 downto 24);
126
                        DOUT(15 downto 8)  <= LITERAL_DATA(23 downto 16);
127
                        DOUT(7 downto 0)   <= CAM_DATA(7 downto 0);
128
                        MOUT <= "1111";
129
 
130
        when "1000" =>  DOUT(31 downto 24) <= LITERAL_DATA(31 downto 24);
131
                        DOUT(23 downto 16) <= CAM_DATA(23 downto 16);
132
                        DOUT(15 downto 8)  <= CAM_DATA(15 downto 8);
133
                        DOUT(7 downto 0)   <= CAM_DATA(7 downto 0);
134
                        MOUT <= "1111";
135
 
136
        when "1001" =>  DOUT(31 downto 24) <= LITERAL_DATA(31 downto 24);
137
                        DOUT(23 downto 16) <= CAM_DATA(23 downto 16);
138
                        DOUT(15 downto 8)  <= CAM_DATA(15 downto 8);
139
                        DOUT(7 downto 0)   <= LITERAL_DATA(23 downto 16);
140
                        MOUT <= "1111";
141
 
142
        when "1100" =>  DOUT(31 downto 24) <= LITERAL_DATA(31 downto 24);
143
                        DOUT(23 downto 16) <= LITERAL_DATA(23 downto 16);
144
                        DOUT(15 downto 8)  <= CAM_DATA(15 downto 8);
145
                        DOUT(7 downto 0)   <= CAM_DATA(7 downto 0);
146
                        MOUT <= "1111";
147
 
148
        when "1111" =>  DOUT(31 downto 24) <= MISS_DATA(31 downto 24);
149
                        DOUT(23 downto 16) <= MISS_DATA(23 downto 16);
150
                        DOUT(15 downto 8)  <= MISS_DATA(15 downto 8);
151
                        DOUT(7 downto 0)   <= MISS_DATA(7 downto 0);
152
                MOUT <= LITERAL_MASK(4 downto 1);
153
 
154
        when others => DOUT(31 downto 24) <= "00000000";
155
                        DOUT(23 downto 16) <= "00000000";
156
                        DOUT(15 downto 8)  <= "00000000";
157
                        DOUT(7 downto 0)   <= "00000000";
158
                MOUT <= "0000";
159
 
160
end case;
161
 
162
 
163
end process DECIDE;
164
 
165
end ASSEMBLE;
166
 
167
 

powered by: WebSVN 2.1.0

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