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

Subversion Repositories cpu_lecture

[/] [cpu_lecture/] [trunk/] [html/] [23_Listing_of_register_file.vhd.html] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jsauermann
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2
"http://www.w3.org/TR/html4/strict.dtd">
3
<HTML>
4
<HEAD>
5
<TITLE>html/Listing_of_register_file.vhd</TITLE>
6
<META NAME="generator" CONTENT="HTML::TextToHTML v2.46">
7
<LINK REL="stylesheet" TYPE="text/css" HREF="lecture.css">
8
</HEAD>
9
<BODY>
10
<P><table class="ttop"><th class="tpre"><a href="22_Listing_of_reg_16.vhd.html">Previous Lesson</a></th><th class="ttop"><a href="toc.html">Table of Content</a></th><th class="tnxt"><a href="24_Listing_of_segment7.vhd.html">Next Lesson</a></th></table>
11
<hr>
12
 
13
<H1><A NAME="section_1">23 LISTING OF register_file.vhd</A></H1>
14
 
15
<pre class="vhdl">
16
 
17
  1     -------------------------------------------------------------------------------
18
  2     --
19
  3     -- Copyright (C) 2009, 2010 Dr. Juergen Sauermann
20
  4     --
21
  5     --  This code is free software: you can redistribute it and/or modify
22
  6     --  it under the terms of the GNU General Public License as published by
23
  7     --  the Free Software Foundation, either version 3 of the License, or
24
  8     --  (at your option) any later version.
25
  9     --
26
 10     --  This code is distributed in the hope that it will be useful,
27
 11     --  but WITHOUT ANY WARRANTY; without even the implied warranty of
28
 12     --  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
29
 13     --  GNU General Public License for more details.
30
 14     --
31
 15     --  You should have received a copy of the GNU General Public License
32
 16     --  along with this code (see the file named COPYING).
33
 17     --  If not, see http://www.gnu.org/licenses/.
34
 18     --
35
 19     -------------------------------------------------------------------------------
36
 20     -------------------------------------------------------------------------------
37
 21     --
38
 22     -- Module Name:    RegisterFile - Behavioral
39
 23     -- Create Date:    12:43:34 10/28/2009
40
 24     -- Description:    a register file (16 register pairs) of a CPU.
41
 25     --
42
 26     -------------------------------------------------------------------------------
43
 27     --
44
 28     library IEEE;
45
 29     use IEEE.STD_LOGIC_1164.ALL;
46
 30     use IEEE.STD_LOGIC_ARITH.ALL;
47
 31     use IEEE.STD_LOGIC_UNSIGNED.ALL;
48
 32
49
 33     use work.common.ALL;
50
 34
51
 35     entity register_file is
52
 36         port (  I_CLK       : in  std_logic;
53
 37
54
 38                 I_AMOD      : in  std_logic_vector( 5 downto 0);
55
 39                 I_COND      : in  std_logic_vector( 3 downto 0);
56
 40                 I_DDDDD     : in  std_logic_vector( 4 downto 0);
57
 41                 I_DIN       : in  std_logic_vector(15 downto 0);
58
 42                 I_FLAGS     : in  std_logic_vector( 7 downto 0);
59
 43                 I_IMM       : in  std_logic_vector(15 downto 0);
60
 44                 I_RRRR      : in  std_logic_vector( 4 downto 1);
61
 45                 I_WE_01     : in  std_logic;
62
 46                 I_WE_D      : in  std_logic_vector( 1 downto 0);
63
 47                 I_WE_F      : in  std_logic;
64
 48                 I_WE_M      : in  std_logic;
65
 49                 I_WE_XYZS   : in  std_logic;
66
 50
67
 51                 Q_ADR       : out std_logic_vector(15 downto 0);
68
 52                 Q_CC        : out std_logic;
69
 53                 Q_D         : out std_logic_vector(15 downto 0);
70
 54                 Q_FLAGS     : out std_logic_vector( 7 downto 0);
71
 55                 Q_R         : out std_logic_vector(15 downto 0);
72
 56                 Q_S         : out std_logic_vector( 7 downto 0);
73
 57                 Q_Z         : out std_logic_vector(15 downto 0));
