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

Subversion Repositories nanoblaze

[/] [nanoblaze/] [trunk/] [Circuit/] [programRom.vhd] - Blame information for rev 8

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 8 fcorthay
--##############################################################################
2
--
3
--  programRom
4
--      NanoBlaze instruction ROM
5
--
6
--      The architecture is created by the assembler.
7
--      The systhesiser maps it into a Block RAM.
8
--
9
--------------------------------------------------------------------------------
10
--
11
--  Versions / Authors
12
--      1.0 Francois Corthay    first implementation
13
--
14
--  Provided under GNU LGPL licence: <http://www.gnu.org/copyleft/lesser.html>
15
--
16
--  by the electronics group of "HES-SO//Valais Wallis", in Switzerland:
17
--  <http://www.hevs.ch/en/rad-instituts/institut-systemes-industriels/>.
18
--
19
--------------------------------------------------------------------------------
20
--
21
--  Hierarchy
22
--      Used by "nanoblaze".
23
--
24
--##############################################################################
25
 
26
LIBRARY ieee;
27
  USE ieee.std_logic_1164.all;
28
  USE ieee.numeric_std.all;
29
 
30
ENTITY programRom IS
31
  GENERIC(
32
      addressBitNb : positive := 8;
33
      dataBitNb    : positive := 8
34
  );
35
  PORT(
36
    reset   : IN  std_uLogic;
37
    clock   : IN  std_uLogic;
38
    en      : IN  std_uLogic;
39
    address : IN  unsigned(addressBitNb-1 DOWNTO 0);
40
    dataOut : OUT std_ulogic_vector(dataBitNb-1 DOWNTO 0)
41
  );
42
END programRom ;
43
 
44
--==============================================================================
45
 
46
ARCHITECTURE mapped OF programRom IS
47
 
48
  subtype opCodeType is std_ulogic_vector(5 downto 0);
49
  constant opLoadC   : opCodeType := "000000";
50
  constant opLoadR   : opCodeType := "000001";
51
  constant opInputC  : opCodeType := "000100";
52
  constant opInputR  : opCodeType := "000101";
53
  constant opFetchC  : opCodeType := "000110";
54
  constant opFetchR  : opCodeType := "000111";
55
  constant opAndC    : opCodeType := "001010";
56
  constant opAndR    : opCodeType := "001011";
57
  constant opOrC     : opCodeType := "001100";
58
  constant opOrR     : opCodeType := "001101";
59
  constant opXorC    : opCodeType := "001110";
60
  constant opXorR    : opCodeType := "001111";
61
  constant opTestC   : opCodeType := "010010";
62
  constant opTestR   : opCodeType := "010011";
63
  constant opCompC   : opCodeType := "010100";
64
  constant opCompR   : opCodeType := "010101";
65
  constant opAddC    : opCodeType := "011000";
66
  constant opAddR    : opCodeType := "011001";
67
  constant opAddCyC  : opCodeType := "011010";
68
  constant opAddCyR  : opCodeType := "011011";
69
  constant opSubC    : opCodeType := "011100";
70
  constant opSubR    : opCodeType := "011101";
71
  constant opSubCyC  : opCodeType := "011110";
72
  constant opSubCyR  : opCodeType := "011111";
73
  constant opShRot   : opCodeType := "100000";
74
  constant opOutputC : opCodeType := "101100";
75
  constant opOutputR : opCodeType := "101101";
76
  constant opStoreC  : opCodeType := "101110";
77
  constant opStoreR  : opCodeType := "101111";
78
 
79
  subtype shRotCinType is std_ulogic_vector(2 downto 0);
80
  constant shRotLdC : shRotCinType := "00-";
81
  constant shRotLdM : shRotCinType := "01-";
82
  constant shRotLdL : shRotCinType := "10-";
83
  constant shRotLd0 : shRotCinType := "110";
84
  constant shRotLd1 : shRotCinType := "111";
85
 
