OpenCores
URL https://opencores.org/ocsvn/hf-risc/hf-risc/trunk

Subversion Repositories hf-risc

[/] [hf-risc/] [trunk/] [hf-riscv/] [core_rv32i/] [control.vhd] - Blame information for rev 13

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 13 serginhofr
-- control signals for HF-RISCV
2
--
3
-- alu_op:                      alu_src1:               mem_write:              jump:
4
-- 0000 -> and                  0 -> r[rs1]             00 -> no mem write      00 -> no jump
5
-- 0001 -> or                   1 -> pc_last2           01 -> sb                01 -> don't care
6
-- 0010 -> xor                                          10 -> sh                10 -> jal
7
-- 0011 -> don't care           alu_src2:               11 -> sw                11 -> jalr
8
-- 0100 -> add                  000 -> imm_u
9
-- 0101 -> sub                  001 -> imm_i            mem_read:               branch:
10
-- 0110 -> lui, jal, jalr       010 -> imm_s            00 -> no mem read       000 -> no branch
11
-- 0111 -> slt                  011 -> pc               01 -> lb                001 -> beq
12
-- 1000 -> sltu                 100 -> rs2              10 -> lh                010 -> bne
13
-- 1001 -> sll                  101 -> r[rs2]           11 -> lw                011 -> blt
14
-- 1010 -> srl                  110 -> don't care                               100 -> bge
15
-- 1011 -> don't care           111 -> don't care                               101 -> bltu
16
-- 1100 -> sra                                                                  110 -> bgeu
17
-- 1101 -> don't care           reg_write:              sig_read:               111 -> system
18
-- 1110 -> don't care           0 -> no write           0 -> unsigned
19
-- 1111 -> don't care           1 -> write register     1 -> signed
20
 
21
library ieee;
22
use ieee.std_logic_1164.all;
23
use ieee.std_logic_unsigned.all;
24
 
25
entity control is
26
        port (  opcode:                 in std_logic_vector(6 downto 0);
27
                funct3:                 in std_logic_vector(2 downto 0);
28
                funct7:                 in std_logic_vector(6 downto 0);
29
                reg_write:              out std_logic;
30
                alu_src1:               out std_logic;
31
                alu_src2:               out std_logic_vector(2 downto 0);
32
                alu_op:                 out std_logic_vector(3 downto 0);
33
                jump:                   out std_logic_vector(1 downto 0);
34
                branch:                 out std_logic_vector(2 downto 0);
35
                mem_write:              out std_logic_vector(1 downto 0);
36
                mem_read:               out std_logic_vector(1 downto 0);
37
                sig_read:               out std_logic
38
        );
39
end control;
40
 
41
architecture arch_control of control is
42
begin
43
        process(opcode, funct3, funct7)
44
        begin
45
                case opcode is                                                  -- load immediate / jumps
46
                        when "0110111" =>                                       -- LUI
47
                                reg_write <= '1';
48
                                alu_src1 <= '0';
49
                                alu_src2 <= "000";
50
                                alu_op <= "0110";
51
                                jump <= "00";
52
                                branch <= "000";
53
                                mem_write <= "00";
54
                                mem_read <= "00";
55
                                sig_read <= '0';
56
                        when "0010111" =>                                       -- AUIPC
57
                                reg_write <= '1';
58
                                alu_src1 <= '1';
59
                                alu_src2 <= "000";
60
                                alu_op <= "0100";
61
                                jump <= "00";
62
                                branch <= "000";
63
                                mem_write <= "00";
64
                                mem_read <= "00";
65
                                sig_read <= '0';
66
                        when "1101111" =>                                       -- JAL
67
                                reg_write <= '1';
68
                                alu_src1 <= '0';
69
                                alu_src2 <= "011";
70
                                alu_op <= "0110";
71
                                jump <= "10";
72
                                branch <= "000";
73
                                mem_write <= "00";
74
                                mem_read <= "00";
75
                                sig_read <= '0';
76
                        when "1100111" =>                                       -- JALR
77
                                reg_write <= '1';
78
                                alu_src1 <= '0';
79
                                alu_src2 <= "011";
80
                                alu_op <= "0110";
81
                                jump <= "11";
82
                                branch <= "000";
83
                                mem_write <= "00";
84
                                mem_read <= "00";
85
                                sig_read <= '0';
86
                        when "1100011" =>                                       -- branches
87
                                case funct3 is
