Diseño y verificación del módulo receptor de puerto serie para aprendizaje FPGA

Diseño y verificación del módulo receptor de puerto serie para aprendizaje FPGA

1. El propósito del experimento:

Realice una recepción de puerto serie, envíe datos a través de la computadora host, verifique si el módulo receptor del puerto serie recibe los datos.

2. Introducción al experimento:

Aprenda el principio de comunicación UART y su diseño de circuito de hardware, use FPGA para realizar el diseño de la parte receptora de datos de la comunicación UART y use la herramienta ISSP para llevar a cabo la verificación a nivel de placa.

3. Principio experimental

El módulo de envío del puerto serie mencionó el diagrama de secuencia de envío de un byte en el puerto serie, como se muestra en la siguiente figura:

Inserte la descripción de la imagen aquí
De hecho, cuando el módulo receptor del puerto serie recibe dichos bytes de temporización, se muestrea cada bit. En circunstancias normales, creemos que el punto medio de cada bit de datos es el más estable, por lo que el nivel en el medio de la colección es el Los datos de este bit. La secuencia de recepción del puerto serie específico se muestra en la siguiente figura:
Inserte la descripción de la imagen aquí
pero en las aplicaciones reales, no es confiable recopilar el bit medio de los datos solo una vez, y es fácil interferir y causar errores de datos. el experimento utiliza más métodos de recepción de datos de un solo bit Método de probabilidad de ocurrencia de nivel de comparación de submuestreo. (Src: "FPGA System Design and Verification Practical Guide_V1.2") Como puede ver
Inserte la descripción de la imagen aquí
en la figura anterior, un solo bit de datos se divide en 16 subsegmentos de manera uniforme. Los datos en este bit acaba de ocurrir y cambiarán ( la parte gris oscuro de la figura anterior) se considera extremadamente Durante el período inestable, se determina que el nivel de adquisición no es válido.

En el período intermedio (la parte gris claro de la figura anterior), se considera que los datos están en un estado estable, es decir, el método de muestreo intermedio, pero no se puede negar que el nivel de error se genera debido a interferencias durante este Por lo tanto, el nivel de este período se muestrea varias veces. Esta vez, el tiempo intermedio Muestreo 6 veces, después del muestreo, se calcula la probabilidad de ocurrencia de niveles altos y bajos, y el nivel de ocurrencias múltiples se considera como los datos nivel de la broca.

(1) Marco del sistema

Para la realización de todo el módulo receptor de puerto serie, comprenda los siguientes puertos de entrada y salida:

1. El reloj Clk y la señal de reinicio Rst_n son indispensables;

2. Al igual que la transmisión de puerto serie, seleccione diferentes señales de velocidad en baudios baud_set [2: 0];

3. Se aprende del puerto serie que los datos se transmiten bit a bit, y que la señal Rx232_Rx recibida por el módulo receptor es de solo 1 bit a la vez;

4. Una vez recibidos los datos, se debe requerir una señal Rx_Done de pulso alto de 1 ciclo de reloj;

5. Los datos recibidos se componen de [7: 0] salida de señal de byte de datos para su visualización.

Inserte la descripción de la imagen aquí

(2) Diseño detallado

Procesamiento de sincronización de entrada de datos

En el artículo antirrebote clave, se menciona que la señal clave debe procesarse sincrónicamente con señales asíncronas. De manera similar, cuando la señal Rx232_Rx cruza el dominio del reloj, también debe procesarse sincrónicamente con señales asíncronas, y cómo realizar la detección de bordes. Los principios específicos se describen en el capítulo clave antirrebote. La introducción detallada no se repetirá aquí.

Inserte la descripción de la imagen aquí

Módulo de generación de reloj de muestreo

De acuerdo con el módulo transmisor de puerto serie, el componente principal del módulo receptor de puerto serie es también el diseño de generación de reloj de velocidad en baudios.

La diferencia es que la recepción aquí utiliza muestreo de 16 puntos de un solo bit y la velocidad aumenta a 16 veces la original. Suponiendo que la velocidad de transmisión de transmisión original es de 9600 bps, la velocidad de transmisión de recepción actual es de 9600 * 16 = 153600 bps;

De acuerdo con la tabla de velocidad en baudios de envío del puerto serie anterior, calcule el valor de recuento de la división de frecuencia del diseño del módulo receptor. El código que se muestra en la siguiente tabla
Inserte la descripción de la imagen aquí
utiliza la relación correspondiente de la velocidad en baudios enviada por el puerto serie anterior, es decir, utilizando el aspecto LUT -up tabla para diseñar el selector y generar la velocidad en baudios Para el contador de división de frecuencia del reloj de velocidad, primero se reduce un conjunto de tres trucos. El código se muestra en la figura siguiente. Excepto por el valor de conteo diferente de bps_cnt, el el resto es coherente con la transmisión del puerto serie.

Inserte la descripción de la imagen aquí

Diseño de conteo de reloj de muestreo

Cuando el reloj de muestreo bps_clk que necesitamos esté disponible, el siguiente paso es comenzar a contar el flanco ascendente del reloj.
Inserte la descripción de la imagen aquí
Como se muestra en la figura anterior, bit de inicio + 8 bits de datos + bit de parada, cada bit se muestrea 16 veces y el valor de recuento debe borrarse después de 160 muestras.