74
 58     end register_file;
75
 59
76
 60     architecture Behavioral of register_file is
77
 61
78
 62     component reg_16
79
 63         port (  I_CLK       : in    std_logic;
80
 64
81
 65                 I_D         : in    std_logic_vector(15 downto 0);
82
 66                 I_WE        : in    std_logic_vector( 1 downto 0);
83
 67
84
 68                 Q           : out   std_logic_vector(15 downto 0));
85
 69     end component;
86
 70
87
 71     signal R_R00            : std_logic_vector(15 downto 0);
88
 72     signal R_R02            : std_logic_vector(15 downto 0);
89
 73     signal R_R04            : std_logic_vector(15 downto 0);
90
 74     signal R_R06            : std_logic_vector(15 downto 0);
91
 75     signal R_R08            : std_logic_vector(15 downto 0);
92
 76     signal R_R10            : std_logic_vector(15 downto 0);
93
 77     signal R_R12            : std_logic_vector(15 downto 0);
94
 78     signal R_R14            : std_logic_vector(15 downto 0);
95
 79     signal R_R16            : std_logic_vector(15 downto 0);
96
 80     signal R_R18            : std_logic_vector(15 downto 0);
97
 81     signal R_R20            : std_logic_vector(15 downto 0);
98
 82     signal R_R22            : std_logic_vector(15 downto 0);
99
 83     signal R_R24            : std_logic_vector(15 downto 0);
100
 84     signal R_R26            : std_logic_vector(15 downto 0);
101
 85     signal R_R28            : std_logic_vector(15 downto 0);
102
 86     signal R_R30            : std_logic_vector(15 downto 0);
103
 87     signal R_SP             : std_logic_vector(15 downto 0);    -- stack pointer
104
 88
105
 89     component status_reg is
106
 90         port (  I_CLK       : in  std_logic;
107
 91
108
 92                 I_COND      : in  std_logic_vector ( 3 downto 0);
109
 93                 I_DIN       : in  std_logic_vector ( 7 downto 0);
110
 94                 I_FLAGS     : in  std_logic_vector ( 7 downto 0);
111
 95                 I_WE_F      : in  std_logic;
112
 96                 I_WE_SR     : in  std_logic;
113
 97
114
 98                 Q           : out std_logic_vector ( 7 downto 0);
115
 99                 Q_CC        : out std_logic);