88
                                        when "000" =>                           -- BEQ
89
                                                reg_write <= '0';
90
                                                alu_src1 <= '0';
91
                                                alu_src2 <= "101";
92
                                                alu_op <= "0101";
93
                                                jump <= "00";
94
                                                branch <= "001";
95
                                                mem_write <= "00";
96
                                                mem_read <= "00";
97
                                                sig_read <= '0';
98
                                        when "001" =>                           -- BNE
99
                                                reg_write <= '0';
100
                                                alu_src1 <= '0';
101
                                                alu_src2 <= "101";
102
                                                alu_op <= "0101";
103
                                                jump <= "00";
104
                                                branch <= "010";
105
                                                mem_write <= "00";
106
                                                mem_read <= "00";
107
                                                sig_read <= '0';
108
                                        when "100" =>                           -- BLT
109
                                                reg_write <= '0';
110
                                                alu_src1 <= '0';
111
                                                alu_src2 <= "101";
112
                                                alu_op <= "0111";
113
                                                jump <= "00";
114
                                                branch <= "011";
115
                                                mem_write <= "00";
116
                                                mem_read <= "00";
117
                                                sig_read <= '0';
118
                                        when "101" =>                           -- BGE
119
                                                reg_write <= '0';
120
                                                alu_src1 <= '0';
121
                                                alu_src2 <= "101";
122
                                                alu_op <= "0111";
123
                                                jump <= "00";
124
                                                branch <= "100";
125
                                                mem_write <= "00";
126
                                                mem_read <= "00";
127
                                                sig_read <= '0';
128
                                        when "110" =>                           -- BLTU
129
                                                reg_write <= '0';
130
                                                alu_src1 <= '0';
131
                                                alu_src2 <= "101";
132
                                                alu_op <= "1000";
133
                                                jump <= "00";
134
                                                branch <= "101";
135
                                                mem_write <= "00";
136
                                                mem_read <= "00";
137
                                                sig_read <= '0';
138
                                        when "111" =>                           -- BGEU
139
                                                reg_write <= '0';
140
                                                alu_src1 <= '0';
141
                                                alu_src2 <= "101";
142
                                                alu_op <= "1000";
143
                                                jump <= "00";
144
                                                branch <= "110";
145
                                                mem_write <= "00";
146
                                                mem_read <= "00";
147
                                                sig_read <= '0';
148
                                        when others =>
149
                                                reg_write <= '0';
150
                                                alu_src1 <= '0';
151
                                                alu_src2 <= "000";
152
                                                alu_op <= "0000";
153
                                                jump <= "00";
154
                                                branch <= "000";
155
                                                mem_write <= "00";
156
                                                mem_read <= "00";
157
                                                sig_read <= '0';
158
                                end case;
159
                        when "0000011" =>                                       -- loads
160
                                case funct3 is
161
                                        when "000" =>                           -- LB
162
                                                reg_write <= '1';
163
                                                alu_src1 <= '0';
164
                                                alu_src2 <= "001";
165
                                                alu_op <= "0100";
166
                                                jump <= "00";
167
                                                branch <= "000";
168
                                                mem_write <= "00";
169
                                                mem_read <= "01";
170
                                                sig_read <= '1';
171
                                        when "001" =>                           -- LH
172
                                                reg_write <= '1';
173
                                                alu_src1 <= '0';
174
                                                alu_src2 <= "001";
175
                                                alu_op <= "0100";
176
                                                jump <= "00";
177
                                                branch <= "000";
178
                                                mem_write <= "00";
179
                                                mem_read <= "10";
180
                                                sig_read <= '1';
181
                                        when "010" =>                           -- LW
182
                                                reg_write <= '1';
183
                                                alu_src1 <= '0';
184
                                                alu_src2 <= "001";
185
                                                alu_op <= "0100";
186
                                                jump <= "00";
187
                                                branch <= "000";
188
                                                mem_write <= "00";
189
                                                mem_read <= "11";
190
                                                sig_read <= '1';
191
                                        when "100" =>                           -- LBU
192
                                                reg_write <= '1';
193
                                                alu_src1 <= '0';
194
                                                alu_src2 <= "001";
195
                                                alu_op <= "0100";
196
                                                jump <= "00";
197
                                                branch <= "000";
198
                                                mem_write <= "00";
199
                                                mem_read <= "01";
200
                                                sig_read <= '0';
201
                                        when "101" =>                           -- LHU
