Circuitos Digitales - Programación VHDL

 
Vista:

Programación VHDL

Publicado por alex hernández (1 intervención) el 30/05/2012 18:10:42
hola a todos

Solicito ayuda para programar una aplicación en VHDL , soy nuevo en estos temas y tengo pocas hbilidades. el problema a resolver es el siguiente:

Diseñe e implemente un sistema secuencial sincrónico que consiste en un receptor serie asincrónico (UART) con salida paralelo. Se reciben 8 bits de datos y un bit de paridad, que es uno si la paridad del dato es impar (9no bit).
 El sistema recibe los datos con formato serie por el terminal Rx, recibiendo primero el LSB.
 La línea Rx cuando no hay comunicación está en UNO. El bit de START es CERO y el de STOP es UNO.
 El reloj de la comunicación NO se transmite.
 El receptor debe tener doble registro para almacenar el dato recibido de 8 bits.
 La velocidad (Baud Rate) de la comunicación es de 921600 Bauds (bits por segundo).
 CLK es el Reloj del sistema y tiene una frecuencia de 18.432 MHz.
 Cada bits es muestreado una sola vez en la mitad del tiempo de bit.
 Data es la salida de 8 bits del dato recibido.
 Se recibe un noveno bit que es la paridad de modo tal que la cantidad de unos en el dato mas la paridad siempre es par.
 La salida Rx_Rdy será uno cuando se recibe un dato y está listo para ser leído.
 Con la entrada Rd en uno por un periodo del reloj se indica al receptor que se leyó el dato recibido, es decir Rd limpia a Rx_Rdy.
 El sistema siempre que termina una recepción queda listo para la siguiente.
 Error es una salida que se activa si:
 Se recibe un segundo dato sin leer el primero.
 El bit de Stop recibido no es uno.
 La paridad no es correcta
 CLR_Error entrada que permite llevar a cero la salida Error.

Ejemplo del formato de la comunicación con el UART. La salida del transmisor si no se esta transmitiendo esta en uno y el primer bit que se transmite siempre es cero, después los 8 bits del dato y por último al menos un bit de stop.

Les agradeceria cualquier ayuda que puedan darme.

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Diseño de receptor UART en VHDL

Publicado por Alejandro (117 intervenciones) el 29/08/2023 17:33:43
A continuación, te proporciono un ejemplo básico de cómo podrías implementar un receptor UART en VHDL para cumplir con las especificaciones que proporcionaste. Ten en cuenta que este es un diseño simplificado y puede requerir ajustes específicos para tu entorno y necesidades. Asegúrate de simular y probar exhaustivamente el diseño antes de implementarlo en hardware.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
entity UART_Receiver is
    Port (
        CLK         : in  STD_LOGIC;
        Rx          : in  STD_LOGIC; -- Línea de recepción serie
        Rx_Rdy      : out STD_LOGIC; -- Listo para leer
        Data        : out STD_LOGIC_VECTOR(7 downto 0); -- Dato recibido
        Error       : out STD_LOGIC; -- Error
        CLR_Error   : in  STD_LOGIC; -- Borrar error
        Rd          : in  STD_LOGIC  -- Leer dato
    );
end UART_Receiver;
 
architecture Behavioral of UART_Receiver is
    signal Rx_Shift_Register : STD_LOGIC_VECTOR(8 downto 0) := (others => '1'); -- Registro de cambio para recibir datos
    signal Bit_Counter       : INTEGER := 0; -- Contador de bits recibidos
    signal Parity_Bit        : STD_LOGIC := '0'; -- Bit de paridad recibido
    signal Parity_Error      : STD_LOGIC := '0'; -- Error de paridad
 
begin
    process(CLK)
    begin
        if rising_edge(CLK) then
            -- Reset de error cuando se activa CLR_Error
            if CLR_Error = '1' then
                Error <= '0';
            end if;
 
            -- Detectar el inicio de la recepción
            if Rx = '0' and Rx_Shift_Register(8) = '1' then
                Bit_Counter <= 0;
            end if;
 
            -- Contar bits y almacenar en el registro
            if Bit_Counter > 0 and Bit_Counter <= 8 then
                Rx_Shift_Register(Bit_Counter) <= Rx;
                Bit_Counter <= Bit_Counter + 1;
            end if;
 
            -- Recibir bit de paridad
            if Bit_Counter = 9 then
                Parity_Bit <= Rx;
                Bit_Counter <= Bit_Counter + 1;
            end if;
 
            -- Recibir bit de stop y verificar paridad
            if Bit_Counter = 10 then
                if Rx = '1' then
                    -- Verificar paridad
                    if Parity_Bit /= Parity_Bit_XOR then
                        Parity_Error <= '1';
                        Error <= '1';
                    end if;
 
                    -- Asignar datos a la salida
                    Data <= Rx_Shift_Register(7 downto 0);
                    Rx_Rdy <= '1';
                else
                    Error <= '1';
                end if;
 
                -- Resetear registros
                Rx_Shift_Register <= (others => '1');
                Bit_Counter <= 0;
                Parity_Bit <= '0';
            else
                Rx_Rdy <= '0';
            end if;
        end if;
    end process;
 
end Behavioral;

Ten en cuenta que este código es solo un punto de partida. Deberás adaptarlo a tus necesidades y realizar pruebas exhaustivas para asegurarte de que funcione correctamente en tu plataforma específica. Es recomendable simular el diseño en un simulador VHDL antes de implementarlo en hardware.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar