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

Subversion Repositories copyblaze

[/] [copyblaze/] [trunk/] [copyblaze/] [rtl/] [vhdl/] [cpu/] [cp_copyBlaze.vhd] - Blame information for rev 57

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ameziti
--------------------------------------------------------------------------------
2
-- Company: 
3
--
4
-- File: cp_copyBlaze.vhd
5
--
6
-- Description:
7
--      projet copyblaze
8
--      copyBlaze processor
9
--
10
-- File history:
11
-- v1.0: 10/10/11: Creation
12
-- v1.1: 24/10/11: Add the "Decode & Control" module
13
--
14
-- Targeted device: ProAsic A3P250 VQFP100
15
-- Author: AbdAllah Meziti
16
--------------------------------------------------------------------------------
17
 
18
library ieee;
19
use ieee.std_logic_1164.all;
20
use ieee.numeric_std.all;
21
 
22
use     work.Usefull_Pkg.all;           -- Usefull Package
23
 
24
--------------------------------------------------------------------------------
25
-- Entity: cp_copyBlaze
26
--
27
-- Description:
28
--      
29
--      REMARQUE:
30
--
31
--      
32
-- History:
33
-- 10/10/11 AM: Creation
34
-- ---------------------
35
-- xx/xx/xx AM: 
36
--                              
37
--------------------------------------------------------------------------------
38
entity cp_copyBlaze is
39
        generic
40
        (
41
                GEN_WIDTH_DATA          : positive := 8;
42
                GEN_WIDTH_PC            : positive := 10;
43
                GEN_WIDTH_INST          : positive := 18;
44
 
45
                GEN_DEPTH_STACK         : positive := 15;       -- Taille (en octet) de la Stack
46
                GEN_DEPTH_BANC          : positive := 16;       -- Taille (en octet) du Banc Register
47
                GEN_DEPTH_SCRATCH       : positive := 64;       -- Taille (en octet) du Scratch Pad
48
 
49
                GEN_INT_VECTOR          : std_ulogic_vector(11 downto 0) := x"3FF" -- Interrupt Vector
50
        );
51
        port (
52
        --------------------------------------------------------------------------------
53
        -- Signaux Systeme
54
        --------------------------------------------------------------------------------
55
                Clk_i                           : in std_ulogic;        --      signal d'horloge générale
56
                Rst_i_n                         : in std_ulogic;        --      signal de reset générale
57
 
58
        --------------------------------------------------------------------------------
59
        -- Signaux Fonctionels
60
        --------------------------------------------------------------------------------
61
                Address_o                       : out std_ulogic_vector(GEN_WIDTH_PC-1 downto 0);
62
                Instruction_i           : in std_ulogic_vector(GEN_WIDTH_INST-1 downto 0);
63
 
64
                Interrupt_i                     : in std_ulogic;        -- 
65
                Interrupt_Ack_o         : out std_ulogic;       -- 
66
 
67
                IN_PORT_i                       : in std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);       -- 
68
                OUT_PORT_o                      : out std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);      -- 
69
                PORT_ID_o                       : out std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);      -- 
70
                READ_STROBE_o           : out std_ulogic;
71
                WRITE_STROBE_o          : out std_ulogic;
72
 
73
        --------------------------------------------------------------------------------
74
        -- Signaux Speciaux
75
        --------------------------------------------------------------------------------
76
                Freeze_i                        : in std_ulogic;
77
 
78
        --------------------------------------------------------------------------------
79
        -- Signaux Wishbone Interface
80
        --------------------------------------------------------------------------------
81 8 ameziti
--              RST_I                           : in    std_ulogic;
82 2 ameziti
--              CLK_I                           : in    std_ulogic;
83
 
84
                ADR_O                           : out   std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);
85
                DAT_I                           : in    std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);
86
                DAT_O                           : out   std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);
87
                WE_O                            : out   std_ulogic;
88
                SEL_O                           : out   std_ulogic_vector(1 downto 0);
89
 
90
                STB_O                           : out   std_ulogic;
91
                ACK_I                           : in    std_ulogic;
92 8 ameziti
                CYC_O                           : out   std_ulogic
93 2 ameziti
        );
94
end cp_copyBlaze;
95
 
96
--------------------------------------------------------------------------------
97
-- Architecture: RTL
98
-- of entity : cp_copyBlaze
99
--------------------------------------------------------------------------------
100
architecture rtl of cp_copyBlaze is
101
 
102
        --------------------------------------------------------------------------------
103
        -- Définition des fonctions