202
                                                reg_write <= '1';
203
                                                alu_src1 <= '0';
204
                                                alu_src2 <= "001";
205
                                                alu_op <= "0100";
206
                                                jump <= "00";
207
                                                branch <= "000";
208
                                                mem_write <= "00";
209
                                                mem_read <= "10";
210
                                                sig_read <= '0';
211
                                        when others =>
212
                                                reg_write <= '0';
213
                                                alu_src1 <= '0';
214
                                                alu_src2 <= "000";
215
                                                alu_op <= "0000";
216
                                                jump <= "00";
217
                                                branch <= "000";
218
                                                mem_write <= "00";
219
                                                mem_read <= "00";
220
                                                sig_read <= '0';
221
                                end case;
222
                        when "0100011" =>                                       -- stores
223
                                case funct3 is
224
                                        when "000" =>                           -- SB
225
                                                reg_write <= '0';
226
                                                alu_src1 <= '0';
227
                                                alu_src2 <= "010";
228
                                                alu_op <= "0100";
229
                                                jump <= "00";
230
                                                branch <= "000";
231
                                                mem_write <= "01";
232
                                                mem_read <= "00";
233
                                                sig_read <= '0';
234
                                        when "001" =>                           -- SH
235
                                                reg_write <= '0';
236
                                                alu_src1 <= '0';
237
                                                alu_src2 <= "010";
238
                                                alu_op <= "0100";
239
                                                jump <= "00";
240
                                                branch <= "000";
241
                                                mem_write <= "10";
242
                                                mem_read <= "00";
243
                                                sig_read <= '0';
244
                                        when "010" =>                           -- SW
245
                                                reg_write <= '0';
246
                                                alu_src1 <= '0';
247
                                                alu_src2 <= "010";
248
                                                alu_op <= "0100";
249
                                                jump <= "00";
250
                                                branch <= "000";
251
                                                mem_write <= "11";
252
                                                mem_read <= "00";
253
                                                sig_read <= '0';
254
                                        when others =>
255
                                                reg_write <= '0';
256
                                                alu_src1 <= '0';
257
                                                alu_src2 <= "000";
258
                                                alu_op <= "0000";
259
                                                jump <= "00";
260
                                                branch <= "000";
261
                                                mem_write <= "00";
262
                                                mem_read <= "00";
263
                                                sig_read <= '0';
264
                                end case;
265
                        when "0010011" =>                                       -- imm computation
266
                                case funct3 is
267
                                        when "000" =>                           -- ADDI
268
                                                reg_write <= '1';
269
                                                alu_src1 <= '0';
270
                                                alu_src2 <= "001";
271
                                                alu_op <= "0100";
272
                                                jump <= "00";
273
                                                branch <= "000";
274
                                                mem_write <= "00";
275
                                                mem_read <= "00";
276
                                                sig_read <= '0';
277
                                        when "010" =>                           -- SLTI
278
                                                reg_write <= '1';
279
                                                alu_src1 <= '0';
280
                                                alu_src2 <= "001";
281
                                                alu_op <= "0111";
282
                                                jump <= "00";
283
                                                branch <= "000";
284
                                                mem_write <= "00";
285
                                                mem_read <= "00";
286
                                                sig_read <= '0';
287
                                        when "011" =>                           -- SLTIU
288
                                                reg_write <= '1';
289
                                                alu_src1 <= '0';
290
                                                alu_src2 <= "001";
291
                                                alu_op <= "1000";
292
                                                jump <= "00";
293
                                                branch <= "000";
294
                                                mem_write <= "00";
295
                                                mem_read <= "00";
296
                                                sig_read <= '0';
297
                                        when "100" =>                           -- XORI
298
                                                reg_write <= '1';
299
                                                alu_src1 <= '0';
300
                                                alu_src2 <= "001";
301
                                                alu_op <= "0010";
302
                                                jump <= "00";
303
                                                branch <= "000";
304
                                                mem_write <= "00";
305
                                                mem_read <= "00";
306
                                                sig_read <= '0';
307
                                        when "110" =>                           -- ORI
308
                                                reg_write <= '1';
309
                                                alu_src1 <= '0';
310
                                                alu_src2 <= "001";
311
                                                alu_op <= "0001";
312
                                                jump <= "00";
313
                                                branch <= "000";
314
                                                mem_write <= "00";
315
                                                mem_read <= "00";