86
  constant registerAddressBitNb : positive := 4;
87
  constant shRotPadLength : positive
88
    := dataOut'length - opCodeType'length - registerAddressBitNb
89
     - 1 - shRotCinType'length;
90
  subtype shRotDirType is std_ulogic_vector(1+shRotPadLength-1 downto 0);
91
  constant shRotL : shRotDirType := (0 => '0', others => '-');
92
  constant shRotR : shRotDirType := (0 => '1', others => '-');
93
 
94
  subtype branchCodeType is std_ulogic_vector(4 downto 0);
95
  constant brRet  : branchCodeType := "10101";
96
  constant brCall : branchCodeType := "11000";
97
  constant brJump : branchCodeType := "11010";
98
  constant brReti : branchCodeType := "11100";
99
  constant brEni  : branchCodeType := "11110";
100
 
101
  subtype branchConditionType is std_ulogic_vector(2 downto 0);
102
  constant brDo : branchConditionType := "000";
103
  constant brZ  : branchConditionType := "100";
104
  constant brNZ : branchConditionType := "101";
105
  constant brC  : branchConditionType := "110";
106
  constant brNC : branchConditionType := "111";
107
 
108
  subtype memoryWordType is std_ulogic_vector(dataOut'range);
109
  type memoryArrayType is array (0 to 2**address'length-1) of memoryWordType;
110
 
111
  signal memoryArray : memoryArrayType := (
112
                                                  --===============================================================
113
                                                  -- 1) Test logical operations with direct values
114
                                                  -----------------------------------------------------------------
115
    16#000# => opLoadC   & "0111" & "00000001",   -- LOAD      s7, 01
116
                                                  -----------------------------------------------------------------
117
                                                  -- Test "LOAD", "AND"
118
                                                  -----------------------------------------------------------------
119
    16#001# => opLoadC   & "0000" & "00001111",   -- LOAD      s0, 0F
120
    16#002# => opAndC    & "0000" & "00110011",   -- AND       s0, 33
121
    16#003# => opCompC   & "0000" & "00000011",   -- COMPARE   s0, 03
122
    16#004# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
123
                                                  -----------------------------------------------------------------
124
                                                  -- Test "OR"
125
                                                  -----------------------------------------------------------------
126
    16#005# => opLoadC   & "0001" & "00001111",   -- LOAD      s1, 0F
127
    16#006# => opOrC     & "0001" & "00110011",   -- OR        s1, 33
128
    16#007# => opCompC   & "0001" & "00111111",   -- COMPARE   s1, 3F
129
    16#008# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
130
                                                  -----------------------------------------------------------------
131
                                                  -- Test "XOR"
132
                                                  -----------------------------------------------------------------
133
    16#009# => opLoadC   & "0010" & "00001111",   -- LOAD      s2, 0F
134
    16#00A# => opXorC    & "0010" & "00110011",   -- XOR       s2, 33
135
    16#00B# => opCompC   & "0010" & "00111100",   -- COMPARE   s2, 3C
136
    16#00C# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
137
                                                  --===============================================================
138
                                                  -- 2) Test logical operations with registers
139
                                                  -----------------------------------------------------------------
140
    16#00D# => opAddC    & "0111" & "00000001",   -- ADD       s7, 01
141
                                                  -----------------------------------------------------------------
142
                                                  -- Test "LOAD"
143
                                                  -----------------------------------------------------------------
144
    16#00E# => opLoadC   & "0000" & "00110011",   -- LOAD      s0, 33
145
    16#00F# => opLoadR   & "0011" & "0000----",   -- LOAD      s3, s0
146
    16#010# => opCompC   & "0011" & "00110011",   -- COMPARE   s3, 33
147
    16#011# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
148
                                                  -----------------------------------------------------------------
149
                                                  -- Test "AND"
150
                                                  -----------------------------------------------------------------
151
    16#012# => opLoadC   & "0000" & "00001111",   -- LOAD      s0, 0F
152
    16#013# => opAndR    & "0000" & "0011----",   -- AND       s0, s3
153
    16#014# => opCompC   & "0000" & "00000011",   -- COMPARE   s0, 03
154
    16#015# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
155
                                                  -----------------------------------------------------------------
156
                                                  -- Test "OR"
157
                                                  -----------------------------------------------------------------
158
    16#016# => opLoadC   & "0001" & "00001111",   -- LOAD      s1, 0F
159
    16#017# => opOrR     & "0001" & "0011----",   -- OR        s1, s3
160
    16#018# => opCompC   & "0001" & "00111111",   -- COMPARE   s1, 3F
161
    16#019# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
162
                                                  -----------------------------------------------------------------
163
                                                  -- Test "XOR"
164
                                                  -----------------------------------------------------------------
165
    16#01A# => opLoadC   & "0010" & "00001111",   -- LOAD      s2, 0F
166
    16#01B# => opXorR    & "0010" & "0011----",   -- XOR       s2, s3
167
    16#01C# => opCompC   & "0010" & "00111100",   -- COMPARE   s2, 3C
168
    16#01D# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
169
                                                  --===============================================================
170
                                                  -- 3) Test arithmetic operations with constants
