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

Subversion Repositories jart

[/] [jart/] [trunk/] [BLIFACE/] [uart_serial.vhdl] - Blame information for rev 9

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

Line No. Rev Author Line
1 9 jguarin200
-- Autor
2
library ieee;
3
use ieee.std_logic_1164.all;
4
use ieee.std_logic_unsigned.all;
5
use ieee.numeric_std.all;
6
 
7
entity uart is
8
        port(
9
 
10
                rst                     : in  std_logic;                      -- reset control signal
11
                clk                     : in  std_logic;                      -- 100 MHz on PLL
12
 
13
                -- Reception channel
14
                Rx                      : in  std_logic;                      -- Linea de entrada RS232
15
                RxDataOut       : out std_logic_vector(7 downto 0);   -- Buffer de salida
16
                RxRdy           : out std_logic;                      -- Bandera para indicar que el dato esta listo 
17
 
18
 
19
                -- Transmition channel
20
                Tx                      : out std_logic;                      -- Linea de salida RS232
21
                TxDataIn        : in  std_logic_vector(7 downto 0);   -- Buffer de entrada 
22
                TxLoad          : in  std_logic;                      -- Señal de carga
23
                TxBusy      : out std_logic                      -- Bandera de Canal ocupado
24
        );
25
 
26
end entity;
27
 
28
 
29
architecture rtl of uart is
30
 
31
        -------------------------------------------------------------------------------
32
        -- Ticks 
33
        -------------------------------------------------------------------------------
34
        --constant T50MHZ_54NS  : integer := 27;    --  27 T50MHZ_540NS, 1 16 avo de bit
35
        constant TBIT                   : integer := 434/4;     --   15 1 bit
36
        constant THALF_BIT              : integer := 217/4;     --  7 1/2 bit
37
        -------------------------------------------------------------------------------
38
        -- Maquinas de Estado
39
        -------------------------------------------------------------------------------
40
        type tTxStateMachine is (WAITING_LOAD_TX,SET_STARTBIT_TX,SET_NBIT_TX,FINISH_TX);
41
        type tRxStateMachine is (WAIT_START_BIT,HOLD_STARTBIT_RX,WAIT_FOR_NEW_BIT_RX,SAMPLE_BIT_RX,SAMPLE_STOPBIT_RX);--,RX_OVF,DEBUGGING_RX);
42
        signal sTxState      : tTxStateMachine;
43
        signal sRxState      : tRxStateMachine;
44
        -------------------------------------------------------------------------------
45
        -- Baud Rate Signals : Bit 16th bit16, Bit half bit2, Entire Bit bit1.
46
        -------------------------------------------------------------------------------
47
        signal bit2   : std_logic;                      -- 1/2 BAUDIO
48
        signal bit1   : std_logic;                      -- 1 BAUDIO
49
        -------------------------------------------------------------------------------
50
        -- Registros de Transmision
51
        -------------------------------------------------------------------------------
52
        signal sTxDataInReg     : std_logic_vector(7 downto 0);  -- Registro de precarga de salida
53
        signal sShiftTxData     : std_logic_vector(9 downto 0);  -- Registro de corrimiento de salida
54
 
55
        -------------------------------------------------------------------------------
56
        -- Registros de Recepcion
57
        -------------------------------------------------------------------------------
58
        signal sShiftRxData     : std_logic_vector(7 downto 0);  -- Registro de corrimiento de llegada.
59
        signal sSyncRxCounter   : std_logic;                    -- Señal de sincronizacion para el contador de medio bit.
60
        signal sEnableTxCounter : std_logic;                                    -- Señal de sincronizacion para conteo de un bit entero en la transmision.                                              
61
        signal sRx0, sRx1               : std_logic;                                    -- Señal Rx Registrada
62
 
63
begin
64
 
65
        ------------------------------------------------------------------------------
66
        --             Countador Principal de Transmision                        --- 
67
        -------------------------------------------------------------------------------
68
        txCntr:
69
        process(rst,clk)
70
                variable counter : integer range 0 to 1023;
71
        begin
72
                if rst = '0' then
73
 
74
                        bit1 <= '0';
75
                        counter := 0;
76
 
77
                elsif rising_edge(clk) then
78
 
79
                        bit1 <= '0';
80
                        if sEnableTxCounter ='0' then
81
                                counter := 0;
82
                        elsif counter = TBIT then
83
                                bit1 <= '1';
84
                                counter := 0;
85
                        else
86
                                counter := counter + 1;
87
                        end if;
88
 
89
                end if;
90
        end process;
91
 
92
 
93
 
94
        ------------------------------------------------------------------------------
95
        -- Countador Principal de Transmision  (115200 bps : 1/2 Baudio con 8 Ticks => 1 Tick / 54 ns)
96
        -- Adicionalmente este contador usa la señal sSyncRxCounter, para resetearlo.
97
        -------------------------------------------------------------------------------
98
        rxCntr:
99
        process(rst, clk)
100
                variable counter : integer range 0 to 1023;
101
        begin
102
 
103
                if rst = '0' then
104
                        bit2 <= '0';
105
                        counter := 0;
106
                elsif rising_edge(clk) then
107
                        bit2 <= '0';
108
                        if sSyncRxCounter = '1' then
109
                                counter:=0;
110
 
111
                        elsif counter = THALF_BIT then
112
                                -- Reset el contador y marcar medio bit.
113
                                bit2 <= '1';
114
                                counter := 0;
115
                        else
116
                                counter := counter + 1;
117
                        end if;
118
                end if;
119
 
120
        end process;
121
 
122
 
123
        -------------------------------------------------------------------------------
124
        -- Maquina de estado de transmision
125
        -------------------------------------------------------------------------------
126
        txFSM:
127
        process(rst, clk)
128
                variable counter : integer range 0 to 15;
129
        begin
130
                if rst = '0' then
131
 
132
                        -- Seleccionar estado de espera.
133
                        sTxState                <= WAITING_LOAD_TX;
134
 
135
                        -- Registro de corrimiento en 1. De esa manera se pone automaticamente la linea de transmision en 1.
136
                        sShiftTxData    <= (others => '1');
137
 
138
                        -- Deshabilitar el contador de transmision (canal libre).
139
                        sEnableTxCounter <= '0';
140
 
141
                elsif rising_edge(clk) then
142
 
143
                        case sTxState is
144
 
145
                                when WAITING_LOAD_TX =>
146
 
147
                                        if TxLoad = '1' then
148
 
149
                                                -- Cargar Dato
150
                                                sTxDataInReg <= TxDataIn;
151
 
152
                                                -- Siguiente estado : Cargar bit 
153
                                                sTxState  <= SET_STARTBIT_TX;
154
 
155
                                                -- Habilitar el contador de Tx  (canal ocupado)
156
                                                sEnableTxCounter <= '1';
157
 
158
                                        end if;
159
 
160
                                when SET_STARTBIT_TX =>
161
 
162
                                        if bit1 = '1' then -- Esperar a que transcurra el tiempo de un bit.
163
 
164
                                                -- 0 avo bit
165
                                                counter := 1;
166
 
167
                                                -- Colocar el startbit
168
                                                sShiftTxData(9 downto 0) <= '1' & sTxDataInReg(7 downto 0) & '0'; -- Enviar START BIT 
169
 
170
                                                -- Pasar a esperar tbit para colocar el siguiente bit de datos en la linea tx
171
                                                sTxState <= SET_NBIT_TX; -- Cargar siguiente dato 
172
 
173
                                        end if;
174
 
175
                                when SET_NBIT_TX =>
176
 
177
                                        if bit1 = '1' then -- Paso un bit
178
 
179
                                                -- Contar el numero de datos enviados
180
                                                counter := counter + 1; -- Calcular el numero de datos - 1 enviados
181
 
182
                                                -- Correr el registro de y transmitir el ultimo bit.
183
                                                sShiftTxData(9 downto 0) <= '1' & sShiftTxData(9 downto 1);
184
 
185
                                                if counter = 10 then -- 10 bits enviados parar.
186
 
187
                                                        -- Ir al estado de finalizacion de la transmision
188
                                                        sTxState <= FINISH_TX;
189
 
190
 
191
 
192
                                                end if;
193
 
194
                                        end if;
195
 
196
                                when FINISH_TX => -- stop bit
197
 
198
                                        if bit1 = '1' then
199
 
200
                                                -- Estado Ocioso 
201
                                                sTxState <= WAITING_LOAD_TX;
202
 
203
                                                -- Deshabilitar el contador de transmision y declarar el canal de transmision libre.
204
                                                sEnableTxCounter <= '0';
205
 
206
                                        end if;
207
 
208
                                when others =>
209
 
210
                                        -- Si no se sabe el estado entonces ir a finish para liberar el canal.
211
                                        sTxState <= FINISH_TX;
212
 
213
                        end case;
214
 
215
                end if;
216
 
217
        end process;
218
 