104
        --------------------------------------------------------------------------------
105
 
106
 
107
 
108
        --------------------------------------------------------------------------------
109
        -- Définition des constantes
110
        --------------------------------------------------------------------------------
111
 
112
        --------------------------------------------------------------------------------
113
        -- Définition des signaux interne
114
        --------------------------------------------------------------------------------
115
        signal  iPhase1                         : std_ulogic;
116
        signal  iPhase2                         : std_ulogic;
117
 
118
        -- **** --
119
        -- PATH --
120
        -- **** --
121
        signal  iaaa                            : std_ulogic_vector(GEN_WIDTH_PC-1 downto 0)                     ;
122
        signal  ikk                                     : std_ulogic_vector(7 downto 0)                                                  ;
123
        signal  iss                                     : std_ulogic_vector(log2(GEN_DEPTH_SCRATCH)-1 downto 0)  ;
124
        signal  ipp                                     : std_ulogic_vector(7 downto 0)                                                  ;
125
 
126
        -- Flags
127
        signal  iZ                                      : std_ulogic;
128
        signal  iC                                      : std_ulogic;
129
        signal  iZi                                     : std_ulogic;
130
        signal  iCi                                     : std_ulogic;
131
 
132
        -- Alu
133
        signal  iAluResult                      : std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);
134
        -- Banc
135
        signal  iSxDataIn                       : std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);
136
        signal  iSxData                         : std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);
137
        signal  iSyData                         : std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);
138
        signal  iSxPtr                          : std_ulogic_vector(log2(GEN_DEPTH_BANC)-1 downto 0);
139
        signal  iSyPtr                          : std_ulogic_vector(log2(GEN_DEPTH_BANC)-1 downto 0);
140
        -- Scratch
141
        signal  iScratchPtr                     : std_ulogic_vector(log2(GEN_DEPTH_SCRATCH)-1 downto 0);
142
        signal  iScratchDataOut         : std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);
143
 
144
        -- ******* --
145
        -- CONTROL --
146
        -- ******* --
147
        -- Banc
148 8 ameziti
        signal  iBancWriteOP            ,
149
                        iBancWrite                      : std_ulogic;
150 2 ameziti
        -- Scratch
151
        signal  iScratchWrite           : std_ulogic;
152
        signal  iFetch                          : std_ulogic;
153
        signal  iInput                          : std_ulogic;
154
        signal  iOuput                          : std_ulogic;
155
 
156
        -- Alu
157
        signal  iOperationSelect        : std_ulogic_vector(2 downto 0);
158
        signal  iOperandSelect          : std_ulogic;
159
 
160
        signal  iArithOper                      : std_ulogic_vector(1 downto 0);
161
        signal  iLogicOper                      : std_ulogic_vector(1 downto 0);
162
        signal  iShiftBit                       : std_ulogic_vector(2 downto 0);
163
        signal  iShiftSens                      : std_ulogic                               ;
164
        -- Flags
165
        signal  iFlagsWrite                     ,
166
                        iFlagsPush                      ,
167
                        iFlagsPop                       : std_ulogic;
168
 
169
        -- Flow
170
        signal  iConditionCtrl          : std_ulogic_vector(2 downto 0);
171
        signal  iJump                           ,
172
                        iCall                           ,
173
                        iReturn                         ,
174
                        iReturnI                        : std_ulogic;
175
        signal  iPcEnable                       : std_ulogic;
176
 
177
        -- Int          
178
        signal  iIEvent                         : std_ulogic; -- Interrupt Event Flags
179
        signal  iIEWrite                        ,
180
                        iIEValue                        : std_ulogic;
181
 
182
        -- System
183
        signal  iFreeze                         : std_ulogic; -- Freeze the processor
184
 
185
        --------------------------------------------------------------------------------
186
        -- WISHBONE
187
        --------------------------------------------------------------------------------
188
        -- Signaux Wishbone Interface
189 8 ameziti
--      signal  iwbRST_I                        : std_ulogic;
190
--      signal  iwbCLK_I                        : std_ulogic;
191 2 ameziti
 
192
        signal  iwbADR_O                        : std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);
193 22 ameziti
        signal  iwbDAT_I                        ,
194
                        iwbDAT                          : std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);
195 2 ameziti
        signal  iwbDAT_O                        : std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);
196
        signal  iwbWE_O                         : std_ulogic;
197
        signal  iwbSEL_O                        : std_ulogic_vector(1 downto 0);
198
 
199
        signal  iwbSTB_O                        : std_ulogic;