171
                                                  -----------------------------------------------------------------
172
    16#01E# => opAddC    & "0111" & "00000001",   -- ADD       s7, 01
173
                                                  -----------------------------------------------------------------
174
                                                  -- Test "ADD" and "ADDCY"
175
                                                  -----------------------------------------------------------------
176
    16#01F# => opLoadC   & "0000" & "00001111",   -- LOAD      s0, 0F
177
    16#020# => opAddC    & "0000" & "00110001",   -- ADD       s0, 31   ;  40
178
    16#021# => opAddCyC  & "0000" & "11110000",   -- ADDCY     s0, F0   ; 130
179
    16#022# => opAddCyC  & "0000" & "11110000",   -- ADDCY     s0, F0   ; 121
180
    16#023# => opAddC    & "0000" & "00001111",   -- ADD       s0, 0F   ;  30
181
    16#024# => opCompC   & "0000" & "00110000",   -- COMPARE   s0, 30
182
    16#025# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
183
                                                  -----------------------------------------------------------------
184
                                                  -- Test "SUB" and "SUBCY"
185
                                                  -----------------------------------------------------------------
186
    16#026# => opLoadC   & "0001" & "00001111",   -- LOAD      s1, 0F
187
    16#027# => opSubC    & "0001" & "00001100",   -- SUB       s1, 0C   ;  03
188
    16#028# => opSubCyC  & "0001" & "11110000",   -- SUBCY     s1, F0   ; 113
189
    16#029# => opSubCyC  & "0001" & "11110000",   -- SUBCY     s1, F0   ;  22
190
    16#02A# => opSubC    & "0001" & "00000001",   -- SUB       s1, 01   ;  21
191
    16#02B# => opCompC   & "0001" & "00100001",   -- COMPARE   s1, 21
192
    16#02C# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
193
                                                  --===============================================================
194
                                                  -- 4) Test arithmetic operations with registers
195
                                                  -----------------------------------------------------------------
196
    16#02D# => opAddC    & "0111" & "00000001",   -- ADD       s7, 01
197
                                                  -----------------------------------------------------------------
198
                                                  -- Test "ADD" and "ADDCY"
199
                                                  -----------------------------------------------------------------
200
    16#02E# => opLoadC   & "0000" & "00001111",   -- LOAD      s0, 0F
201
    16#02F# => opLoadC   & "0001" & "00110001",   -- LOAD      s1, 31
202
    16#030# => opLoadC   & "0010" & "11110000",   -- LOAD      s2, F0
203
    16#031# => opLoadC   & "0011" & "00001111",   -- LOAD      s3, 0F
204
    16#032# => opAddR    & "0000" & "0001----",   -- ADD       s0, s1   ;  40
