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

Subversion Repositories raytrac

[/] [raytrac/] [branches/] [fp/] [sm.vhd] - Blame information for rev 151

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 134 jguarin200
--! @file sm.vhd
2
--! @brief Maquina de Estados. Controla la operación interna y genera los mecanismos de sincronización con el exterior (interrupciones). 
3
--! @author Julián Andrés Guarín Reyes
4
--------------------------------------------------------------
5
-- RAYTRAC
6
-- Author Julian Andres Guarin
7
-- sm.vhd
8
-- This file is part of raytrac.
9
-- 
10
--     raytrac is free software: you can redistribute it and/or modify
11
--     it under the terms of the GNU General Public License as published by
12
--     the Free Software Foundation, either version 3 of the License, or
13
--     (at your option) any later version.
14
-- 
15
--     raytrac is distributed in the hope that it will be useful,
16
--     but WITHOUT ANY WARRANTY; without even the implied warranty of
17
--     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
--     GNU General Public License for more details.
19
-- 
20
--     You should have received a copy of the GNU General Public License
21
--     along with raytrac.  If not, see <http://www.gnu.org/licenses/>.
22
 
23
 
24
library ieee;
25
use ieee.std_logic_1164.all;
26 139 jguarin200
use ieee.std_logic_unsigned.all;
27 134 jguarin200
 
28 151 jguarin200
use work.arithpack.all;
29 134 jguarin200
 
30
entity sm is
31 142 jguarin200
        generic (
32
                width : integer := 32;
33
                widthadmemblock : integer := 9
34
                --!external_readable_widthad :                          
35 145 jguarin200
        );
36 134 jguarin200
        port (
37
 
38 145 jguarin200
                --! Se&ntilde;ales normales de secuencia.
39
                clk,rst:                        in std_logic;
40 147 jguarin200
                --! Vector con las instrucción codficada
41 142 jguarin200
                instrQq:in std_logic_vector(width-1 downto 0);
42 147 jguarin200
                --! Señal de cola vacia.
43 145 jguarin200
                instrQ_empty:in std_logic;
44 142 jguarin200
 
45 145 jguarin200
 
46
                adda,addb:out std_logic_vector (widthadmemblock-1 downto 0);
47
                sync_chain_0,instrRdAckd:out std_logic;
48 142 jguarin200
 
49 147 jguarin200
 
50 145 jguarin200
                full_r:         in std_logic;   --! Indica que la cola de resultados no puede aceptar mas de 32 elementos.
51
 
52 142 jguarin200
 
53 150 jguarin200
                --! End Of Instruction Event
54
                eoi     : out std_logic;
55 142 jguarin200
 
56 151 jguarin200
                --! State Exposed for testbench purposes.
57
                state : out macState;
58
 
59 142 jguarin200
                --! DataPath Control uca code.
60 145 jguarin200
                dpc_uca : out std_logic_vector (2 downto 0)
61 142 jguarin200
 
62
 
63 134 jguarin200
        );
64
end entity;
65 139 jguarin200
 
66
architecture sm_arch of sm is
67
 
68 151 jguarin200
 
69 145 jguarin200
        --! LOAD_INSTRUCTION: Estado en el que se espera que en la cola de instrucciones haya una instrucción para ejecutar.
70
        --! EXECUTE_INSTRUCTION: Estado en el que se ejecuta la instrucci&oacute;n de la cola de instrucciones.
71
        --! FLUSH_ARITH_PIPELINE: Estado en el que se espera un número específico de ciclos de reloj, para que se desocupe el pipeline aritmético.
72
 
73 151 jguarin200
        signal s_state : macState;
74 139 jguarin200
 
75
 
76 151 jguarin200
 
77 145 jguarin200
        signal s_instr_uca:     std_logic_vector(2 downto 0);
78
        signal s_dpc_uca:               std_logic_vector(2 downto 0);
79
        signal s_block_start_a: std_logic_vector(4 downto 0);
80
        signal s_block_start_b: std_logic_vector(4 downto 0);
81
        signal s_block_end_a:   std_logic_vector(4 downto 0);
82
        signal s_block_end_b:   std_logic_vector(4 downto 0);
83
        signal s_combinatory:   std_logic;
84
        signal s_delay_field:   std_logic_vector(7 downto 0);
85
        signal s_set_b:                 std_logic;                                              --! Se&ntilde;al para colocar un valor arbitrario en el contador B.
86
        signal s_set_a:                 std_logic;
87
        signal s_set_dly:               std_logic;
88
        signal s_go_b:                  std_logic;                                              --! Salida para controlar la pausa(0) o marcha(1) del contador de direcciones del operando B/D.
89
        signal s_go_a:                  std_logic;                                              --! Salida para controlar la pausa(0) o marcha(1) del contador de direcciones del operando A/C. 