200
        signal  iwbACK_I                        : std_ulogic;
201
        signal  iwbCYC                          : std_ulogic;
202
 
203
        -- Signaux de management du Wishbone
204
        signal  iWbWrSing                       : std_ulogic;   -- "Single Write Cycle" Wishbone instruction
205
        signal  iWbRdSing                       : std_ulogic;   -- "Single Read Cycle" Wishbone instruction
206
 
207 22 ameziti
        --signal        iWB_inst                : std_ulogic;   -- WB Instruction
208
        signal  iWB_validHandshake      : std_ulogic;   -- WB valid Handshake
209
        signal  iWB_validPC                     : std_ulogic;   -- WB valid PC increment
210
        signal  iWB_validOperand        : std_ulogic;   -- WB valid Operation
211 2 ameziti
 
212
--      -- Machine d'état
213
--      type wbStates_TYPE is
214
--      (
215
--              S_WB_RESET      ,
216
--              
217
--              S_WB_RD         ,
218
--              S_WB_RD_ACK     ,
219
--              
220
--              S_WB_WR         ,
221
--              S_WB_WR_ACK
222
--      );
223
--      signal  iWbFSM                          : wbStates_TYPE;
224
 
225
        --------------------------------------------------------------------------------
226
        -- Déclaration des composants
227
        --------------------------------------------------------------------------------
228
        component cp_Toggle
229
                port (
230
                --------------------------------------------------------------------------------
231
                -- Signaux Systeme
232
                --------------------------------------------------------------------------------
233
                        Clk_i                           : in std_ulogic;        --      signal d'horloge générale
234
                        Rst_i_n                         : in std_ulogic;        --      signal de reset générale
235
 
236
                --------------------------------------------------------------------------------
237
                -- Signaux Fonctionels
238
                --------------------------------------------------------------------------------
239
                        Freeze_i                        : in std_ulogic;
240
 
241
                        Phase1_o                        : out std_ulogic;
242
                        Phase2_o                        : out std_ulogic
243
                );
244
        end component;
245
 
246
        component cp_Interrupt
247
                port (
248
                --------------------------------------------------------------------------------
249
                -- Signaux Systeme
250
                --------------------------------------------------------------------------------
251
                        Clk_i                           : in std_ulogic;        --      signal d'horloge générale
252
                        Rst_i_n                         : in std_ulogic;        --      signal de reset générale
253
 
254
                --------------------------------------------------------------------------------
255
                -- Signaux Fonctionels
256
                --------------------------------------------------------------------------------
257
                        IEWrite_i                       : in std_ulogic;
258
                        IEValue_i                       : in std_ulogic;
259
 
260
                        --Phase1_i                      : in std_ulogic;
261
                        Phase2_i                        : in std_ulogic;
262
 
263
                        Interrupt_i                     : in std_ulogic;
264
                        IEvent_o                        : out std_ulogic
265
                );
266
        end component;
267
 
268
        component cp_ProgramFlowControl
269
                generic
270
                (
271
                        GEN_WIDTH_PC            : positive := 8;
272
                        GEN_INT_VECTOR          : std_ulogic_vector(11 downto 0) := x"0F0";
273
                        GEN_DEPTH_STACK         : positive := 15
274
                );
275
                port (
276
                --------------------------------------------------------------------------------
277
                -- Signaux Systeme
278
                --------------------------------------------------------------------------------
279
                        Clk_i                           : in std_ulogic;        --      signal d'horloge générale
280
                        Rst_i_n                         : in std_ulogic;        --      signal de reset générale
281
 
282
                        Enable_i                        : in std_ulogic;
283
                --------------------------------------------------------------------------------
284
                -- Signaux Fonctionels
285
                --------------------------------------------------------------------------------
286
                        aaa_i                           : in std_ulogic_vector(GEN_WIDTH_PC-1 downto 0); -- 
287
 
288
                        Interrupt_i                     : in std_ulogic;        -- 
289
 
290
                        Jump_i                          : in std_ulogic;
291
                        Call_i                          : in std_ulogic;
292
                        Return_i                        : in std_ulogic;
293
                        ReturnI_i                       : in std_ulogic;
294
 
295
                        ConditionCtrl_i         : in std_ulogic_vector(2 downto 0);
296
                        FlagC_i                         : in std_ulogic;
297
                        FlagZ_i                         : in std_ulogic;
298
 
299
                        PC_o                            : out std_ulogic_vector(GEN_WIDTH_PC-1 downto 0) -- 
300
                );