205
    16#033# => opAddCyR  & "0000" & "0010----",   -- ADDCY     s0, s2   ; 130
206
    16#034# => opAddCyR  & "0000" & "0010----",   -- ADDCY     s0, s2   ; 121
207
    16#035# => opAddR    & "0000" & "0011----",   -- ADD       s0, s3   ;  30
208
    16#036# => opCompC   & "0000" & "00110000",   -- COMPARE   s0, 30
209
    16#037# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
210
                                                  -----------------------------------------------------------------
211
                                                  -- Test "SUB" and "SUBCY"
212
                                                  -----------------------------------------------------------------
213
    16#038# => opLoadC   & "0001" & "00001111",   -- LOAD      s1, 0F
214
    16#039# => opLoadC   & "0000" & "00001100",   -- LOAD      s0, 0C
215
    16#03A# => opLoadC   & "0010" & "11110000",   -- LOAD      s2, F0
216
    16#03B# => opLoadC   & "0011" & "00000001",   -- LOAD      s3, 01
217
    16#03C# => opSubR    & "0001" & "0000----",   -- SUB       s1, s0   ;  03
218
    16#03D# => opSubCyR  & "0001" & "0010----",   -- SUBCY     s1, s2   ; 113
219
    16#03E# => opSubCyR  & "0001" & "0010----",   -- SUBCY     s1, s2   ;  22
220
    16#03F# => opSubR    & "0001" & "0011----",   -- SUB       s1, s3   ;  21
221
    16#040# => opCompC   & "0001" & "00100001",   -- COMPARE   s1, 21
222
    16#041# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
223
                                                  --===============================================================
224
                                                  -- 5) Test shifts
225
                                                  -----------------------------------------------------------------
226
    16#042# => opAddC    & "0111" & "00000001",   -- ADD       s7, 01
227
                                                  -----------------------------------------------------------------
228
                                                  -- Test shift right
229
                                                  -----------------------------------------------------------------
230
    16#043# => opLoadC   & "0000" & "00001111",   -- LOAD      s0, 0F   ; 0F
231
    16#044# => opShRot   & "0000" & shRotR & shRotLd0,-- SR0       s0       ; 07
232
    16#045# => opShRot   & "0000" & shRotR & shRotLdM,-- SRX       s0       ; 03
233
    16#046# => opShRot   & "0000" & shRotR & shRotLd1,-- SR1       s0       ; 81
234
    16#047# => opShRot   & "0000" & shRotR & shRotLdM,-- SRX       s0       ; C0, C=1
235
    16#048# => opShRot   & "0000" & shRotR & shRotLdC,-- SRA       s0       ; E0, C=0
236
    16#049# => opShRot   & "0000" & shRotR & shRotLdC,-- SRA       s0       ; 70
237
    16#04A# => opCompC   & "0000" & "01110000",   -- COMPARE   s0, 70
238
    16#04B# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
239
                                                  -----------------------------------------------------------------
240
                                                  -- Test shift left
241
                                                  -----------------------------------------------------------------
242
    16#04C# => opLoadC   & "0001" & "11110000",   -- LOAD      s1, F0   ; FO
243
    16#04D# => opShRot   & "0001" & shRotL & shRotLd0,-- SL0       s1       ; E0
244
    16#04E# => opShRot   & "0001" & shRotL & shRotLdL,-- SLX       s1       ; C0
245
    16#04F# => opShRot   & "0001" & shRotL & shRotLd1,-- SL1       s1       ; 81
246
    16#050# => opShRot   & "0001" & shRotL & shRotLdL,-- SLX       s1       ; 03, C=1
247
    16#051# => opShRot   & "0001" & shRotL & shRotLdC,-- SLA       s1       ; 07, C=0
248
    16#052# => opShRot   & "0001" & shRotL & shRotLdC,-- SLA       s1       ; 0E
