Un método para implementar la grabación de secuencia de eventos (SOE) basada en FPGA

Un método para implementar la grabación de secuencia de eventos (SOE) basada en FPGA

Intruducción y resumen general

Este es el primer blog que escribo y realmente trata sobre las funciones de una aplicación desarrollada por mí en el trabajo.
Como sugiere el nombre, Secuencia de eventos (SOE) significa que el sistema registra cambios en los eventos en un momento determinado y se usa ampliamente en sistemas de control industrial. En el campo del control industrial, como plantas de conservación de agua, plantas de energía, subestaciones y otros escenarios de aplicación, la información de eventos SOE requiere una alta resolución de milisegundos para distinguir la secuencia de cambios de estado de cada señal de interruptor, que se utiliza principalmente cuando ocurre un accidente. Registra la hora exacta de los múltiples cambios de señal de entrada del interruptor para ayudar a identificar la causa del accidente en caso de accidente. Se puede decir que SOE es un equipo importante para el monitoreo, registro y análisis de accidentes del estado operativo en sistemas de control industrial, y es una función necesaria de los sistemas de control industrial.
Este artículo proporcionará un método para implementar la función de grabación de eventos SOE basada en FPGA: utiliza el equipo de cronometraje GPS + Beidou para sincronizar la hora con el reloj interno en tiempo real de FPGA y utiliza la marca de tiempo sincronizada después de la sincronización de hora para la grabación de eventos, lo que puede logra una resolución de nivel de ms, y el modo de activación de la grabación de eventos se puede programar y configurar directamente en la FPGA.

Diagrama de bloques del sistema

Insertar descripción de la imagen aquí
El sistema de cronometraje GPS+Beidou proporciona la hora UTC estándar y señales de segundo pulso PPS. El módulo de la CPU obtiene la hora UTC estándar del sistema de cronometraje y la envía al módulo FPGA a través del bus después de la conversión de formato. Cuando llega el segundo pulso PPS, el oscilador de cristal interno en la FPGA El reloj en tiempo real generado se sincroniza con la hora mundial estándar proporcionada por la CPU a la FPGA, y la marca de tiempo sincronizada se utiliza para la grabación de eventos. El valor del interruptor se ingresa desde el exterior y el valor (0 o 1) en ese momento se registra cuando el valor del interruptor cambia. Estos datos se denominan datos de registro de eventos. Cuando se enciende el ARM, se leen los datos de registro de eventos modificados. en tiempo real y almacenado en caché en Flash. Cuando el ARM está apagado, los datos se escriben en el caché de RAM de doble puerto de la FPGA. Finalmente, la CPU lee los datos en la RAM de doble puerto de la FPGA y los carga en la computadora host para mostrar.

Sincronización horaria

El paso más importante de SOE es sincronizar la hora interna de la FPGA con la hora mundial estándar. Sólo sincronizando con precisión la hora se pueden registrar con precisión los cambios que ocurren en un momento determinado. Esta función utiliza la sincronización de segunda hora para sincronizar la hora de la FPGA cuando llega el segundo pulso de PPS. El método específico es el siguiente:
juzgue en la FPGA que si la hora enviada por la CPU difiere del reloj de tiempo real dentro de la FPGA en más de 1s, la hora se sincronizará cuando llegue la segunda señal PPS. Los dos están sincronizados.
El método de ajuste de tiempo consiste en asignar directamente el segundo bit de la hora emitido por la CPU (es decir, los 32 bits superiores) al segundo bit del reloj interno en tiempo real de la FPGA (es decir, los 32 bits superiores), y borre el bit de milisegundos del reloj en tiempo real de la FPGA (es decir, los 32 bits bajos) a 0.
Si la diferencia entre los dos tiempos está dentro de 1 segundo, cambia a la autocorrección interna del reloj en tiempo real de la FPGA, es decir, el segundo bit aumenta automáticamente.
(Explicación: ¿Por qué deberíamos juzgar si la diferencia de tiempo entre los dos es 1? Debido a que la señal PPS es una segunda señal de sincronización de tiempo, corresponde al tiempo debajo del segundo dígito, por lo que el comportamiento de sincronización de tiempo entre segundos no siempre ocurre , de lo contrario provocará que el tiempo después del ajuste de tiempo se produzca el fenómeno de reversión.)

Diseño de código Verilog (solo como referencia)