219
        -- Declarar el canal como ocupado o desocupado si el contador de transmision está encendido o apagado respectivamente
220
        TxBusy <= sEnableTxCounter;
221
        Tx <= sShiftTxData(0);
222
 
223
 
224
  -------------------------------------------------------------------------------
225
  -- Reception process
226
  -------------------------------------------------------------------------------
227
        rxFSM: process(rst, clk)
228
                variable counter : integer range 0 to 127;
229
        begin
230
                if rst = '0' then
231
 
232
                        RxDataOut <= (others => '1');
233
                        RxRdy <= '0';
234
                        sShiftRxData <= (others => '1');
235
                        sRxState <= WAIT_START_BIT;
236
                        sRx0<='1';
237
                        sRx1<='1';
238
 
239
                elsif rising_edge(clk) then
240
 
241
 
242
 
243
                        RxRdy <= '0';
244
                        sSyncRxCounter <='0';
245
 
246
                        -- Doble FF para la sincronizaciòn de Rx. Esto no funciona muy bien con PLL.
247
                        -- Preguntar a Alejandra.
248
                        sRx0 <= Rx;
249
                        sRx1 <= sRx0;
250
 
251
                        case sRxState is
252
 
253
                                when WAIT_START_BIT =>  -- Wait start bit
254
 
255
                                        if (sRx1 and not(sRx0))='1' then -- Si hay un Flanco de bajada
256
 
257
                                                -- Siguiente estado : esperar que pase el bit de start
258
                                                sRxState <= HOLD_STARTBIT_RX;
259
 
260
                                                -- Sincronizacion contador
261
                                                sSyncRxCounter <='1';
262
 
263
 
264
                                                -- Vamos en el primer bit.
265
                                                counter := 0;
266
 
267
                                        end if;
268
 
269
 
270
 
271
                                when HOLD_STARTBIT_RX =>
272
 
273
                                        if bit2 = '1' then -- Nos encontramos en la mitad del baudio del start bit. Ahora lo muestreamos sin cargarlo ;)                  
274
 
275
                                                sRxState <= WAIT_FOR_NEW_BIT_RX; -- Siguiente estado es detectar nuevo bit.
276
 
277
                                        end if;
278
 
279
 
280
                                when WAIT_FOR_NEW_BIT_RX =>
281
 
282
                                        if bit2 = '1' then -- En este momento nos encontramos en el comienzo de un bit.
283
 
284
                                                if counter = 8 then -- Si hemos leido el OCTAVO bit entonces el que sigue es el NOVENO bit  (STOP BIT)
285
 
286
                                                        sRxState <= SAMPLE_STOPBIT_RX; -- Ir al estado de lectura del stop bit.                                 
287
 
288
                                                else
289
 
290
                                                        sRxState <= SAMPLE_BIT_RX;-- Ir al estado de carga de un bit de datos.
291
 
292
                                                end if;
293
 
294
                                        end if;
295
 
296
 
297
                                when SAMPLE_BIT_RX =>
298
 
299
                                        if bit2 = '1' then -- Nos encontramos en la mitad de un baudio. Muestrear el bit correspondiente.
300
 
301
                                                --Contar el numero de bits leidos.
302
                                                counter := counter + 1;
303
 
304
                                                --Cargar el bit que se encuentra en la linea RX (después del flip flop para evitar metaestabilidad)
305
                                                sShiftRxData(7 downto 0) <= sRx0 & sShiftRxData(7 downto 1);
306
 
307
                                                -- Siguiente estado : Detectar nuevo baudio.
308
                                                sRxState <= WAIT_FOR_NEW_BIT_RX;
309
 
310
                                        end if;
311
 
312
 
313
 
314
                                when SAMPLE_STOPBIT_RX =>
315
 
316
                                        if bit2 = '1' then -- Estamos en la mitad del stop bit.
317
 
318
                                                -- Cargar el dato del shift register al buffer de salida.
319
                                                RxDataOut <= sShiftRxData;
320
 
321
                                                -- Siguiente estado: Ocioso, esperando por un start bit.
322
                                                sRxState <= WAIT_START_BIT;
323
 
324
                                                -- Avisar que está listo el dato.
325
                                                RxRdy <='1';
326
 
327
                                        end if;
328
 
329
 
330
                                when others =>
331
 
332
                                        sRxState <= WAIT_START_BIT;
333
 
334
                        end case;
335
 
336
                end if;
337
 
338
        end process;
339
 
340
end rtl;
341
 

powered by: WebSVN 2.1.0

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