249
    16#053# => opCompC   & "0001" & "00001110",   -- COMPARE   s1, 0E
250
    16#054# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
251
                                                  --===============================================================
252
                                                  -- 6) Test comparison operators
253
                                                  -----------------------------------------------------------------
254
    16#055# => opAddC    & "0111" & "00000001",   -- ADD       s7, 01
255
                                                  -----------------------------------------------------------------
256
                                                  -- Test "COMPARE"
257
                                                  -----------------------------------------------------------------
258
    16#056# => opLoadC   & "0000" & "00001111",   -- LOAD      s0, 0F
259
    16#057# => opCompC   & "0000" & "11110000",   -- COMPARE   s0, F0   ; A < B => C=1
260
    16#058# => brJump    & brNC   & "1111111101", -- JUMP      NC, 3FD
261
    16#059# => opCompC   & "0000" & "11110000",   -- COMPARE   s0, F0   ; A < B => Z=0
262
    16#05A# => brJump    & brZ    & "1111111101", -- JUMP      Z, 3FD
263
    16#05B# => opCompR   & "0000" & "0000----",   -- COMPARE   s0, s0   ; A = B => Z=1
264
    16#05C# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
265
    16#05D# => opCompC   & "0000" & "00001000",   -- COMPARE   s0, 08   ; A > B => C=0
266
    16#05E# => brJump    & brC    & "1111111101", -- JUMP      C, 3FD
267
    16#05F# => opCompC   & "0000" & "00001000",   -- COMPARE   s0, 08   ; A > B => Z=0
268
    16#060# => brJump    & brZ    & "1111111101", -- JUMP      Z, 3FD
269
                                                  -----------------------------------------------------------------
270
                                                  -- Test "TEST"
271
                                                  -----------------------------------------------------------------
272
    16#061# => opLoadC   & "0000" & "00001111",   -- LOAD      s0, 0F
273
    16#062# => opTestC   & "0000" & "11110000",   -- TEST      s0, F0   ; AND is 00 => Z=1
274
    16#063# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
275
    16#064# => opTestC   & "0000" & "11111111",   -- TEST      s0, FF   ; AND is 0F => Z=0
276
    16#065# => brJump    & brZ    & "1111111101", -- JUMP      Z, 3FD
277
                                                  --===============================================================
278
                                                  -- 7) Test INPUT and OUTPUT operators
279
                                                  -----------------------------------------------------------------
280
    16#066# => opAddC    & "0111" & "00000001",   -- ADD       s7, 01
281
                                                  -----------------------------------------------------------------
282
                                                  -- Test "INPUT" and "OUTPUT" direct
283
                                                  --
284
                                                  -- The testbench should invert the word written at address FC.
285
                                                  -----------------------------------------------------------------
286
    16#067# => opLoadC   & "0000" & "10101010",   -- LOAD      s0, AA
287
    16#068# => opOutputC & "0000" & "11111100",   -- OUTPUT    s0, FC
288
    16#069# => opInputC  & "0001" & "11111100",   -- INPUT     s1, FC
289
    16#06A# => opCompC   & "0001" & "01010101",   -- COMPARE   s1, 55
290
    16#06B# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
291
                                                  -----------------------------------------------------------------
292
                                                  -- Test "INPUT" and "OUTPUT" indexed
293
                                                  -----------------------------------------------------------------
294
    16#06C# => opLoadC   & "0000" & "11001100",   -- LOAD      s0, CC
295
    16#06D# => opLoadC   & "0010" & "11111100",   -- LOAD      s2, FC
296
    16#06E# => opOutputR & "0000" & "0010----",   -- OUTPUT    s0, (S2)
297
    16#06F# => opInputR  & "0001" & "0010----",   -- INPUT     s1, (S2)
298
    16#070# => opCompC   & "0001" & "00110011",   -- COMPARE   s1, 33
299
    16#071# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
300
                                                  --===============================================================
301
                                                  -- 8) Test STORE and FETCH operators
