Detección de secuencias (máquina de estado FSM)

Generación y detección de secuencias (máquina de estado FSM)

提示:FSM有限状态机,是FPGA和数字IC相关岗位必须要掌握的知识点,在笔试和面试中都非常常见。



prefacio

Preguntas de la prueba escrita:
1. Comprender la máquina de estados: ¿qué es una máquina de estados tipo Moore, qué es una máquina de estados tipo Milley y cuál es la diferencia entre las dos? ¿Cuál es la diferencia entre las máquinas de estado de una, dos y tres etapas?

2. Use la máquina de estado para generar la secuencia "1101_0110" y envíe la secuencia en un bucle en serie;

3. Use la máquina de estado para detectar "1101", la secuencia de prueba de entrada en serie es "11101101011010", la señal de salida es una señal válida, cuando se detecta, la salida es alta, de lo contrario es baja, considerando la superposición de secuencia, como "1101101", luego hay Dos "1101", a saber:

1 1101 101011010, la secuencia se detecta en el quinto reloj y el siguiente reloj emite un nivel alto;
1110 1101 011010, la secuencia se detecta en el octavo reloj y el siguiente reloj emite un nivel alto;
111011010 1101 0, en el 13. El reloj detecta la secuencia y el siguiente reloj emite un nivel alto;

Proporcione informes en versión WORD o PDF, incluidos, entre otros, descripciones de texto, códigos, gráficos de prueba de simulación, etc.


1. Concepto básico de máquina de estados

Máquina de estado : La máquina de estado se compone de registros de estado y circuitos lógicos combinacionales, que se pueden transferir de acuerdo con el estado preestablecido de acuerdo con la señal de control. Es un centro de control para coordinar acciones relacionadas y completar operaciones específicas. La máquina de estado finito es llamado FSM, que se divide principalmente en dos categorías:

  1. Máquina de estado de Moore: la salida solo está relacionada con el estado, es decir, solo depende del estado actual y no tiene nada que ver con la entrada;
  2. Máquina de estado harinoso: la salida no solo está relacionada con el estado, es decir, no solo depende del estado actual, sino también de la entrada;

Punto clave: al realizar la misma función, el tipo Mealy ahorra un estado que el tipo Moore, y el tipo Mealy está un ciclo de reloj por delante del tipo Moore.

  1. Un segmento : un bloque siempre, que no solo describe la transición de estado, sino que también describe la entrada y salida del estado, y el estado actual se emite mediante registros.
  2. Tipo de dos etapas : dos bloques siempre, la lógica secuencial y la lógica combinacional están separados, un bloque siempre usa sincronización síncrona para describir la transición de estado; el otro usa lógica combinacional para juzgar las condiciones de transición de estado, describe las reglas y salidas de transición de estado y usa lógica combinacional para generar el estado actual Pueden ocurrir peligros competitivos, se crean fallas y las restricciones no son propicias.
  3. Tipo de tres segmentos : tres bloques siempre, un bloque siempre usa sincronización sincrónica para describir la transición de estado; uno usa lógica combinacional para juzgar las condiciones de transición de estado y describe las reglas de transición de estado; el tercero usa sincronización sincrónica para describir la salida de estado y registrar la salida.

2. Use la máquina de estado para generar la secuencia "1101_0110" y envíe la secuencia en un bucle en serie

1. Introducir preguntas básicas de prueba escrita

  1. Para generar la señal de secuencia 1101_0111, ¿se requiere al menos un disparador de nivel ______?

    El estado de 8 bits se puede representar con 2^3=8 y se requieren al menos 3 niveles de flip-flops.

  2. Para generar una señal de secuencia 1101_0111, si se usa un registro de desplazamiento , ¿se requieren al menos ______ flip-flops de nivel?

    Requiere un activador de nivel 5. 11010111 Ejemplo de ciclo de desplazamiento a la izquierda:
    Nivel 4: 1101–1010—0101—1011—0111— 1111—1111—1110—1101 , repetido, no permitido Nivel 5 11010—10101—01011—10111—11111—11110—11101—:

2. FSM genera señales de secuencia

El código para generar la señal de secuencia 11010110 por desplazamiento cíclico es el siguiente (ejemplo):

module  FSM2
(
   input  wire  sys_clk     ,
   input  wire  sys_rst_n   ,
   output reg   data_1 ,
   output wire   data       
);

reg [7:0] data_reg = 8'b1101_0110 ;

always @ ( posedge sys_clk or negedge sys_rst_n ) 
 if( !sys_rst_n ) 
  data_reg <= 8'b1101_0110;
 else  
  data_reg <= {
    
    data_reg[6:0],data_reg[7]};//位拼接符号实现循环移位 
   
assign  data = data_reg[7];//阻塞赋值(=),右侧有变化就立即变化
//非阻塞赋值(<=),右侧有变化,下一个时钟沿变化
always@(posedge sys_clk or negedge sys_rst_n)
    if(!sys_rst_n)
        data_1 <= 1'b0 ;
    else 
        data_1 <= data_reg[7] ;
endmodule

código de simulación sim (ejemplo):