316
                                                sig_read <= '0';
317
                                        when "111" =>                           -- ANDI
318
                                                reg_write <= '1';
319
                                                alu_src1 <= '0';
320
                                                alu_src2 <= "001";
321
                                                alu_op <= "0000";
322
                                                jump <= "00";
323
                                                branch <= "000";
324
                                                mem_write <= "00";
325
                                                mem_read <= "00";
326
                                                sig_read <= '0';
327
                                        when "001" =>                           -- SLLI
328
                                                reg_write <= '1';
329
                                                alu_src1 <= '0';
330
                                                alu_src2 <= "100";
331
                                                alu_op <= "1001";
332
                                                jump <= "00";
333
                                                branch <= "000";
334
                                                mem_write <= "00";
335
                                                mem_read <= "00";
336
                                                sig_read <= '0';
337
                                        when "101" =>
338
                                                case funct7 is
339
                                                        when "0000000" =>       -- SRLI
340
                                                                reg_write <= '1';
341
                                                                alu_src1 <= '0';
342
                                                                alu_src2 <= "100";
343
                                                                alu_op <= "1010";
344
                                                                jump <= "00";
345
                                                                branch <= "000";
346
                                                                mem_write <= "00";
347
                                                                mem_read <= "00";
348
                                                                sig_read <= '0';
349
                                                        when "0100000" =>       -- SRAI
350
                                                                reg_write <= '1';
351
                                                                alu_src1 <= '0';
352
                                                                alu_src2 <= "100";
353
                                                                alu_op <= "1100";
354
                                                                jump <= "00";
355
                                                                branch <= "000";
356
                                                                mem_write <= "00";
357
                                                                mem_read <= "00";
358
                                                                sig_read <= '0';
359
                                                        when others =>
360
                                                                reg_write <= '0';
361
                                                                alu_src1 <= '0';
362
                                                                alu_src2 <= "000";
363
                                                                alu_op <= "0000";
364
                                                                jump <= "00";
365
                                                                branch <= "000";
366
                                                                mem_write <= "00";
367
                                                                mem_read <= "00";
368
                                                                sig_read <= '0';
369
                                                end case;
370
                                        when others =>
371
                                                reg_write <= '0';
372
                                                alu_src1 <= '0';
373
                                                alu_src2 <= "000";
374
                                                alu_op <= "0000";
375
                                                jump <= "00";
376
                                                branch <= "000";
377
                                                mem_write <= "00";
378
                                                mem_read <= "00";
379
                                                sig_read <= '0';
380
                                end case;
381
                        when "0110011" =>                                       -- computation
382
                                case funct3 is
383
                                        when "000" =>
384
                                                case funct7 is
385
                                                        when "0000000" =>       -- ADD
386
                                                                reg_write <= '1';
387
                                                                alu_src1 <= '0';
388
                                                                alu_src2 <= "101";
389
                                                                alu_op <= "0100";
390
                                                                jump <= "00";
391
                                                                branch <= "000";
392
                                                                mem_write <= "00";
393
                                                                mem_read <= "00";
394
                                                                sig_read <= '0';
395
                                                        when "0100000" =>       -- SUB
396
                                                                reg_write <= '1';
397
                                                                alu_src1 <= '0';
398
                                                                alu_src2 <= "101";
399
                                                                alu_op <= "0101";
400
                                                                jump <= "00";
401
                                                                branch <= "000";
402
                                                                mem_write <= "00";
403
                                                                mem_read <= "00";
404
                                                                sig_read <= '0';
405
                                                        when others =>
406
                                                                reg_write <= '0';
407
                                                                alu_src1 <= '0';
408
                                                                alu_src2 <= "000";
409
                                                                alu_op <= "0000";
410
                                                                jump <= "00";
411
                                                                branch <= "000";
412
                                                                mem_write <= "00";
413
                                                                mem_read <= "00";
414
                                                                sig_read <= '0';
415
                                                end case;
416
                                        when "001" =>                           -- SLL
417
                                                reg_write <= '1';
418
                                                alu_src1 <= '0';
419
                                                alu_src2 <= "101";
420
                                                alu_op <= "1001";
421
                                                jump <= "00";
422
                                                branch <= "000";
423
                                                mem_write <= "00";
424
                                                mem_read <= "00";
425
                                                sig_read <= '0';
426
                                        when "010" =>                           -- SLT
427
                                                reg_write <= '1';