302
                                                  -----------------------------------------------------------------
303
    16#072# => opAddC    & "0111" & "00000001",   -- ADD       s7, 01
304
                                                  -----------------------------------------------------------------
305
                                                  -- Test "STORE" and "FETCH" direct
306
                                                  -----------------------------------------------------------------
307
    16#073# => opLoadC   & "0000" & "00001111",   -- LOAD      s0, 0F
308
    16#074# => opStoreC  & "0000" & "00000011",   -- STORE     s0, 03
309
    16#075# => opFetchC  & "0001" & "00000011",   -- FETCH     s1, 03
310
    16#076# => opCompC   & "0001" & "00001111",   -- COMPARE   s1, 0F
311
    16#077# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
312
                                                  -----------------------------------------------------------------
313
                                                  -- Test "STORE" and "FETCH" indexed
314
                                                  -----------------------------------------------------------------
315
    16#078# => opLoadC   & "0000" & "11110000",   -- LOAD      s0, F0
316
    16#079# => opLoadC   & "0010" & "00000100",   -- LOAD      s2, 04
317
    16#07A# => opStoreR  & "0000" & "0010----",   -- STORE     s0, (S2)
318
    16#07B# => opFetchR  & "0001" & "0010----",   -- FETCH     s1, (S2)
319
    16#07C# => opCompC   & "0001" & "11110000",   -- COMPARE   s1, F0
320
    16#07D# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
321
                                                  --===============================================================
322
                                                  -- 9) Test JUMP instructions
323
                                                  -----------------------------------------------------------------
324
    16#07E# => opAddC    & "0111" & "00000001",   -- ADD       s7, 01
325
                                                  -----------------------------------------------------------------
326
                                                  -- Test "JUMP NC"
327
                                                  -----------------------------------------------------------------
328
    16#07F# => opLoadC   & "0000" & "11110000",   -- LOAD      s0, F0
329
    16#080# => opAddC    & "0000" & "00000000",   -- ADD       s0, 00   ; s0=F0, C=0, Z=0
330
    16#081# => brJump    & brNC   & "0010000011", -- JUMP      NC, 083
331
    16#082# => brJump    & brDo   & "1111111101", -- JUMP      3FD
332
                                                  -----------------------------------------------------------------
333
                                                  -- Test "JUMP NZ"
334
                                                  -----------------------------------------------------------------
335
                                                  -- _continue1_:
336
    16#083# => opAddC    & "0000" & "00000000",   -- ADD       s0, 00   ; s0=F0, C=0, Z=0
337
    16#084# => brJump    & brNZ   & "0010000110", -- JUMP      NZ, 086
338
    16#085# => brJump    & brDo   & "1111111101", -- JUMP      3FD
339
                                                  -----------------------------------------------------------------
340
                                                  -- Test "JUMP C"
341
                                                  -----------------------------------------------------------------
342
                                                  -- _continue2_:
343
    16#086# => opAddC    & "0000" & "11110000",   -- ADD       s0, F0   ; s0=E0, C=1, Z=0
344
    16#087# => brJump    & brC    & "0010001001", -- JUMP      C, 089
345
    16#088# => brJump    & brDo   & "1111111101", -- JUMP      3FD
346
                                                  -----------------------------------------------------------------
347
                                                  -- Test "JUMP Z"
348
                                                  -----------------------------------------------------------------
349
                                                  -- _continue3_:
350
    16#089# => opSubC    & "0000" & "11100000",   -- SUB       s0, E0   ; s0=00, C=0, Z=1
351
    16#08A# => brJump    & brZ    & "0010001100", -- JUMP      Z, 08C
352
    16#08B# => brJump    & brDo   & "1111111101", -- JUMP      3FD
353
                                                  -- _continue4_:
354
    16#08C# => opLoadR   & "0000" & "0000----",   -- NOP
355
                                                  --===============================================================
356
                                                  -- 10) Test call instructions