301
        end component;
302
 
303
        component cp_Alu
304
                generic
305
                (
306
                        GEN_WIDTH_DATA          : positive := 8
307
                );
308
                port (
309
                --------------------------------------------------------------------------------
310
                -- Signaux Fonctionels
311
                --------------------------------------------------------------------------------
312
                        OperationSelect_i       : in std_ulogic_vector(2 downto 0);
313
 
314
                        LogicOper_i                     : in std_ulogic_vector(1 downto 0);
315
                        ArithOper_i                     : in std_ulogic_vector(1 downto 0);
316
 
317
                        OperandSelect_i         : in std_ulogic;
318
 
319
                        CY_i                            : in std_ulogic;
320
                        sX_i                            : in std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);       -- 
321
                        sY_i                            : in std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);       -- 
322
                        kk_i                            : in std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);       -- 
323
 
324
                        ShiftBit_i                      : in std_ulogic_vector( 2 downto 0 );
325
                        ShiftSens_i                     : in std_ulogic;
326
 
327
                        Result_o                        : out std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);      -- 
328
                        C_o                                     : out std_ulogic;
329
                        Z_o                                     : out std_ulogic
330
                );
331
        end component;
332
 
333
        component cp_Flags
334
                port (
335
                --------------------------------------------------------------------------------
336
                -- Signaux Systeme
337
                --------------------------------------------------------------------------------
338
                        Clk_i                           : in std_ulogic;        --      signal d'horloge générale
339
                        Rst_i_n                         : in std_ulogic;        --      signal de reset générale
340
 
341
                --------------------------------------------------------------------------------
342
                -- Signaux Fonctionels
343
                --------------------------------------------------------------------------------
344
                        Z_i                                     : in std_ulogic;
345
                        C_i                                     : in std_ulogic;
346
 
347
                        Z_o                                     : out std_ulogic;
348
                        C_o                                     : out std_ulogic;
349
 
350
                        Push_i                          : in std_ulogic;
351
                        Pop_i                           : in std_ulogic;
352
 
353
                        Write_i                         : in std_ulogic
354
                );
355
        end component;
356
 
357
        component cp_BancRegister
358
                generic
359
                (
360
                        GEN_WIDTH_DATA          : positive := 8;
361
                        GEN_DEPTH_BANC          : positive := 16
362
                );
363
                port (
364
                --------------------------------------------------------------------------------
365
                -- Signaux Systeme
366
                --------------------------------------------------------------------------------
367
                        Clk_i                           : in std_ulogic;        --      signal d'horloge générale
368
                        Rst_i_n                         : in std_ulogic;        --      signal de reset générale
369
 
370
                --------------------------------------------------------------------------------
371
                -- Signaux Fonctionels
372
                --------------------------------------------------------------------------------
373
                        SxPtr_i                         : in std_ulogic_vector(log2(GEN_DEPTH_BANC)-1 downto 0);
374
                        SyPtr_i                         : in std_ulogic_vector(log2(GEN_DEPTH_BANC)-1 downto 0);
375
 
376
                        Write_i                         : in std_ulogic;
377
                        SxData_i                        : in std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);       -- 
378
 
379
                        SxData_o                        : out std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);      -- 
380
                        SyData_o                        : out std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0)
381
 
382
                );
383
        end component;
384
 
385
        component cp_ScratchPad
386
                generic
387
                (
388
                        GEN_WIDTH_DATA          : positive := 8;
389
                        GEN_DEPTH_SCRATCH       : positive := 64
390
                );
391
                port (
392
                --------------------------------------------------------------------------------
393
                -- Signaux Systeme
394
                --------------------------------------------------------------------------------
395
                        Clk_i                           : in std_ulogic;        --      signal d'horloge générale
396
                        Rst_i_n                         : in std_ulogic;        --      signal de reset générale
397
 
398
                --------------------------------------------------------------------------------
399
                -- Signaux Fonctionels
400
                --------------------------------------------------------------------------------
401
                        Ptr_i                           : in std_ulogic_vector(log2(GEN_DEPTH_SCRATCH)-1 downto 0);
402
 
403
                        Write_i                         : in std_ulogic;
404
                        Data_i                          : in std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0);       -- 
405
 
406
                        Data_o                          : out std_ulogic_vector(GEN_WIDTH_DATA-1 downto 0)
407
 
408
                );
409
        end component;
410
 
411
        component cp_DecodeControl
412
                generic