`timescale 1ns/1ns
module tb_FSM2();
  reg  sys_clk   ;
  reg  sys_rst_n ;
  wire data_1   ;
  wire data;

initial begin
    sys_clk = 1'b0  ;
    sys_rst_n <= 1'b0;
    #30
    sys_rst_n <= 1'b1;
    #800
    $stop;
    end
    
always#10 sys_clk = ~sys_clk;
  
FSM2 FSM2_inst
(
   .sys_clk   (sys_clk  )  ,
   .sys_rst_n (sys_rst_n)  ,
   .data_1    (data_1   )   ,  
   . data     ( data    )  
);
endmodule

inserte la descripción de la imagen aquí


3. Secuencia de detección de secuencia FSM "1101"

  • IDEL: estado inicial, si se detecta 1, vaya a S1 (1), de lo contrario, mantenga IDEL;
  • S1 (1): si se detecta 1, vaya a S2 (11), de lo contrario, regrese a IDEL;
  • S2 (11): si se detecta 0, pase a S3 (110), de lo contrario, mantenga S2;
  • S3 (110): si se detecta 1, vaya a S4 (1101), de lo contrario, regrese a IDEL;
  • S4 (1101): si se detecta 1, vaya a S2 (11), de lo contrario, vuelva a IDEL.

使用Moore状态机最终输出和输入无关,只要S4有输入就输出1,故采用Moore型三段式FSM有限状态机。

Secuencia de detección de FSM 1101 (ejemplo):

module  FSM
(
   input  wire  sys_clk     ,
   input  wire  sys_rst_n   ,
   input  wire  data_in           ,
   output reg   data_valid       
);

parameter   IDEL = 5'b00001 ,
            S1   = 5'b00010 ,
            S2   = 5'b00100 ,
            S3   = 5'b01000 ,
            S4   = 5'b10000 ;

reg[4:0] current_state  ;
reg[4:0] next_state     ;
//第一段同步时序逻辑,描述状态切换
  always@(posedge sys_clk)
      if(!sys_rst_n)
          current_state <= IDEL   ;
      else
          current_state <=  next_state ;
//第二段组合逻辑,判断状态转移条件和规律.这里=和<=没区别
    always@(*)
        if(!sys_rst_n)
            next_state <= IDEL  ;
        else 
            case(current_state)
                IDEL    :if(data_in == 1)   next_state <= S1; else next_state <= IDEL;
                S1      :if(data_in == 1)   next_state <= S2; else next_state <= IDEL;
                S2      :if(data_in == 0)   next_state <= S3; else next_state <= S2  ;
                S3      :if(data_in == 1)   next_state <= S4; else next_state <= IDEL;
                S4      :if(data_in == 1)   next_state <= S2; else next_state <= IDEL;
                default : next_state <= IDEL  ;
            endcase
//第三段同步时序逻辑,描述状态输出,Moore型输出:只要S4有输入就输出1
    always@(posedge sys_clk)
        if(!sys_rst_n)
            data_valid <= 1'b0;
        else 
            case(next_state)
                S4      :data_valid <= 1'b1;
                default :data_valid <= 1'b0;
            endcase
endmodule

inserte la descripción de la imagen aquí

Código de simulación Sim, secuencia de prueba "11101101011010" para entrada en serie, la máquina de estado detecta "1101", (ejemplo):

`timescale 1ns/1ns
module tb_FSM();
  reg  sys_clk   ;
  reg  sys_rst_n ;
  reg  data_in   ;
  wire data_valid;

initial begin
    sys_clk = 1'b0  ;
    sys_rst_n <= 1'b0;
    data_in <= 1'b0 ;
    #30
    sys_rst_n <= 1'b1;
    #30
    data_in <= 1'b1 ; #20;//延迟是一个周期
    data_in <= 1'b1 ; #20;
    data_in <= 1'b1 ; #20;
    data_in <= 1'b0 ; #20;
    data_in <= 1'b1 ; #20;
    data_in <= 1'b1 ; #20;
    data_in <= 1'b0 ; #20;
    data_in <= 1'b1 ; #20;
    data_in <= 1'b0 ; #20;
    data_in <= 1'b1 ; #20;
    data_in <= 1'b1 ; #20;
    data_in <= 1'b0 ; #20;
    data_in <= 1'b1 ; #20;
    data_in <= 1'b0 ; #20; 
    #150
    $stop;
    end
    
always#10 sys_clk = ~sys_clk;
  
FSM  FSM_inst
(
   .sys_clk   (sys_clk   ) ,
   .sys_rst_n (sys_rst_n ) ,
   .data_in   (data_in   ) ,
   .data_valid(data_valid) 
);
endmodule

inserte la descripción de la imagen aquí


Resumir

  • 在序列产生处:通过位拼接符号实现循环移位
  • 在序列产生处:阻塞赋值和非阻塞赋值的区别,两个信号都进行了对比
  • 在序列检测处:三段式状态机写代码的特点
  • 在序列检测处:第三段时,Moore状态机和Mealy状态机输出的区别

Al principio, el efecto de la simulación no era correcto y finalmente descubrió que el retraso después de la entrada data_in no estaba sincronizado con el ciclo del reloj, no con 20 ns.

Supongo que te gusta

Origin blog.csdn.net/Lethe_01/article/details/124813845
Recomendado
Clasificación