También existe la detección del bit de inicio. Sabemos que el bit de inicio START_BIT es en realidad un nivel bajo continuo, pero ¿cómo juzgar que el bit de inicio es una señal de interferencia en lugar del bit de inicio real?

Ahora, cuando hay un flanco descendente en la línea de datos, asumiendo que es el bit de inicio en este momento, entonces el resultado acumulativo del valor calculado obtenido de las 6 muestras intermedias es mayor que 2, entonces se puede ver que al menos la mitad de las 6 muestras intermedias son altas, lo que no se satisface La señal de inicio sigue siendo de nivel bajo, por lo que se puede juzgar que la señal en la línea de datos es una señal de interferencia en este momento. (Src: "Guía práctica de verificación y diseño de sistemas FPGA_V1.2")

Inserte la descripción de la imagen aquí

Módulo receptor de datos

Después de que los datos que recibimos estén sincronizados, eventualmente deberán ser transferidos a data_byte [7: 0], pero probamos cada bit 16 veces, tomando el medio 6 veces, por lo que se requiere un proceso de valor de transición intermedio.

Por lo tanto, el primer paso es acumular primero el valor de 6 muestras de cada bit de los datos de 10 bits y asignarlo a cada bit, y luego sumar 4 (cuando aparece 111000, el diseño no se ocupa de ello, y el número de veces 1 o 0 es 4 veces. 110000, 111100) para obtener este bit de datos.

(1) El primer paso: acumulación de 6 valores de muestreo

Inserte la descripción de la imagen aquí
En comparación con el valor del gráfico de tiempo en la figura anterior, cuando el valor de conteo de bps_cnt es 6, 7, 8, 9, 10, 11, son las 6 muestras del medio. Necesitamos acumular estos 6 valores y asignar ellos al bit START_BIT, y el resto de los datos es el mismo.

Entonces, aquí necesitamos definir un ram, registrar los datos de 8 bits del medio y definir el bit de inicio y el bit de parada por separado, de modo que el ram tenga una dirección de 8 bits y cada bit tenga 3 bits de ancho.

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

(2) Paso 2: Compare la relación entre 8 bits de datos y 4

¿Cómo determinan los 8 bits de datos intermedios qué datos son? Aquí (src: "FPGA System Design and Verification Actual Combat Guide_V1.2") proporciona una comparación de bits altos, porque 3 (011) y 4 (100) tendrán una conversión de bits alta, por lo que cuando el bit más alto del valor de registro de bits de datos es 1 o 0 Se puede concluir si el bit es 1 o 0.
Inserte la descripción de la imagen aquí

4. Depuración y simulación experimental

1. Simulación funcional

1. Utilice la salida del módulo de envío de datos del puerto serie en el artículo anterior para realizar la entrada de los datos del módulo bajo prueba, por lo que solo necesita conectar el Rx232_Tx del módulo de envío al Rx232_Rx en el módulo de recepción.

//--------------------------------------------------------------------------------------------
//      Component name  : uart_rx_tb	
//      Author          : 硬件嘟嘟嘟
//      time            : 2020.04.23
//      Description     : 串口发送模块
//      src             : FPGA系统设计与验证实战指南_V1.2
//--------------------------------------------------------------------------------------------
`timescale 1ns/1ns
`define clk_period 20

module uart_rx_tb;

	reg Clk;
	reg Rst_n;
	
	wire [7:0]data_byte_r;
	wire Rx_Done;	
	
	reg [7:0]data_byte_t;
	reg send_en;
	reg [2:0]baud_set;
	
	wire Rx232_Tx;
	wire Tx_Done;
	wire uart_state;
	
	uart_rx uart_rx(
		.Clk(Clk),
		.Rst_n(Rst_n),
		.baud_set(baud_set),
		.Rx232_Rx(Rx232_Tx),
		
		.data_byte(data_byte_r),
		.Rx_Done(Rx_Done)
	);
	
	uart_tx uart_tx(
		.Clk(Clk),
		.Rst_n(Rst_n),
		.data_byte(data_byte_t),
		.send_en(send_en),
		.baud_set(baud_set),
		
		.Rx232_Tx(Rx232_Tx),
		.Tx_Done(Tx_Done),
		.uart_state(uart_state)
	);
	
	initial Clk = 1;
	always#(`clk_period/2)Clk = ~Clk;
	
	initial begin
		Rst_n = 1'b0;
		data_byte_t = 8'd0;
		send_en = 1'd0;
		baud_set = 3'd4;
		#(`clk_period*20 + 1 );
		Rst_n = 1'b1;
		#(`clk_period*50);
		data_byte_t = 8'hbb;
		send_en = 1'd1;
		#`clk_period;
		send_en = 1'd0;
		
		@(posedge Tx_Done)
		
		#(`clk_period*5000);
		data_byte_t = 8'h66;
		send_en = 1'd1;
		#`clk_period;
		send_en = 1'd0;
		@(posedge Tx_Done)
		#(`clk_period*5000);
		$stop;	
	end


endmodule

Verifique si la salida de la forma de onda es consistente con el diseño en la simulación funcional
Inserte la descripción de la imagen aquí

2. Depuración a nivel de placa

La información enviada por el puerto serie se puede leer correctamente en ISSP.

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/sinat_41653350/article/details/105713332
Recomendado
Clasificación