357
                                                  -----------------------------------------------------------------
358
    16#08D# => opAddC    & "0111" & "00000001",   -- ADD       s7, 01
359
                                                  -----------------------------------------------------------------
360
                                                  -- define subroutine
361
                                                  -----------------------------------------------------------------
362
    16#08E# => brJump    & brDo   & "0010010010", -- JUMP      092
363
                                                  -- _subRetDo_:
364
    16#08F# => opAddC    & "0000" & "00000001",   -- ADD       s0, 01
365
    16#090# => brRet     & brDo   & "----------", -- RETURN
366
    16#091# => brJump    & brDo   & "1111111101", -- JUMP      3FD
367
                                                  -----------------------------------------------------------------
368
                                                  -- Test "CALL"
369
                                                  -----------------------------------------------------------------
370
                                                  -- _continue5_:
371
    16#092# => opLoadC   & "0000" & "00000000",   -- LOAD      s0, 00
372
    16#093# => opLoadC   & "0001" & "11110000",   -- LOAD      s1, F0
373
    16#094# => brCall    & brDo   & "0010001111", -- CALL      08F      ; s0=01
374
                                                  -----------------------------------------------------------------
375
                                                  -- Test "CALL NC"
376
                                                  -----------------------------------------------------------------
377
    16#095# => opAddC    & "0001" & "00000000",   -- ADD       s1, 00   ; s1=F0, C=0, Z=0
378
    16#096# => brCall    & brNC   & "0010001111", -- CALL      NC, 08F  ; s0=02
379
                                                  -----------------------------------------------------------------
380
                                                  -- Test "CALL NZ"
381
                                                  -----------------------------------------------------------------
382
    16#097# => opAddC    & "0001" & "00000000",   -- ADD       s1, 00   ; s1=F0, C=0, Z=0
383
    16#098# => brCall    & brNZ   & "0010001111", -- CALL      NZ, 08F  ; s0=03
384
                                                  -----------------------------------------------------------------
385
                                                  -- Test "CALL C"
386
                                                  -----------------------------------------------------------------
387
    16#099# => opAddC    & "0001" & "11110000",   -- ADD       s1, F0   ; s0=E0, C=1, Z=0
388
    16#09A# => brCall    & brC    & "0010001111", -- CALL      C, 08F   ; s0=04
389
                                                  -----------------------------------------------------------------
390
                                                  -- Test "CALL Z"
391
                                                  -----------------------------------------------------------------
392
    16#09B# => opSubC    & "0001" & "11100000",   -- SUB       s1, E0   ; s0=00, C=0, Z=1
393
    16#09C# => brCall    & brZ    & "0010001111", -- CALL      Z, 08F   ; s0=05
394
    16#09D# => opCompC   & "0000" & "00000101",   -- COMPARE   s0, 05
395
    16#09E# => brJump    & brNZ   & "1111111101", -- JUMP      NZ, 3FD
396
                                                  --===============================================================
397
                                                  -- 11) Test call return instructions
398
                                                  -----------------------------------------------------------------
399
    16#09F# => opAddC    & "0111" & "00000001",   -- ADD       s7, 01
400
                                                  -----------------------------------------------------------------
401
                                                  -- define subroutines
402
                                                  -----------------------------------------------------------------
403
    16#0A0# => brJump    & brDo   & "0010101101", -- JUMP      0AD
404
                                                  -- _subRetNC_:
405
    16#0A1# => opAddC    & "0000" & "00000001",   -- ADD       s0, 01
406
    16#0A2# => brRet     & brDo   & "----------", -- RETURN    NC
407
    16#0A3# => brJump    & brDo   & "1111111101", -- JUMP      3FD
408
                                                  -- _subRetNZ_:
409
    16#0A4# => opAddC    & "0000" & "00000001",   -- ADD       s0, 01
410
    16#0A5# => brRet     & brDo   & "----------", -- RETURN    NZ