413
                (
414
                        GEN_WIDTH_INST          : positive := 18;
415
                        GEN_WIDTH_PC            : positive := 10;
416
 
417
                        GEN_DEPTH_BANC          : positive := 16;       -- Taille (en octet) du Banc Register
418
                        GEN_DEPTH_SCRATCH       : positive := 64        -- Taille (en octet) du Scratch Pad
419
                );
420
                port (
421
                --------------------------------------------------------------------------------
422
                -- Signaux Fonctionels
423
                --------------------------------------------------------------------------------
424
                        --Phase1_i                      : in std_ulogic;
425
                        Phase2_i                        : in std_ulogic;
426
 
427
                        IEvent_i                        : in std_ulogic;
428
 
429
                        Instruction_i           : in std_ulogic_vector(GEN_WIDTH_INST-1 downto 0);
430
 
431
                        Fetch_o                         : out std_ulogic;
432
                        Input_o                         : out std_ulogic;
433
                        Ouput_o                         : out std_ulogic;
434
                        Jump_o                          : out std_ulogic;
435
                        Call_o                          : out std_ulogic;
436
                        Return_o                        : out std_ulogic;
437
                        ReturnI_o                       : out std_ulogic;
438
                        IEWrite_o                       : out std_ulogic;
439
                        BancWrite_o                     : out std_ulogic;
440
                        ScratchWrite_o          : out std_ulogic;
441
                        OperationSelect_o       : out std_ulogic_vector(2 downto 0);
442
                        FlagsWrite_o            : out std_ulogic;
443
                        FlagsPush_o                     : out std_ulogic;
444
                        FlagsPop_o                      : out std_ulogic;
445
 
446
                        aaa_o                           : out std_ulogic_vector(GEN_WIDTH_PC-1 downto 0);
447
                        kk_o                            : out std_ulogic_vector(7 downto 0);
448
                        ss_o                            : out std_ulogic_vector(log2(GEN_DEPTH_SCRATCH)-1 downto 0);
449
                        pp_o                            : out std_ulogic_vector(7 downto 0);
450
 
451
                        SxPtr_o                         : out std_ulogic_vector(log2(GEN_DEPTH_BANC)-1 downto 0);
452
                        SyPtr_o                         : out std_ulogic_vector(log2(GEN_DEPTH_BANC)-1 downto 0);
453
 
454
                        OperandSelect_o         : out std_ulogic;
455
 
456
                        ArithOper_o                     : out std_ulogic_vector(1 downto 0);
457
                        LogicOper_o                     : out std_ulogic_vector(1 downto 0);
458
                        ShiftBit_o                      : out std_ulogic_vector(2 downto 0);
459
                        ShiftSens_o                     : out std_ulogic;
460
 
461
                        ConditionCtrl_o         : out std_ulogic_vector(2 downto 0);
462
 
463
                        IEValue_o                       : out std_ulogic;
464
 
465
                        wbRdSing_o                      : out std_ulogic;
466
                        wbWrSing_o                      : out std_ulogic
467
 
468
                );
469
        end component;
470
 
471
begin
472
        U_Toggle : cp_Toggle
473
                port map(
474
                --------------------------------------------------------------------------------
475
                -- Signaux Systeme
476
                --------------------------------------------------------------------------------
477
                        Clk_i                           => Clk_i,
478
                        Rst_i_n                         => Rst_i_n,
479
 
480
                --------------------------------------------------------------------------------
481
                -- Signaux Fonctionels
482
                --------------------------------------------------------------------------------
483
                        Freeze_i                        => iFreeze ,
484
 
485
                        Phase1_o                        => iPhase1 ,
486
                        Phase2_o                        => iPhase2
487
                );
488
 
489
        U_Interrupt : cp_Interrupt
490
                port map(
491
                --------------------------------------------------------------------------------
492
                -- Signaux Systeme
493
                --------------------------------------------------------------------------------
494
                        Clk_i                           => Clk_i,
495
                        Rst_i_n                         => Rst_i_n,
496
 
497
                --------------------------------------------------------------------------------
498
                -- Signaux Fonctionels
499
                --------------------------------------------------------------------------------
500
                        IEWrite_i                       => iIEWrite,
501
                        IEValue_i                       => iIEValue,
502
 
503
                        --Phase1_i                      => iPhase1,
504
                        Phase2_i                        => iPhase2,
505
 
506
                        Interrupt_i                     => Interrupt_i,
507
                        IEvent_o                        => iIEvent
508
                );
509
 
510
        U_ProgramFlowControl : cp_ProgramFlowControl
