¿Cómo verificar la recepción de datos de 16 bits mediante un terminal en serie?

0

Estoy usando un código UART vhdl FPGA para enviar 16 bits de datos con un bit de inicio 1, 1 bits de parada e incluso un bit de paridad. Necesito verificar si los paquetes de 16 bits enviados se reciben correctamente usando un software de terminal en Windows PC. Hice una investigación en google y encontré muchos terminales que solo permiten 8 bits de datos con paridad check + start + stop bits, en mi caso son 16 bits. Entonces, ¿cómo puedo monitorear estos 16 bits de datos usando un terminal?

Actualizado,

He realizado algo como esto (pseudo-código) y no funcionó

X_16_bit - > Datos de 16 bits X_16_bit - > AB

A --- > 8 bits superiores

B --- > 8 bits más bajos

este X_16_bit de 16 bits se actualiza cada 0,5 segundos. En un proceso sincronizado de 50MHz, en el mismo proceso, lo hago por debajo de la operación. (no funcionó)

x < = 0; y y < = 0; se inicializan como variables dentro del proceso por debajo

process(clk_50)
variable x  : STD_LOGIC:= '0';
variable y  : STD_LOGIC;
variable A  : std_logic_vector(7 downto 0)              := x"00";
variable B  : std_logic_vector(7 downto 0)              := x"00";
variable X_16_bit   : std_logic_vector(15 downto 0)             := x"0000";

begin

                  ------------------------
***THE CODE THAT calculates X_16_bit at every 0.5 seconds*** 
                   -----------------------

//SPLITTING code runs in 50MhZ clocked process 

if (x ='0'){ // stop A and B is being mixing with a new value
 A :=  X_16_bit(15 downto 8);
 B :=  X_16_bit(7 downto 0);
}

if (x='0'){ // 1stly send upper 8 bits
  tx_data <= A;
  y:=1;
  x:=1;
}
if (y='0'){ // 2ndly send lower 8 bits 
  tx_data <= B;
  x:=0;
}
y:='0';
end process;

se solucionó el siguiente error, tx_data es una señal que se usa para transmitir datos en el proceso del transmisor tx tengo error

 Error (10028): Can't resolve multiple constant drivers for tx_data

El transmisor UART es otro proceso que utilizo velocidad de transmisión de 19200, incluso paridad el VHDL que he usado es en este enlace

ACTUALIZADO

process(clk_50)
variable x  : STD_LOGIC:= '0';
variable y  : STD_LOGIC;
variable A  : std_logic_vector(7 downto 0)              := x"00";
variable B  : std_logic_vector(7 downto 0)              := x"00";
variable X_16_bit   : std_logic_vector(15 downto 0)             := x"0000";

begin

                  ------------------------
***THE CODE THAT calculates X_16_bit at every 0.5 seconds*** 
                   -----------------------

//SPLITTING code runs in 50MhZ clocked process 

ACTUALIZADO

        X_16_bit := x"4563";
        IF(x = '0') THEN     
            A := X_16_bit (15 downto 8);                        
            B := X_16_bit (7 downto 0);
            tx_data <= A;   
            x := '1';

        ELSIF(x = '1') THEN 
            tx_data <= B;                       
            x := '0';
        END IF;
end process;

ACTUALIZADO Con este código obtengo solo 63 en la salida tx. No consigo 45 en absoluto.

    
pregunta oppo

2 respuestas

0

Lamentablemente, el fragmento de código que proporcionó no proporciona suficiente información para que pueda darle una respuesta definitiva. No sabemos qué representan A, B, X o Y. También su VHDL tiene una serie de problemas. 1) Tiene CLK_50 en la lista de sensibilidad de proceso, pero nunca hace referencia a esa señal. 2) Parece que está escribiendo código de tipo C que es secuencial, en lugar de código VHDL. Todo el código VHLD se ejecutará cada vez que cambie la señal del reloj, de bajo a alto o de alto a bajo. Las señales solo obtendrán los valores que se asignan por última vez en un proceso.

Dejando eso de lado, su UART no puede aceptar nuevos datos hasta que su código verifique que el UART está listo para aceptar el segundo carácter. Debe verificar la señal de TX_READY del UART antes de enviar otro carácter.

Buena suerte.

    
respondido por el Paul S
0

La respuesta básica es que no puedes. Al menos no con el formato que está utilizando.

Para utilizar un terminal existente, debe cumplir con un tipo de datos estándar. Eso es 7 u 8 bits de datos con o sin paridad con uno o más bits de parada y un bit de inicio. Eso es un mínimo de dos caracteres de 9 o 10 bits. Ya sea para 18, 20 o 22 bits en total. Esto debe ser una limitación de hardware.

Está enviando 19 bits: bit de inicio, 16 bits de datos, bit de paridad y un bit de parada.

Lo mejor que puede hacer es configurar el terminal en 8 bits de datos y sin paridad, y esperar que el software del terminal ignore los errores de trama. Pero incluso entonces dos bits de datos se interpretarán como un bit de inicio y un bit de parada. Si sus datos no son cero en esa posición, el marco estará desactivado.

Es posible que algunos USARTs de PC puedan manejar formatos seriales no estándar como el suyo. Pero es muy probable que el uso de esa capacidad requiera escribir su propio controlador de bajo nivel.

Puede interponer un poco de hardware con un USART compatible que puede manejar su formato de datos y lo analiza en dos caracteres estándar de 8 bits separados para enviar a la PC.

    
respondido por el Edgar Brown

Lea otras preguntas en las etiquetas