90
        signal s_go_delay:              std_logic;                                              --! Salida para controlar la pausa(0) o marcha(1) del contador de delay, para el flush del pipeline aritm&eacute;tico.
91
        signal s_zeroFlag_delay:std_logic;                                              --! Bandera de cero del contador delay. 
92
        signal s_eq_b,s_eq_a:   std_logic;      --! Indica cuando se est&aacute; leyendo el &uacute;ltimo bloque de memoria con operandos de entrada de a y de b respectivamente. 
93
        signal s_eb_b,s_eb_a:   std_logic;      --! Indica que se est&aacute; leyendo en memoria el &uacute;ltimo operando del bloque actual, b o a, respectivamente.
94
 
95 134 jguarin200
begin
96 151 jguarin200
 
97
        state <= s_state;
98
 
99 145 jguarin200
        --! Código UCA, pero en la etapa DPC: La diferencia es que UCA en la etapa DPC, decodifica el datapath dentro del pipeline aritmético.
100
        dpc_uca <= s_dpc_uca;
101 142 jguarin200
 
102 145 jguarin200
 
103
        --! Bloques asignados en la instrucci´øn
104 142 jguarin200
        s_block_start_a <= instrQq(width-4 downto width-8);
105
        s_block_end_a <= instrQq(width-9 downto width-13);
106 139 jguarin200
 
107 145 jguarin200
        s_block_start_b <= instrQq(width-14 downto width-18);
108
        s_block_end_b <= instrQq(width-19 downto width-23);
109
 
110
        --! Campo que define si la instrucción es combinatoria
111
        s_combinatory <= instrQq(width-24);
112
 
113
        --! Campo que define cuantos clocks debe esperar el sistema, despues de que se ejecuta una instrucción, para que el pipeline aritmético quede vacio.
114
        s_delay_field <= instrQq(width-25 downto width-32);
115
 
116
        --! UCA code, código con la instrucción a ejecutar. 
117
        s_instr_uca <= instrQq(31 downto 29);
118
 
119 142 jguarin200
        --! Address Counters
120
        counterA:customCounter
121 145 jguarin200
        generic map ("YES","NO","NO","YES",4,9)
122
        port map (clk,rst,s_go_a,s_set_a,s_block_start_a,s_block_end_a,open,s_eb_a,s_eq_a,adda);
123 142 jguarin200
        counterB:customCounter
124 145 jguarin200
        generic map ("YES","NO","NO","YES",4,9)
125
        port map (clk,rst,s_go_b,s_set_b,s_block_start_b,s_block_end_b,open,s_eb_b,s_eq_b,addb);
126
        counterDly:customCounter
127
        generic map("NO","YES","YES","NO",0,5)
128
        port map (clk,rst,s_go_delay,s_set_dly,s_delay_field(4 downto 0),"00000",s_zeroFlag_delay,open,open,open);
129 139 jguarin200
 
130
 
131 145 jguarin200
        sm_comb:
132 151 jguarin200
        process (s_state, full_r,s_eb_b,s_combinatory,s_zeroFlag_delay,s_eq_b,s_eb_a,s_eq_a,instrQ_empty)
133 145 jguarin200
        begin
134
                --!Se&ntilde;al de play/pause del contador de direcciones para el par&aacute;metro B/D.
135
                s_go_b <= not(full_r and s_eb_b);
136 139 jguarin200
 
137 145 jguarin200
                --!Se&ntilde;al de play/pause del contador de direcciones para el par&aacute;metro A/C.
138
                if s_combinatory='0' then
139
                        s_go_a <= not(full_r and s_eb_b);
140
 
141
                else
142
                        s_go_a <= not(full_r) and s_eb_b and s_eq_b;
143
                end if;
144
 
145
                --!Se&ntilde;al de play/pause del contador del arithmetic pipeline flush counter.
146
                s_go_delay  <= not(s_zeroFlag_delay);
147
 
148
                --! Si estamos en el final de la instrucción, "descargamos" esta de la máquina de estados con acknowledge read.
149 151 jguarin200
                if s_eb_b='1' and s_eq_b='1' and s_eb_a='1' and s_eq_a='1' and s_state=EXECUTE_INSTRUCTION then
150 145 jguarin200
                        instrRdAckd <= '1';
151
                else
152
                        instrRdAckd <= '0';
153
                end if;
154
 
155 151 jguarin200
                if (s_eb_a='1' and s_eq_a='1') or s_state=LOAD_INSTRUCTION or s_state=FLUSH_ARITH_PIPELINE then
156 145 jguarin200
                        s_set_a <= '1';
157
                else
158
                        s_set_a <= '0';
159
                end if;
160
 
161
 
162
 