511
                generic map
512
                (
513
                        GEN_WIDTH_PC            => GEN_WIDTH_PC,
514
                        GEN_INT_VECTOR          => GEN_INT_VECTOR,
515
                        GEN_DEPTH_STACK         => GEN_DEPTH_STACK
516
                )
517
                port map(
518
                --------------------------------------------------------------------------------
519
                -- Signaux Systeme
520
                --------------------------------------------------------------------------------
521
                        Clk_i                           => Clk_i,
522
                        Rst_i_n                         => Rst_i_n,
523
 
524
                        Enable_i                        => iPcEnable, --iPhase1,
525
                --------------------------------------------------------------------------------
526
                -- Signaux Fonctionels
527
                --------------------------------------------------------------------------------
528
                        aaa_i                           => iaaa,
529
 
530
                        Interrupt_i                     => iIEvent,--'0', -- '0' when substitue the IEvent by a "Call ISR" instruction
531
 
532
                        Jump_i                          => iJump,
533
                        Call_i                          => iCall,
534
                        Return_i                        => iReturn,
535
                        ReturnI_i                       => iReturnI,
536
 
537
                        ConditionCtrl_i         => iConditionCtrl,
538
                        FlagC_i                         => iC,
539
                        FlagZ_i                         => iZ,
540
 
541
                        PC_o                            => Address_o
542
                );
543
 
544
        U_ALU : cp_Alu
545
                generic map
546
                (
547
                        GEN_WIDTH_DATA          => GEN_WIDTH_DATA
548
                )
549
                port map(
550
                --------------------------------------------------------------------------------
551
                -- Signaux Fonctionels
552
                --------------------------------------------------------------------------------
553
                        OperationSelect_i       => iOperationSelect,
554
 
555
                        LogicOper_i                     => iLogicOper,
556
                        ArithOper_i                     => iArithOper,
557
 
558
                        OperandSelect_i         => iOperandSelect,
559
 
560
                        CY_i                            => iC,
561
                        sX_i                            => iSxData,
562
                        sY_i                            => iSyData,
563
                        kk_i                            => ikk,
564
 
565
                        ShiftBit_i                      => iShiftBit,
566
                        ShiftSens_i                     => iShiftSens,
567
 
568
                        Result_o                        => iAluResult,
569
                        C_o                                     => iCi,
570
                        Z_o                                     => iZi
571
                );
572
 
573
        U_Flags : cp_Flags
574
                port map(
575
                --------------------------------------------------------------------------------
576
                -- Signaux Systeme
577
                --------------------------------------------------------------------------------
578
                        Clk_i                           => Clk_i,
579
                        Rst_i_n                         => Rst_i_n,
580
 
581
                --------------------------------------------------------------------------------
582
                -- Signaux Fonctionels
583
                --------------------------------------------------------------------------------
584
                        Z_i                                     => iZi,
585
                        C_i                                     => iCi,
586
 
587
                        Z_o                                     => iZ,
588
                        C_o                                     => iC,
589
 
590
                        Push_i                          => iFlagsPush,
591
                        Pop_i                           => iFlagsPop,
592
 
593
                        Write_i                         => iFlagsWrite
594
                );
595
 
596
        U_BancRegister : cp_BancRegister
597
                generic map
598
                (
599
                        GEN_WIDTH_DATA          => GEN_WIDTH_DATA,
600
                        GEN_DEPTH_BANC          => GEN_DEPTH_BANC
601
                )
602
                port map(
603
                --------------------------------------------------------------------------------
604
                -- Signaux Systeme
605
                --------------------------------------------------------------------------------
606
                        Clk_i                           => Clk_i,
607
                        Rst_i_n                         => Rst_i_n,
608
 
609
                --------------------------------------------------------------------------------
610
                -- Signaux Fonctionels
611
                --------------------------------------------------------------------------------
612
                        SxPtr_i                         => iSxPtr,
613
                        SyPtr_i                         => iSyPtr,
614
 
615
                        Write_i                         => iBancWrite,
616
                        SxData_i                        => iSxDataIn,
617
 
618
                        SxData_o                        => iSxData,
619
                        SyData_o                        => iSyData
620
                );
621
 
622
        U_ScratchPad : cp_ScratchPad
623
                generic map
624
                (
625
                        GEN_WIDTH_DATA          => GEN_WIDTH_DATA,
626
                        GEN_DEPTH_SCRATCH       => GEN_DEPTH_SCRATCH
627
                )
