Tema Descripción
Escriba un módulo de detección de secuencia para detectar si la señal de entrada a satisface la secuencia 01110001, y cuando la señal satisface la secuencia, se proporciona una coincidencia de señal de indicación.
El diagrama de señal de interfaz del módulo es el siguiente:
El diagrama de tiempos del módulo es el siguiente:
Utilice Verilog HDL para lograr las funciones anteriores
Introduzca una descripción:
clk: señal del reloj del sistema
rst_n: señal de reinicio asíncrona, activa baja
a: señal de un solo bit, datos a detectar
Descripción de salida:
coincidencia: cuando la señal de entrada a satisface la secuencia objetivo, la señal es 1 y la señal es 0 en otros momentos
ideas para resolver problemas
Para determinar que la secuencia en serie es igual a la secuencia objetivo, primero es necesario convertir la secuencia en serie en un número igual al ancho de bits de la secuencia objetivo;
Entonces, nuestra idea es definir un registro de desplazamiento para recibir datos de entrada en serie y luego usar el registro de desplazamiento para comparar con la secuencia objetivo. El código de implementación específico es el siguiente:
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input a,
output reg match
);
parameter GOAL_SER = 8'b01110001 ;
reg [7:0] sft_reg ;
always@(posedge clk or negedge rst_n)begin
if(~rst_n)begin
sft_reg <= 8'hFF ; // 复位值给全1
end else begin
sft_reg <= {sft_reg[6:0],a};
end
end
always@(posedge clk or negedge rst_n)begin
if(~rst_n)begin
match <= 1'd0 ;
end else if(sft_reg == GOAL_SER ) begin
match <= 1'b1 ;
end else begin
match <= 1'd0 ;
end
end
endmodule
Preste atención a un detalle aquí, porque el bit más alto de la secuencia objetivo es 0 y nuestro registro de desplazamiento cambia de bajo a alto;
Si el reinicio es todo 0, entonces si la primera secuencia después del reinicio es 111001x, la secuencia objetivo en realidad no se cumple en este momento
Pero estar satisfecho será un error.