163 151 jguarin200
                if (s_eb_b='1' and s_eq_b='1') or s_state=LOAD_INSTRUCTION or s_state=FLUSH_ARITH_PIPELINE then
164 145 jguarin200
                        s_set_b <= '1';
165
                else
166
                        s_set_b <= '0';
167
                end if;
168
 
169
        end process;
170
 
171 139 jguarin200
        sm_proc:
172 151 jguarin200
        process (clk,rst,s_state, full_r,s_eb_b,s_combinatory,s_zeroFlag_delay,s_eq_b,s_eb_a,s_eq_a,instrQ_empty)
173 139 jguarin200
        begin
174 145 jguarin200
 
175 139 jguarin200
                if rst=rstMasterValue then
176 145 jguarin200
 
177 151 jguarin200
                        s_state <= LOAD_INSTRUCTION;
178 145 jguarin200
                        s_set_dly <= '1';
179
                        sync_chain_0 <= '0';
180 150 jguarin200
                        eoi<='0';
181 145 jguarin200
                        s_dpc_uca <= (others => '0');
182
 
183
 
184 142 jguarin200
                elsif clk='1' and clk'event then
185 139 jguarin200
 
186 151 jguarin200
                        case s_state is
187 142 jguarin200
 
188 145 jguarin200
                                --! Cargar la siguiente instrucción. 
189
                                when LOAD_INSTRUCTION =>
190
 
191 150 jguarin200
                                        eoi <= '0';
192
 
193 145 jguarin200
                                        if instrQ_empty='0' and full_r='0' then
194 139 jguarin200
 
195 145 jguarin200
                                                --! Siguiente estado: Ejecutar la instrucción.  
196 151 jguarin200
                                                s_state <= EXECUTE_INSTRUCTION;
197 145 jguarin200
 
198
                                                --! Asignar el código UCA para que comience la decodificación.
199
                                                s_dpc_uca <= s_instr_uca;
200
 
201
                                                --! Validar el siguiente dato dentro del pipeline aritmético.
202
                                                sync_chain_0 <= '1';
203
 
204
                                                --! En el estado EXECUTE, el valor del contador de delay se debe mantener fijo, y puesto en el valor de delay que contiene la instruccion.
205
                                                s_set_dly <= '1';
206
 
207
 
208
 
209
                                        end if;
210
 
211
                                --! Ejecución de la instruccion                
212
                                when EXECUTE_INSTRUCTION =>
213
 
214
 
215
                                        if s_eb_b='1'and s_eq_b='1' and s_eb_a='1' and s_eq_a='1' then  --! Revisar si es el fin de la instruccion
216
 
217 150 jguarin200
 
218 145 jguarin200
                                                --!Ya no ingresaran mas datos al pipeline aritmético, invalidar.
219
                                                sync_chain_0 <= '0';
220
 
221
                                                if s_zeroFlag_delay='1' then
222
 
223 150 jguarin200
                                                        --! Notificar fin de procesamiento de la instruccion (End Of Instruction)
224
                                                        eoi <= '1';
225 151 jguarin200
                                                        s_state <= LOAD_INSTRUCTION;
226 145 jguarin200
                                                        s_set_dly <= '1';
227 142 jguarin200
 
228 145 jguarin200
 
229
                                                else
230 150 jguarin200
 
231 151 jguarin200
                                                        s_state <= FLUSH_ARITH_PIPELINE;
232 145 jguarin200
                                                        s_set_dly <= '0';
233 142 jguarin200
 
234 145 jguarin200
                                                end if;
235
 
236
                                        --! Invalidar/validar datos dentro del pipeline aritmético.
237
                                        elsif s_eb_b='1' and full_r='1' then
238
                                                --! Invalidar el siguiente dato dentro del pipeline aritmético.
239
                                                sync_chain_0 <= '0';
240 142 jguarin200
                                        else
241 145 jguarin200
                                                sync_chain_0 <= '1';
242
                                        end if;
243
 
244
                                --! Ejecución de la instrucción               
245
                                when FLUSH_ARITH_PIPELINE =>
246
                                        --! Este estado permanece así hasta que, haya una instrucción 
247
                                        if s_zeroFlag_delay='1' then
248 142 jguarin200
 
249 150 jguarin200
                                                --! Notificar fin de procesamiento de la instruccion (End Of Instruction)
250
                                                eoi <= '1';
251 151 jguarin200
                                                s_state <= LOAD_INSTRUCTION;
252 145 jguarin200
                                                s_set_dly <= '1';
253
 
254
                                        end if;
255
 
256
                                when others => null;
257
 
258 139 jguarin200
                        end case;
259
                end if;
260
        end process;
261 142 jguarin200
 
262 134 jguarin200
end architecture;

powered by: WebSVN 2.1.0

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