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

Subversion Repositories copyblaze

[/] [copyblaze/] [trunk/] [copyblaze/] [rtl/] [vhdl/] [cpu/] [cp_ProgramFlowControl.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_ProgramFlowControl.vhd
5
--
6
-- Description:
7
--      projet copyblaze
8
--      Program Flow Control management
9
--
10
-- File history:
11
-- v1.0: 10/10/11: Creation
12
-- v1.1: 11/10/11: Add Condionnal management
13
-- v1.2: 12/10/11: Modification du traitement des conditions de saut
14
--
15
-- Targeted device: ProAsic A3P250 VQFP100
16
-- Author: AbdAllah Meziti
17
--------------------------------------------------------------------------------
18
 
19
library ieee;
20
use ieee.std_logic_1164.all;
21
use ieee.numeric_std.all;
22
 
23
use     work.Usefull_Pkg.all;           -- Usefull Package
24
 
25
--------------------------------------------------------------------------------
26
-- Entity: cp_ProgramFlowControl
27
--
28
-- Description:
29
--      
30
--      REMARQUE:
31
--
32
--      
33
-- History:
34
-- 10/10/11 AM: Creation
35
-- ---------------------
36
-- xx/xx/xx AM: 
37
--                              
38
--------------------------------------------------------------------------------
39
entity cp_ProgramFlowControl is
40
        generic
41
        (
42
                GEN_WIDTH_PC                    : positive := 8;
43
                GEN_INT_VECTOR                  : std_ulogic_vector(11 downto 0) := x"0F0";
44
                GEN_DEPTH_STACK                 : positive := 15
45
        );
46
        port (
47
        --------------------------------------------------------------------------------
48
        -- Signaux Systeme
49
        --------------------------------------------------------------------------------
50
                Clk_i                           : in std_ulogic;        --      signal d'horloge générale
51
                Rst_i_n                         : in std_ulogic;        --      signal de reset générale
52
 
53
                Enable_i                        : in std_ulogic;
54
        --------------------------------------------------------------------------------
55
        -- Signaux Fonctionels
56
        --------------------------------------------------------------------------------
57
                aaa_i                           : in std_ulogic_vector(GEN_WIDTH_PC-1 downto 0); -- 
58
 
59
                Interrupt_i                     : in std_ulogic;        -- 
60
 
61
                Jump_i                          : in std_ulogic;
62
                Call_i                          : in std_ulogic;
63
                Return_i                        : in std_ulogic;
64
                ReturnI_i                       : in std_ulogic;
65
 
66
                ConditionCtrl_i         : in std_ulogic_vector(2 downto 0);
67
                FlagC_i                         : in std_ulogic;
68
                FlagZ_i                         : in std_ulogic;
69
 
70
                PC_o                            : out std_ulogic_vector(GEN_WIDTH_PC-1 downto 0) -- 
71
        );
72
end cp_ProgramFlowControl;
73
 
74
--------------------------------------------------------------------------------
75
-- Architecture: RTL
76
-- of entity : cp_ProgramFlowControl
77
--------------------------------------------------------------------------------
78
architecture rtl of cp_ProgramFlowControl is
79
 
80
        --------------------------------------------------------------------------------
81
        -- Définition des fonctions
82
        --------------------------------------------------------------------------------
83
 
84
 
85
 
86
        --------------------------------------------------------------------------------
87
        -- Définition des constantes
88
        --------------------------------------------------------------------------------
89
 
90
        --------------------------------------------------------------------------------
91
        -- Définition des signaux interne
92
        --------------------------------------------------------------------------------
93
        signal  iPC                     : std_ulogic_vector(GEN_WIDTH_PC-1 downto 0);    -- Programm Counter Signal
94
        signal  iPCin           : std_ulogic_vector(GEN_WIDTH_PC-1 downto 0);    -- Programm Counter Signal
95
 
96
        signal  iDataStackToPC  : std_ulogic_vector(GEN_WIDTH_PC-1 downto 0);
97
 
98
        signal  iChangePC               : std_ulogic;
99
 
100
        alias   iUnConditionnal : std_ulogic                                    is      ConditionCtrl_i(2);
101
        alias   iConditionnal   : std_ulogic_vector(1 downto 0)  is      ConditionCtrl_i(1 downto 0);
102
        signal  iCondition              : std_ulogic;
103
 
104
        signal  iPush           : std_ulogic;
105
        signal  iPop            : std_ulogic;
106
 
107
        --------------------------------------------------------------------------------
108
        -- Déclaration des composants
109
        --------------------------------------------------------------------------------
110
        component cp_ProgramCounter
111
                generic
112
                (
113
                        GEN_WIDTH_PC            : positive := 8
114
                );
115
                port (
116
                --------------------------------------------------------------------------------
117
                -- Signaux Systeme
118
                --------------------------------------------------------------------------------
119
                        Clk_i                           : in std_ulogic;        --      signal d'horloge générale
120
                        Rst_i_n                         : in std_ulogic;        --      signal de reset générale
121
 
122
                        Enable_i                        : in std_ulogic;
123
                --------------------------------------------------------------------------------
124
                -- Signaux Fonctionels
125
                --------------------------------------------------------------------------------
126
                        PC_i                            : in std_ulogic_vector(GEN_WIDTH_PC-1 downto 0);
127
                        Change_i                        : in std_ulogic;
128
 
129
                        PC_o                            : out std_ulogic_vector(GEN_WIDTH_PC-1 downto 0)
130
                );
131
        end component;
132
 
133
        component cp_Stack
134
                generic
135
                (
136
                        GEN_WIDTH_PC            : positive := 8;
137
                        GEN_DETPH                       : positive := 15
138
                );
139
                port (
140
                --------------------------------------------------------------------------------
141
                -- Signaux Systeme
142
                --------------------------------------------------------------------------------
143
                        Clk_i                           : in std_ulogic;        --      signal d'horloge générale
144
                        Rst_i_n                         : in std_ulogic;        --      signal de reset générale
145
 
146
                --------------------------------------------------------------------------------
147
                -- Signaux Fonctionels
148
                --------------------------------------------------------------------------------
149
                        Data_i                          : in std_ulogic_vector(GEN_WIDTH_PC-1 downto 0); -- 
150
                        Data_o                          : out std_ulogic_vector(GEN_WIDTH_PC-1 downto 0);        -- 
151
 
152
                        Enable_i                        : in std_ulogic;
153
 
154
                        Push_i                          : in std_ulogic;
155
                        Pop_i                           : in std_ulogic
156
 
157
                );
158
        end component;
159
 
160
begin
161
 
162
        --------------------------------------------------------------------------------
163
        -- Traitement des conditions du saut du PC
164
        --------------------------------------------------------------------------------
165
        iCondition      <=              '1'                     when    (iUnConditionnal='0')    else
166
                                                FlagZ_i         when    (iConditionnal="00")    else
167
                                        not(FlagZ_i)    when    (iConditionnal="01")    else
168
                                                FlagC_i         when    (iConditionnal="10")    else
169
                                        not(FlagC_i)    when    (iConditionnal="11")    else
170
                                                '0';
171
 
172
        -- Commande d'écriture de la nouvelle valeur du PC
173
        iChangePC       <=      ((Jump_i or Call_i or Return_i) and (iCondition))
174
                                        or
175
                                        (Interrupt_i) or (ReturnI_i);
176
 
177
        -- Nouvelle valeur du PC
178
        iPCin           <=      -- !TODO : Who has the priority, Jump or Interrupt?
179
                                        (GEN_INT_VECTOR(GEN_WIDTH_PC-1 downto 0))                        when (Interrupt_i='1')  else
180
                                        (iDataStackToPC)                                                                        when (ReturnI_i='1')    else
181
                                        (std_ulogic_vector(UNSIGNED(iDataStackToPC) + 1))       when (Return_i='1')             else
182
                                        (aaa_i);
183
 
184
        --------------------------------------------------------------------------------
185
        -- Traitement des commande de Push & Pop de la stack
186
        --------------------------------------------------------------------------------
187
        iPush           <=      (iCondition and Call_i) or (Interrupt_i);
188 39 ameziti
        iPop            <=      (iCondition and Return_i) or (ReturnI_i);
189 2 ameziti
 
190
        --------------------------------------------------------------------------------
191
        -- Instantiation du composant "cp_ProgramCounter"
192
        --------------------------------------------------------------------------------
193
        U_ProgramCounter : cp_ProgramCounter
194
                generic map
195
                (
196
                        GEN_WIDTH_PC            =>      GEN_WIDTH_PC
197
                )
198
                port map(
199
                --------------------------------------------------------------------------------
200
                -- Signaux Systeme
201
                --------------------------------------------------------------------------------
202
                        Clk_i                           => Clk_i,
203
                        Rst_i_n                         => Rst_i_n,
204
 
205
                        Enable_i                        => Enable_i,
206
                --------------------------------------------------------------------------------
207
                -- Signaux Fonctionels
208
                --------------------------------------------------------------------------------
209
                        PC_i                            => iPCin,
210
                        Change_i                        => iChangePC,
211
 
212
                        PC_o                            => iPC
213
                );
214
 
215
        --------------------------------------------------------------------------------
216
        -- Instantiation du composant "cp_Stack"
217
        --------------------------------------------------------------------------------
218
        U_Stack : cp_Stack
219
                generic map
220
                (
221
                        GEN_WIDTH_PC            => GEN_WIDTH_PC,
222
                        GEN_DETPH                       => GEN_DEPTH_STACK
223
                )
224
                port map(
225
                --------------------------------------------------------------------------------
226
                -- Signaux Systeme
227
                --------------------------------------------------------------------------------
228
                        Clk_i                           => Clk_i,
229
                        Rst_i_n                         => Rst_i_n,
230
 
231
                --------------------------------------------------------------------------------
232
                -- Signaux Fonctionels
233
                --------------------------------------------------------------------------------
234
                        Data_i                          => iPC,
235
                        Data_o                          => iDataStackToPC,
236
 
237
                        Enable_i                        => Enable_i,
238
 
239
                        Push_i                          => iPush,
240
                        Pop_i                           => iPop
241
                );
242
 
243
        --------------------------------------------------------------------------------
244
        -- Sorties
245
        --------------------------------------------------------------------------------
246
        PC_o <= iPC;
247
 
248
end rtl;
249
 

powered by: WebSVN 2.1.0

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