628
                port map(
629
                --------------------------------------------------------------------------------
630
                -- Signaux Systeme
631
                --------------------------------------------------------------------------------
632
                        Clk_i                           => Clk_i,
633
                        Rst_i_n                         => Rst_i_n,
634
 
635
                --------------------------------------------------------------------------------
636
                -- Signaux Fonctionels
637
                --------------------------------------------------------------------------------
638
                        Ptr_i                           => iScratchPtr,
639
 
640
                        Write_i                         => iScratchWrite,
641
                        Data_i                          => iSxData,
642
 
643
                        Data_o                          => iScratchDataOut
644
                );
645
 
646
        U_DecodeControl : cp_DecodeControl
647
                generic map
648
                (
649
                        GEN_WIDTH_INST          => GEN_WIDTH_INST,
650
                        GEN_WIDTH_PC            => GEN_WIDTH_PC,
651
 
652
                        GEN_DEPTH_BANC          => GEN_DEPTH_BANC,
653
                        GEN_DEPTH_SCRATCH       => GEN_DEPTH_SCRATCH
654
                )
655
                port map(
656
                --------------------------------------------------------------------------------
657
                -- Signaux Fonctionels
658
                --------------------------------------------------------------------------------
659
                        --Phase1_i                      : in std_ulogic;
660
                        Phase2_i                        => iPhase2,
661
 
662
                        IEvent_i                        => iIEvent,
663
 
664
                        Instruction_i           => Instruction_i,
665
 
666
                        Fetch_o                         => iFetch,
667
                        Input_o                         => iInput,
668
                        Ouput_o                         => iOuput,
669
                        Jump_o                          => iJump,
670
                        Call_o                          => iCall,
671
                        Return_o                        => iReturn,
672
                        ReturnI_o                       => iReturnI,
673
                        IEWrite_o                       => iIEWrite,
674 8 ameziti
                        BancWrite_o                     => iBancWriteOP,
675 2 ameziti
                        ScratchWrite_o          => iScratchWrite,
676
                        OperationSelect_o       => iOperationSelect,
677
                        FlagsWrite_o            => iFlagsWrite,
678
                        FlagsPush_o                     => iFlagsPush,
679
                        FlagsPop_o                      => iFlagsPop,
680
 
681
                        aaa_o                           => iaaa,
682
                        kk_o                            => ikk,
683
                        ss_o                            => iss,
684
                        pp_o                            => ipp,
685
 
686
                        SxPtr_o                         => iSxPtr,
687
                        SyPtr_o                         => iSyPtr,
688
 
689
                        OperandSelect_o         => iOperandSelect,
690
 
691
                        ArithOper_o                     => iArithOper,
692
                        LogicOper_o                     => iLogicOper,
693
                        ShiftBit_o                      => iShiftBit,
694
                        ShiftSens_o                     => iShiftSens,
695
 
696
                        ConditionCtrl_o         => iConditionCtrl,
697
 
698
                        IEValue_o                       => iIEValue,
699
 
700
                        wbRdSing_o                      => iWbRdSing,
701
                        wbWrSing_o                      => iWbWrSing
702
 
703
                );
704
 
705
        -- **** --
706
        -- PATH --
707
        -- **** --
708
        -- Banc --
709
        iSxDataIn               <=      iScratchDataOut when ( iFetch = '1' ) else
710
                                                IN_PORT_i               when ( iInput = '1' ) else
711 22 ameziti
                                                iwbDAT                  when ( iWbRdSing = '1') else
712 2 ameziti
                                                iAluResult              ;
713 8 ameziti
 
714 22 ameziti
        iBancWrite              <=      iWB_validOperand                        when ( iWbRdSing = '1') else
715 8 ameziti
                                                iBancWriteOP    ;
716
 
717 2 ameziti
        -- Scratch --