`define SYS_CLK_PERIOD	32'd20
module sycn_time(
	input wire clk,
	input wire pps,
	input wire rst,
	input wire [63:0] cpu_time,
	output reg [63:0] time_sync
);
assign  time_sync = rtc;
reg [63:0] rtc;
reg pulse;
reg pulse1;
assign pulse1 = (rtc[31:0] >= (32'd100_000_000 - `SYS_CLK_PERIOD));

always @(posedge clk,posedge rst)begin
	if(rst)begin
		pulse <= 1'b0;
    end
    else
    begin
		if(pps)
		begin
			pulse <= 1'b0;
		end
		else if(((rtc[63:32] - cpu_time[63:32] > 1) && (rtc[63:32] > cpu_time[63:32])) || ((cpu_time[63:32] - rtc[63:32]  > 1) && (cpu_time[63:32] > rtc[63:32] )) )
		begin
			pulse <= 1'b1;
		end
		else
		begin
			pulse <= pulse;
		end
	end
end

always @(posedge clk,posedge rst)begin
	if(rst)begin
		rtc <= 64'b0;
    end
    else
    begin
		if(pps && pulse)
		begin
			rtc[63:32] <= cpu_time[63:32];
			rtc[31:0] <= 32'd0;
		end
		else if(pps || pulse)
		begin
			rtc[63:32] <= rtc[63:32]  + 1'b1;
			rtc[31:0] <= 32'd0;
		end
		else
		begin
			rtc[63:32] <= rtc[63:32];
			rtc[31:0] <= rtc[31:0]  + `SYS_CLK_PERIOD;
		end
	end
end
endmodule

Detección de cambio de pulso y cambio de modo (diseño de código Verilog, solo como referencia)

module pulse_cmp(
	input wire clk,
	input wire DI,
	input wire rst,
	input wire Mode,
	output reg trigger_pulse
);
reg DI_dly;

always @(posedge clk,posedge rst)begin
	if(rst)begin
		DI_dly<= 0;
    end
    else
    begin
		trigger_pulse <= 0;
		DI_dly <= DI;
		if(((Mode == 2'b00) || (Mode == 2'b11)) && (DI_dly != DI))	//双边沿触发模式
		begin
			trigger_pulse  <= 1;
		end
		else if((Mode == 2'b01) && (DI_dly > DI))		//下降沿触发模式
		begin
			trigger_pulse  <= 1;
		end
		else if((Mode == 2'b10) && (DI_dly < DI))		//上升沿触发模式
		begin
			trigger_pulse  <= 1;
		end
	end
end
endmodule

Este módulo está diseñado principalmente para detectar cambios en el valor del interruptor de entrada (valor DI). La señal trigger_pulse es la señal de disparo cuando cambia DI. El modo puede ser ingresado por la computadora host para lograr el modo de disparo controlable.

Almacenamiento en caché y lectura y escritura de datos de registros de eventos

Este módulo es relativamente un módulo central y no es conveniente proporcionar código aquí. Permítanme hablar brevemente sobre la idea de diseño. De hecho, es almacenar en caché los datos grabados en la RAM de doble puerto y luego realizar operaciones de lectura y escritura en la RAM. Las operaciones de lectura y escritura requieren la correspondiente habilitación de lectura y escritura, lectura y direcciones de escritura. Este diseño se implementa comunicándose con ARM para operar la dirección de registro. Como se puede ver en el diagrama de bloques anterior, los datos se almacenarán en caché en el Flash de ARM, luego serán leídos por el módulo de la CPU y finalmente cargados en el computadora host para su visualización.

resultado

Los resultados finales después de la prueba son los siguientes: Lo siguiente es sin sincronización de tiempo y en el modo de disparo de flanco ascendente (solo se proporciona una entrada DI, debido a que es un disparador de flanco ascendente, por lo que estos datos solo se registrarán en el nivel alto 1) Obtenga los resultados registrados.
Además, cabe señalar que el pulso de prueba que proporcioné se invierte una vez cada 10 ms (el período es de 20 ms), por lo que esta función puede registrar con precisión el momento en que cambia la DI proporcionada por el usuario.
Insertar descripción de la imagen aquí
Finalmente, actualizaré mis conocimientos sobre FPGA de vez en cuando y resumiré las preguntas que encontré en el trabajo. Los amigos interesados ​​pueden comunicarse a través de mensajes privados (solo se responderán preguntas técnicas). Lo anterior es mi tecnología personal en el trabajo. En conclusión, corríjame si hay algún problema y no lo reimprima sin permiso.

Supongo que te gusta

Origin blog.csdn.net/m0_51575600/article/details/129503141
Recomendado
Clasificación