428
                                                alu_src1 <= '0';
429
                                                alu_src2 <= "101";
430
                                                alu_op <= "0111";
431
                                                jump <= "00";
432
                                                branch <= "000";
433
                                                mem_write <= "00";
434
                                                mem_read <= "00";
435
                                                sig_read <= '0';
436
                                        when "011" =>                           -- SLTU
437
                                                reg_write <= '1';
438
                                                alu_src1 <= '0';
439
                                                alu_src2 <= "101";
440
                                                alu_op <= "1000";
441
                                                jump <= "00";
442
                                                branch <= "000";
443
                                                mem_write <= "00";
444
                                                mem_read <= "00";
445
                                                sig_read <= '0';
446
                                        when "100" =>                           -- XOR
447
                                                reg_write <= '1';
448
                                                alu_src1 <= '0';
449
                                                alu_src2 <= "101";
450
                                                alu_op <= "0010";
451
                                                jump <= "00";
452
                                                branch <= "000";
453
                                                mem_write <= "00";
454
                                                mem_read <= "00";
455
                                                sig_read <= '0';
456
                                        when "101" =>
457
                                                case funct7 is
458
                                                        when "0000000" =>       -- SRL
459
                                                                reg_write <= '1';
460
                                                                alu_src1 <= '0';
461
                                                                alu_src2 <= "101";
462
                                                                alu_op <= "1010";
463
                                                                jump <= "00";
464
                                                                branch <= "000";
465
                                                                mem_write <= "00";
466
                                                                mem_read <= "00";
467
                                                                sig_read <= '0';
468
                                                        when "0100000" =>       -- SRA
469
                                                                reg_write <= '1';
470
                                                                alu_src1 <= '0';
471
                                                                alu_src2 <= "101";
472
                                                                alu_op <= "1100";
473
                                                                jump <= "00";
474
                                                                branch <= "000";
475
                                                                mem_write <= "00";
476
                                                                mem_read <= "00";
477
                                                                sig_read <= '0';
478
                                                        when others =>
479
                                                                reg_write <= '0';
480
                                                                alu_src1 <= '0';
481
                                                                alu_src2 <= "000";
482
                                                                alu_op <= "0000";
483
                                                                jump <= "00";
484
                                                                branch <= "000";
485
                                                                mem_write <= "00";
486
                                                                mem_read <= "00";
487
                                                                sig_read <= '0';
488
                                                end case;
489
                                        when "110" =>                           -- OR
490
                                                reg_write <= '1';
491
                                                alu_src1 <= '0';
492
                                                alu_src2 <= "101";
493
                                                alu_op <= "0001";
494
                                                jump <= "00";
495
                                                branch <= "000";
496
                                                mem_write <= "00";
497
                                                mem_read <= "00";
498
                                                sig_read <= '0';
499
                                        when "111" =>                           -- AND
500
                                                reg_write <= '1';
501
                                                alu_src1 <= '0';
502
                                                alu_src2 <= "101";
503
                                                alu_op <= "0000";
504
                                                jump <= "00";
505
                                                branch <= "000";
506
                                                mem_write <= "00";
507
                                                mem_read <= "00";
508
                                                sig_read <= '0';
509
                                        when others =>
510
                                                reg_write <= '0';
511
                                                alu_src1 <= '0';
512
                                                alu_src2 <= "000";
513
                                                alu_op <= "0000";
514
                                                jump <= "00";
515
                                                branch <= "000";
516
                                                mem_write <= "00";
517
                                                mem_read <= "00";
518
                                                sig_read <= '0';
519
                                end case;
520
                        when "1110011" =>                                       -- SYSTEM
521
                                reg_write <= '0';
522
                                alu_src1 <= '0';
523
                                alu_src2 <= "000";
524
                                alu_op <= "0000";
525
                                jump <= "00";
526
                                branch <= "111";
527
                                mem_write <= "00";
528
                                mem_read <= "00";
529
                                sig_read <= '0';
530
                        when others =>
531
                                reg_write <= '0';
532
                                alu_src1 <= '0';
533
                                alu_src2 <= "000";
534
                                alu_op <= "0000";
535
                                jump <= "00";
536
                                branch <= "000";
537
                                mem_write <= "00";
538
                                mem_read <= "00";
539
                                sig_read <= '0';
540
                end case;
541
        end process;
542
end arch_control;
543
 

powered by: WebSVN 2.1.0

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