718
        iScratchPtr             <=      iSyData(iScratchPtr'range)      when ( iOperandSelect = '1' ) else
719
                                                iss;
720
 
721
 
722
        --------------------------------------------------------------------------------
723
        -- Outputs
724
        --------------------------------------------------------------------------------
725
 
726
        -- TODO : Take care when the "iIE" bit is not set. In this case how to manage "Interrupt_Ack_o" !!!
727
        Interrupt_Ack_o <=      ((iPhase2) and (iIEvent));
728
 
729
        OUT_PORT_o              <=      iSxData;
730
        PORT_ID_o               <=      iSyData                                         when ( iOperandSelect = '1' ) else
731
                                                ipp             ;
732
        READ_STROBE_o   <=      ((iPhase2) and (iInput));
733
        WRITE_STROBE_o  <=      ((iPhase2) and (iOuput));
734
 
735
        --------------------------------------------------------------------------------
736
        -- System
737
        --------------------------------------------------------------------------------
738
        iFreeze                 <=      Freeze_i;
739
 
740
        -- Evolution of the PC:
741
        -- condition : in Phase1 and the processor is not in stall by wishbone
742
        --iPcEnable             <=      (iPhase1 and not(iwbStall));
743 22 ameziti
        iPcEnable               <=      ((iPhase1) and (iWB_validHandshake)) when (iwbCYC='1') else
744 2 ameziti
                                                (iPhase1);
745
 
746
        --------------------------------------------------------------------------------
747
        -- WISHBONE
748
        --------------------------------------------------------------------------------
749 12 ameziti
        -- =================== --
750
        -- Wishbone Management --
751
        -- =================== --
752 14 ameziti
        --iWB_inst      <=      iWbRdSing or iWbWrSing; -- wishbone instruction
753 22 ameziti
        iWB_validHandshake              <=      iwbCYC and iwbACK_I;    -- wishbone VALID ACKNOWLEDGE
754 2 ameziti
 
755 12 ameziti
        -- Valid PC write --
756
        -- ************** --
757 22 ameziti
        iWB_validPC     <=      ((iPhase1) and (iWB_validHandshake));   -- Valid PC incremente
758 12 ameziti
 
759 14 ameziti
        -- Then Valid Operand Read/Write
760 12 ameziti
        -- ************************** --
761 2 ameziti
        wbvOp_Proc : process (Rst_i_n, Clk_i)
762
        begin
763
                if ( Rst_i_n = '0' ) then
764 22 ameziti
                        iWB_validOperand <=     '0';
765
                        iwbDAT                  <= (others => '0');
766 2 ameziti
                elsif ( rising_edge(Clk_i) ) then
767 22 ameziti
                        iWB_validOperand <=     iWB_validPC;                    -- Valid Operand Read/Write
768
                        if ( iWB_validPC = '1' ) then
769
                                iwbDAT  <= iwbDAT_I;
770
                        end if;
771 2 ameziti
                end if;
772
        end process wbvOp_Proc;
773 12 ameziti
 
774
        -- CYCle determination --
775
        -- ******************* --
776 22 ameziti
        wbCYC_Proc : process (Rst_i_n, Clk_i, iPhase2, iWB_validOperand)
777 2 ameziti
        begin
778 14 ameziti
                -- reset or end of wishbone cycle : after wishbone Operand Validation
779 22 ameziti
                if ( ( Rst_i_n = '0' ) or ((iPhase2='1') and (iWB_validOperand='1')) ) then
780 2 ameziti
                        iwbCYC  <= '0';
781 14 ameziti
                -- valid a begining Wishbone Cycle: in Phase1 and wishbone instruction
782 12 ameziti
                elsif ( falling_edge(Clk_i) ) then
783
                        if ( (iPhase1='1') and ((iWbRdSing='1') or (iWbWrSing='1')) ) then
784
                                iwbCYC  <= '1';
785
                        end if;
786 2 ameziti
                end if;
787
        end process wbCYC_Proc;
788
 
789 12 ameziti
        -- ============== --
790
        -- Inputs/Outputs --
791
        -- ============== --
792
        --iwbRST_I              <= RST_I;
793
        --iwbCLK_I              <= CLK_I;
794
 
795 14 ameziti
        iwbSTB_O        <=      iwbCYC;
796
        iwbSEL_O        <=      (others => '0');
797 12 ameziti
 
798 14 ameziti
        ADR_O           <= iwbADR_O;
799
        iwbDAT_I        <= DAT_I;
800
        DAT_O           <= iwbDAT_O;
801
        WE_O            <= iwbWE_O  ;
802
        SEL_O           <= iwbSEL_O;
803
 
804
        STB_O           <= iwbSTB_O ;
805
        iwbACK_I        <= ACK_I;
806
        CYC_O           <= iwbCYC ;
807 12 ameziti
 
808 2 ameziti
        iwbWE_O         <= iWbWrSing;
809
        iwbDAT_O        <= iSxData;
810 19 ameziti
        iwbADR_O        <= iSyData              when ( iOperandSelect = '1' ) else
811
                                        ikk             ;
812 2 ameziti
 
813 19 ameziti
 
814 2 ameziti
end rtl;

powered by: WebSVN 2.1.0

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