116
100     end component;
117
101
118
102     signal S_FLAGS          : std_logic_vector( 7 downto 0);
119
103
120
104     signal L_ADR            : std_logic_vector(15 downto 0);
121
105     signal L_BASE           : std_logic_vector(15 downto 0);
122
106     signal L_DDDD           : std_logic_vector( 4 downto 1);
123
107     signal L_DSP            : std_logic_vector(15 downto 0);
124
108     signal L_DX             : std_logic_vector(15 downto 0);
125
109     signal L_DY             : std_logic_vector(15 downto 0);
126
110     signal L_DZ             : std_logic_vector(15 downto 0);
127
111     signal L_PRE            : std_logic_vector(15 downto 0);
128
112     signal L_POST           : std_logic_vector(15 downto 0);
129
113     signal L_S              : std_logic_vector(15 downto 0);
130
114     signal L_WE_SP_AMOD     : std_logic;
131
115     signal L_WE             : std_logic_vector(31 downto 0);
132
116     signal L_WE_A           : std_logic;
133
117     signal L_WE_D           : std_logic_vector(31 downto 0);
134
118     signal L_WE_D2          : std_logic_vector( 1 downto 0);
135
119     signal L_WE_DD          : std_logic_vector(31 downto 0);
136
120     signal L_WE_IO          : std_logic_vector(31 downto 0);
137
121     signal L_WE_MISC        : std_logic_vector(31 downto 0);
138
122     signal L_WE_X           : std_logic;
139
123     signal L_WE_Y           : std_logic;
140
124     signal L_WE_Z           : std_logic;
141
125     signal L_WE_SP          : std_logic_vector( 1 downto 0);
142
126     signal L_WE_SR          : std_logic;
143
127     signal L_XYZS           : std_logic_vector(15 downto 0);
144
128
145
129     begin
146
130
147
131         r00: reg_16 port map(I_CLK => I_CLK, I_WE => L_WE( 1 downto  0), I_D => I_DIN, Q => R_R00);
148
132         r02: reg_16 port map(I_CLK => I_CLK, I_WE => L_WE( 3 downto  2), I_D => I_DIN, Q => R_R02);
149
133         r04: reg_16 port map(I_CLK => I_CLK, I_WE => L_WE( 5 downto  4), I_D => I_DIN, Q => R_R04);
150
134         r06: reg_16 port map(I_CLK => I_CLK, I_WE => L_WE( 7 downto  6), I_D => I_DIN, Q => R_R06);
151
135         r08: reg_16 port map(I_CLK => I_CLK, I_WE => L_WE( 9 downto  8), I_D => I_DIN, Q => R_R08);
152
136         r10: reg_16 port map(I_CLK => I_CLK, I_WE => L_WE(11 downto 10), I_D => I_DIN, Q => R_R10);
153
137         r12: reg_16 port map(I_CLK => I_CLK, I_WE => L_WE(13 downto 12), I_D => I_DIN, Q => R_R12);
154
138         r14: reg_16 port map(I_CLK => I_CLK, I_WE => L_WE(15 downto 14), I_D => I_DIN, Q => R_R14);
155
139         r16: reg_16 port map(I_CLK => I_CLK, I_WE => L_WE(17 downto 16), I_D => I_DIN, Q => R_R16);
156
140         r18: reg_16 port map(I_CLK => I_CLK, I_WE => L_WE(19 downto 18), I_D => I_DIN, Q => R_R18);
157
141         r20: reg_16 port map(I_CLK => I_CLK, I_WE => L_WE(21 downto 20), I_D => I_DIN, Q => R_R20);
158
142         r22: reg_16 port map(I_CLK => I_CLK, I_WE => L_WE(23 downto 22), I_D => I_DIN, Q => R_R22);
159
143         r24: reg_16 port map(I_CLK => I_CLK, I_WE => L_WE(25 downto 24), I_D => I_DIN, Q => R_R24);
160
144         r26: reg_16 port map(I_CLK => I_CLK, I_WE => L_WE(27 downto 26), I_D => L_DX,  Q => R_R26);
161
145         r28: reg_16 port map(I_CLK => I_CLK, I_WE => L_WE(29 downto 28), I_D => L_DY,  Q => R_R28);
162
146         r30: reg_16 port map(I_CLK => I_CLK, I_WE => L_WE(31 downto 30), I_D => L_DZ,  Q => R_R30);
163
147         sp:  reg_16 port map(I_CLK => I_CLK, I_WE => L_WE_SP,            I_D => L_DSP, Q => R_SP);
164
148
165
149         sr: status_reg
166
150         port map(   I_CLK       => I_CLK,
167
151                     I_COND      => I_COND,
168
152                     I_DIN       => I_DIN(7 downto 0),
169
153                     I_FLAGS     => I_FLAGS,
170
154                     I_WE_F      => I_WE_F,
171
155                     I_WE_SR     => L_WE_SR,
172
156                     Q           => S_FLAGS,
173
157                     Q_CC        => Q_CC);
174
158
175
159         -- The output of the register selected by L_ADR.
176
160         --
177
161         process(R_R00, R_R02, R_R04, R_R06, R_R08, R_R10, R_R12, R_R14,
178
162                 R_R16, R_R18, R_R20, R_R22, R_R24, R_R26, R_R28, R_R30,
179
163                 R_SP, S_FLAGS, L_ADR(6 downto 1))
180
164         begin
181
165             case L_ADR(6 downto 1) is
182
166                 when "000000" => L_S <= R_R00;
183
167                 when "000001" => L_S <= R_R02;
184
168                 when "000010" => L_S <= R_R04;
185
169                 when "000011" => L_S <= R_R06;
186
170                 when "000100" => L_S <= R_R08;
187
171                 when "000101" => L_S <= R_R10;
188
172                 when "000110" => L_S <= R_R12;
189
173                 when "000111" => L_S <= R_R14;
190
174                 when "001000" => L_S <= R_R16;
191
175                 when "001001" => L_S <= R_R18;
192
176                 when "001010" => L_S <= R_R20;
193
177                 when "001011" => L_S <= R_R22;
194
178                 when "001100" => L_S <= R_R24;
195
179                 when "001101" => L_S <= R_R26;
196
180                 when "001110" => L_S <= R_R28;
197
181                 when "001111" => L_S <= R_R30;
198
182                 when "101111" => L_S <= R_SP ( 7 downto 0) & X"00";     -- SPL
199
183                 when others   => L_S <= S_FLAGS & R_SP (15 downto 8);   -- SR/SPH
200
184             end case;
201
185         end process;
202
186
203
187         -- The output of the register pair selected by I_DDDDD.
204
188         --
205
189         process(R_R00, R_R02, R_R04, R_R06, R_R08, R_R10, R_R12, R_R14,
206
190                 R_R16, R_R18, R_R20, R_R22, R_R24, R_R26, R_R28, R_R30,
207
191                 I_DDDDD(4 downto 1))
208
192         begin
209
193             case I_DDDDD(4 downto 1) is
210
194                 when "0000" => Q_D <= R_R00;
211
195                 when "0001" => Q_D <= R_R02;
212
196                 when "0010" => Q_D <= R_R04;
213
197                 when "0011" => Q_D <= R_R06;
214
198                 when "0100" => Q_D <= R_R08;
215
199                 when "0101" => Q_D <= R_R10;
216
200                 when "0110" => Q_D <= R_R12;
217
201                 when "0111" => Q_D <= R_R14;
218
202                 when "1000" => Q_D <= R_R16;
219
203                 when "1001" => Q_D <= R_R18;
220
204                 when "1010" => Q_D <= R_R20;
221
205                 when "1011" => Q_D <= R_R22;
222
206                 when "1100" => Q_D <= R_R24;
223
207                 when "1101" => Q_D <= R_R26;
224
208                 when "1110" => Q_D <= R_R28;
225
209                 when others => Q_D <= R_R30;
226
210             end case;
227
211         end process;
228
212
229
213         -- The output of the register pair selected by I_RRRR.
230
214         --
231
215         process(R_R00, R_R02, R_R04,  R_R06, R_R08, R_R10, R_R12, R_R14,
232
216                 R_R16, R_R18, R_R20, R_R22, R_R24, R_R26, R_R28, R_R30, I_RRRR)
233
217         begin
234
218             case I_RRRR is
235
219                 when "0000" => Q_R <= R_R00;
236
220                 when "0001" => Q_R <= R_R02;
237
221                 when "0010" => Q_R <= R_R04;
238
222                 when "0011" => Q_R <= R_R06;
239
223                 when "0100" => Q_R <= R_R08;
240
224                 when "0101" => Q_R <= R_R10;
241
225                 when "0110" => Q_R <= R_R12;
242
226                 when "0111" => Q_R <= R_R14;
243
227                 when "1000" => Q_R <= R_R16;
244
228                 when "1001" => Q_R <= R_R18;
245
229                 when "1010" => Q_R <= R_R20;
246
230                 when "1011" => Q_R <= R_R22;
247
231                 when "1100" => Q_R <= R_R24;
248
232                 when "1101" => Q_R <= R_R26;
249
233                 when "1110" => Q_R <= R_R28;
250
234                 when others => Q_R <= R_R30;
251
235             end case;
252
236         end process;
253
237
254
238         -- the base value of the X/Y/Z/SP register as per I_AMOD.
255
239         --
256
240         process(I_AMOD(2 downto 0), I_IMM, R_SP, R_R26, R_R28, R_R30)
257
241         begin
258
242             case I_AMOD(2 downto 0) is
259
243                 when AS_SP  => L_BASE <= R_SP;
260
244                 when AS_Z   => L_BASE <= R_R30;
261
245                 when AS_Y   => L_BASE <= R_R28;
262
246                 when AS_X   => L_BASE <= R_R26;
263
247                 when AS_IMM => L_BASE <= I_IMM;
264
248                 when others => L_BASE <= X"0000";
265
249             end case;
266
250         end process;
267
251
268
252         -- the value of the X/Y/Z/SP register after a potential PRE-decrement
269
253         -- (by 1 or 2) and POST-increment (by 1 or 2).
270
254         --
271
255         process(I_AMOD(5 downto 3), I_IMM)
272
256         begin
273
257             case I_AMOD(5 downto 3) is
274
258                 when AO_0   => L_PRE <= X"0000";    L_POST <= X"0000";
275
259                 when AO_i   => L_PRE <= X"0000";    L_POST <= X"0001";
276
260                 when AO_ii  => L_PRE <= X"0000";    L_POST <= X"0002";
277
261                 when AO_q   => L_PRE <= I_IMM;      L_POST <= X"0000";
278
262                 when AO_d   => L_PRE <= X"FFFF";    L_POST <= X"FFFF";
279
263                 when AO_dd  => L_PRE <= X"FFFE";    L_POST <= X"FFFE";
280
264                 when others => L_PRE <= X"0000";    L_POST <= X"0000";
281
265             end case;
282
266         end process;
283
267
284
268         L_XYZS <= L_BASE + L_POST;
285
269         L_ADR  <= L_BASE + L_PRE;
286
270
287
271         L_WE_A <= I_WE_M when (L_ADR(15 downto 5) = "00000000000") else '0';
288
272         L_WE_SR    <= I_WE_M when (L_ADR = X"005F") else '0';
289
273         L_WE_SP_AMOD <= I_WE_XYZS when (I_AMOD(2 downto 0) = AS_SP) else '0';
290
274         L_WE_SP(1) <= I_WE_M when (L_ADR = X"005E") else L_WE_SP_AMOD;
291
275         L_WE_SP(0) <= I_WE_M when (L_ADR = X"005D") else L_WE_SP_AMOD;
292
276
293
277         L_DX  <= L_XYZS when (L_WE_MISC(26) = '1')        else I_DIN;
294
278         L_DY  <= L_XYZS when (L_WE_MISC(28) = '1')        else I_DIN;
295
279         L_DZ  <= L_XYZS when (L_WE_MISC(30) = '1')        else I_DIN;
296
280         L_DSP <= L_XYZS when (I_AMOD(3 downto 0) = AM_WS) else I_DIN;
297
281
298
282         -- the WE signals for the differen registers.
299
283         --
300
284         -- case 1: write to an 8-bit register addressed by DDDDD.
301
285         --
302
286         -- I_WE_D(0) = '1' and I_DDDDD matches,
303
287         --
304
288         L_WE_D( 0) <= I_WE_D(0) when (I_DDDDD = "00000") else '0';
305
289         L_WE_D( 1) <= I_WE_D(0) when (I_DDDDD = "00001") else '0';
306
290         L_WE_D( 2) <= I_WE_D(0) when (I_DDDDD = "00010") else '0';
307
291         L_WE_D( 3) <= I_WE_D(0) when (I_DDDDD = "00011") else '0';
308
292         L_WE_D( 4) <= I_WE_D(0) when (I_DDDDD = "00100") else '0';
309
293         L_WE_D( 5) <= I_WE_D(0) when (I_DDDDD = "00101") else '0';
310
294         L_WE_D( 6) <= I_WE_D(0) when (I_DDDDD = "00110") else '0';
311
295         L_WE_D( 7) <= I_WE_D(0) when (I_DDDDD = "00111") else '0';
312
296         L_WE_D( 8) <= I_WE_D(0) when (I_DDDDD = "01000") else '0';
313
297         L_WE_D( 9) <= I_WE_D(0) when (I_DDDDD = "01001") else '0';
314
298         L_WE_D(10) <= I_WE_D(0) when (I_DDDDD = "01010") else '0';
315
299         L_WE_D(11) <= I_WE_D(0) when (I_DDDDD = "01011") else '0';
316
300         L_WE_D(12) <= I_WE_D(0) when (I_DDDDD = "01100") else '0';
317
301         L_WE_D(13) <= I_WE_D(0) when (I_DDDDD = "01101") else '0';
318
302         L_WE_D(14) <= I_WE_D(0) when (I_DDDDD = "01110") else '0';
319
303         L_WE_D(15) <= I_WE_D(0) when (I_DDDDD = "01111") else '0';
320
304         L_WE_D(16) <= I_WE_D(0) when (I_DDDDD = "10000") else '0';
321
305         L_WE_D(17) <= I_WE_D(0) when (I_DDDDD = "10001") else '0';
322
306         L_WE_D(18) <= I_WE_D(0) when (I_DDDDD = "10010") else '0';
323
307         L_WE_D(19) <= I_WE_D(0) when (I_DDDDD = "10011") else '0';
324
308         L_WE_D(20) <= I_WE_D(0) when (I_DDDDD = "10100") else '0';
325
309         L_WE_D(21) <= I_WE_D(0) when (I_DDDDD = "10101") else '0';
326
310         L_WE_D(22) <= I_WE_D(0) when (I_DDDDD = "10110") else '0';
327
311         L_WE_D(23) <= I_WE_D(0) when (I_DDDDD = "10111") else '0';
328
312         L_WE_D(24) <= I_WE_D(0) when (I_DDDDD = "11000") else '0';
329
313         L_WE_D(25) <= I_WE_D(0) when (I_DDDDD = "11001") else '0';
330
314         L_WE_D(26) <= I_WE_D(0) when (I_DDDDD = "11010") else '0';
331
315         L_WE_D(27) <= I_WE_D(0) when (I_DDDDD = "11011") else '0';
332
316         L_WE_D(28) <= I_WE_D(0) when (I_DDDDD = "11100") else '0';
333
317         L_WE_D(29) <= I_WE_D(0) when (I_DDDDD = "11101") else '0';
334
318         L_WE_D(30) <= I_WE_D(0) when (I_DDDDD = "11110") else '0';
335
319         L_WE_D(31) <= I_WE_D(0) when (I_DDDDD = "11111") else '0';
336
320
337
321         --
338
322         -- case 2: write to a 16-bit register pair addressed by DDDD.
339
323         --
340
324         -- I_WE_DD(1) = '1' and L_DDDD matches,
341
325         --
342
326         L_DDDD <= I_DDDDD(4 downto 1);
343
327         L_WE_D2 <= I_WE_D(1) & I_WE_D(1);
344
328         L_WE_DD( 1 downto  0) <= L_WE_D2 when (L_DDDD = "0000") else "00";
345
329         L_WE_DD( 3 downto  2) <= L_WE_D2 when (L_DDDD = "0001") else "00";
346
330         L_WE_DD( 5 downto  4) <= L_WE_D2 when (L_DDDD = "0010") else "00";
347
331         L_WE_DD( 7 downto  6) <= L_WE_D2 when (L_DDDD = "0011") else "00";
348
332         L_WE_DD( 9 downto  8) <= L_WE_D2 when (L_DDDD = "0100") else "00";
349
333         L_WE_DD(11 downto 10) <= L_WE_D2 when (L_DDDD = "0101") else "00";
350
334         L_WE_DD(13 downto 12) <= L_WE_D2 when (L_DDDD = "0110") else "00";
351
335         L_WE_DD(15 downto 14) <= L_WE_D2 when (L_DDDD = "0111") else "00";
352
336         L_WE_DD(17 downto 16) <= L_WE_D2 when (L_DDDD = "1000") else "00";
353
337         L_WE_DD(19 downto 18) <= L_WE_D2 when (L_DDDD = "1001") else "00";
354
338         L_WE_DD(21 downto 20) <= L_WE_D2 when (L_DDDD = "1010") else "00";
355
339         L_WE_DD(23 downto 22) <= L_WE_D2 when (L_DDDD = "1011") else "00";
356
340         L_WE_DD(25 downto 24) <= L_WE_D2 when (L_DDDD = "1100") else "00";
357
341         L_WE_DD(27 downto 26) <= L_WE_D2 when (L_DDDD = "1101") else "00";
358
342         L_WE_DD(29 downto 28) <= L_WE_D2 when (L_DDDD = "1110") else "00";
359
343         L_WE_DD(31 downto 30) <= L_WE_D2 when (L_DDDD = "1111") else "00";
360
344
361
345         --
362
346         -- case 3: write to an 8-bit register pair addressed by an I/O address.
363
347         --
364
348         -- L_WE_A = '1' and L_ADR(4 downto 0) matches
365
349         --
366
350         L_WE_IO( 0) <= L_WE_A when (L_ADR(4 downto 0) = "00000") else '0';
367
351         L_WE_IO( 1) <= L_WE_A when (L_ADR(4 downto 0) = "00001") else '0';
368
352         L_WE_IO( 2) <= L_WE_A when (L_ADR(4 downto 0) = "00010") else '0';
369
353         L_WE_IO( 3) <= L_WE_A when (L_ADR(4 downto 0) = "00011") else '0';
370
354         L_WE_IO( 4) <= L_WE_A when (L_ADR(4 downto 0) = "00100") else '0';
371
355         L_WE_IO( 5) <= L_WE_A when (L_ADR(4 downto 0) = "00101") else '0';
372
356         L_WE_IO( 6) <= L_WE_A when (L_ADR(4 downto 0) = "00110") else '0';
373
357         L_WE_IO( 7) <= L_WE_A when (L_ADR(4 downto 0) = "00111") else '0';
374
358         L_WE_IO( 8) <= L_WE_A when (L_ADR(4 downto 0) = "01000") else '0';
375
359         L_WE_IO( 9) <= L_WE_A when (L_ADR(4 downto 0) = "01001") else '0';
376
360         L_WE_IO(10) <= L_WE_A when (L_ADR(4 downto 0) = "01010") else '0';
377
361         L_WE_IO(11) <= L_WE_A when (L_ADR(4 downto 0) = "01011") else '0';
378
362         L_WE_IO(12) <= L_WE_A when (L_ADR(4 downto 0) = "01100") else '0';
379
363         L_WE_IO(13) <= L_WE_A when (L_ADR(4 downto 0) = "01101") else '0';
380
364         L_WE_IO(14) <= L_WE_A when (L_ADR(4 downto 0) = "01110") else '0';
381
365         L_WE_IO(15) <= L_WE_A when (L_ADR(4 downto 0) = "01111") else '0';
382
366         L_WE_IO(16) <= L_WE_A when (L_ADR(4 downto 0) = "10000") else '0';
383
367         L_WE_IO(17) <= L_WE_A when (L_ADR(4 downto 0) = "10001") else '0';
384
368         L_WE_IO(18) <= L_WE_A when (L_ADR(4 downto 0) = "10010") else '0';
385
369         L_WE_IO(19) <= L_WE_A when (L_ADR(4 downto 0) = "10011") else '0';
386
370         L_WE_IO(20) <= L_WE_A when (L_ADR(4 downto 0) = "10100") else '0';
387
371         L_WE_IO(21) <= L_WE_A when (L_ADR(4 downto 0) = "10101") else '0';
388
372         L_WE_IO(22) <= L_WE_A when (L_ADR(4 downto 0) = "10110") else '0';
389
373         L_WE_IO(23) <= L_WE_A when (L_ADR(4 downto 0) = "10111") else '0';
390
374         L_WE_IO(24) <= L_WE_A when (L_ADR(4 downto 0) = "11000") else '0';
391
375         L_WE_IO(25) <= L_WE_A when (L_ADR(4 downto 0) = "11001") else '0';
392
376         L_WE_IO(26) <= L_WE_A when (L_ADR(4 downto 0) = "11010") else '0';
393
377         L_WE_IO(27) <= L_WE_A when (L_ADR(4 downto 0) = "11011") else '0';
394
378         L_WE_IO(28) <= L_WE_A when (L_ADR(4 downto 0) = "11100") else '0';
395
379         L_WE_IO(29) <= L_WE_A when (L_ADR(4 downto 0) = "11101") else '0';
396
380         L_WE_IO(30) <= L_WE_A when (L_ADR(4 downto 0) = "11110") else '0';
397
381         L_WE_IO(31) <= L_WE_A when (L_ADR(4 downto 0) = "11111") else '0';
398
382
399
383         -- case 4 special cases.
400
384         -- 4a. WE_01 for register pair 0/1 (multiplication opcode).
401
385         -- 4b. I_WE_XYZS for X (register pairs 26/27) and I_AMOD matches
402
386         -- 4c. I_WE_XYZS for Y (register pairs 28/29) and I_AMOD matches
403
387         -- 4d. I_WE_XYZS for Z (register pairs 30/31) and I_AMOD matches
404
388         --
405
389         L_WE_X <= I_WE_XYZS when (I_AMOD(3 downto 0) = AM_WX) else '0';
406
390         L_WE_Y <= I_WE_XYZS when (I_AMOD(3 downto 0) = AM_WY) else '0';
407
391         L_WE_Z <= I_WE_XYZS when (I_AMOD(3 downto 0) = AM_WZ) else '0';
408
392         L_WE_MISC <= L_WE_Z & L_WE_Z &      -- -Z and Z+ address modes  r30
409
393                      L_WE_Y & L_WE_Y &      -- -Y and Y+ address modes  r28
410
394                      L_WE_X & L_WE_X &      -- -X and X+ address modes  r26
411
395                      X"000000" &            -- never                    r24 - r02
412
396                      I_WE_01 & I_WE_01;     -- multiplication result    r00
413
397
414
398         L_WE <= L_WE_D or L_WE_DD or L_WE_IO or L_WE_MISC;
415
399
416
400         Q_S <= L_S( 7 downto 0) when (L_ADR(0) = '0') else L_S(15 downto 8);
417
401         Q_FLAGS <= S_FLAGS;
418
402         Q_Z <= R_R30;
419
403         Q_ADR <= L_ADR;
420
404
421
405     end Behavioral;
422
406
423
<pre class="filename">
424
src/register_file.vhd
425
</pre></pre>
426
<P>
427
 
428
<P><hr><BR>
429
<table class="ttop"><th class="tpre"><a href="22_Listing_of_reg_16.vhd.html">Previous Lesson</a></th><th class="ttop"><a href="toc.html">Table of Content</a></th><th class="tnxt"><a href="24_Listing_of_segment7.vhd.html">Next Lesson</a></th></table>
430
</BODY>
431
</HTML>

powered by: WebSVN 2.1.0

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