411
    16#0A6# => brJump    & brDo   & "1111111101", -- JUMP      3FD
412
                                                  -- _subRetC_:
413
    16#0A7# => opAddC    & "0000" & "00000001",   -- ADD       s0, 01
414
    16#0A8# => brRet     & brDo   & "----------", -- RETURN    C
415
    16#0A9# => brJump    & brDo   & "1111111101", -- JUMP      3FD
416
                                                  -- _subRetZ_:
417
    16#0AA# => opAddC    & "0000" & "00000001",   -- ADD       s0, 01
418
    16#0AB# => brRet     & brDo   & "----------", -- RETURN    Z
419
    16#0AC# => brJump    & brDo   & "1111111101", -- JUMP      3FD
420
                                                  -----------------------------------------------------------------
421
                                                  -- Test "RETURN NC"
422
                                                  -----------------------------------------------------------------
423
                                                  -- _continue6_:
424
    16#0AD# => opLoadC   & "0000" & "00000000",   -- LOAD      s0, 00   ; increment will give C=0, Z=0
425
    16#0AE# => brCall    & brNC   & "0010100001", -- CALL      NC, 0A1
426
                                                  -----------------------------------------------------------------
427
                                                  -- Test "RETURN NZ"
428
                                                  -----------------------------------------------------------------
429
    16#0AF# => opLoadC   & "0000" & "00000000",   -- LOAD      s0, 00   ; increment will give C=0, Z=0
430
    16#0B0# => brCall    & brNZ   & "0010100100", -- CALL      NZ, 0A4
431
                                                  -----------------------------------------------------------------
432
                                                  -- Test "RETURN C"
433
                                                  -----------------------------------------------------------------
434
    16#0B1# => opLoadC   & "0000" & "11111111",   -- LOAD      s0, FF   ; increment will give C=1, Z=1
435
    16#0B2# => brCall    & brC    & "0010100111", -- CALL      C, 0A7
436
                                                  -----------------------------------------------------------------
437
                                                  -- Test "RETURN Z"
438
                                                  -----------------------------------------------------------------
439
    16#0B3# => opLoadC   & "0000" & "11111111",   -- LOAD      s0, FF   ; increment will give C=1, Z=1
440
    16#0B4# => brCall    & brZ    & "0010101010", -- CALL      Z, 0AA
441
                                                  --===============================================================
442
                                                  -- End of tests
443
                                                  --
444
                                                  -- The testbench should react if value 1 is written to address 00.
445
                                                  -----------------------------------------------------------------
446
    16#0B5# => opLoadC   & "0000" & "00000001",   -- LOAD      s0, 01
447
    16#0B6# => opOutputC & "0000" & "00000000",   -- OUTPUT    s0, 00
448
    16#0B7# => brJump    & brDo   & "1111111111", -- JUMP      3FF
449
                                                  --===============================================================
450
                                                  -- Assert error
451
                                                  --
452
                                                  -- The testbench should react if value 0 is written to address 00.
453
                                                  -----------------------------------------------------------------
454
                                                  -- _error_:
455
    16#3FD# => opLoadC   & "0000" & "00000000",   -- LOAD      s0, 00
456
    16#3FE# => opOutputC & "0000" & "00000000",   -- OUTPUT    s0, 00
457
                                                  --===============================================================
458
                                                  -- End of instruction memory
459
                                                  -----------------------------------------------------------------
460
                                                  -- _endOfMemory_:
461
    16#3FF# => brJump    & brDo   & "1111111111", -- JUMP      3FF
462
    others => (others => '0')
463
  );
464
 
465
BEGIN
466
 
467
  process (clock)
468
  begin
469
    if rising_edge(clock) then
470
      if en = '1' then
471
        dataOut <= memoryArray(to_integer(address));
472
      end if;
473
    end if;
474
  end process;
475
 
476
END ARCHITECTURE mapped;

powered by: WebSVN 2.1.0

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