1 votos

Diseño de un FSM de Cerradura de Combinación: Convertir el Diagrama de Estados a Puertas Lógicas

Estoy tratando de diseñar un bloqueo de combinación síncrono para mi clase de lógica digital. Tengo el diagrama de estado, ya que entiendo cómo dibujar la lógica que quiero seguir. Sin embargo, me resulta difícil convertir toda esta secuencia de pasos en lógica digital. Entiendo cómo crear una tabla de estados para cada uno de los estados y sus estados siguientes. Pero ¿cuántas tablas de estados necesito? Después de crear estas tablas, ¿cómo emito "U"? Todo esto es un poco ajeno para mí, y es difícil envolver mi cabeza alrededor.

Alguna aclaración para este diagrama. Quiero que la entrada "a" siempre se active cada vez que se presiona un botón de color (Rojo, Verde o Azul). Elegí abordar cada expresión de entrada como "arg'b'" donde podría haberlo simplificado a simplemente "ar" para contar un presionado del botón rojo porque quería asegurarme de que no pudieras simplemente presionar todos los botones y poder forzar la secuencia. La secuencia que quiero programar es presionar los botones [START][R][G][B][R] en ese orden.

Cualquier ayuda, consejo, enlaces a videos son muy apreciados. ¡Gracias! introduce la descripción de la imagen aquí

2voto

Brian Drummond Puntos 27798

Puedes hacerlo de la forma tradicional con pluma, tinta, tablas de estado, el Libro de Datos TTL, o simplemente escribirlo directamente en VHDL o Verilog, siguiendo el ejemplo parcial a continuación.

Qué enfoque es el mejor depende de las circunstancias.

Si esto es tarea, probablemente tengas que hacer lo primero.

Si te están pagando para lograr cosas, y no haces lo segundo, comienza a buscar un nuevo trabajo.

   type State   : State_Type is (Start, Red_1, ..., Wait);
   signal State : State_Type;
   signal argb  : std_logic_vector(3 downto 0);

   argb <= a & r & g & b; -- simplificar las pruebas de condiciones...

   Process(Clk) is
   begin 
      case State is
      when Start =>
         if argb = "1100" then
            State <= Red_1;
            u     <= '0';
         elsif a = '1' then
            State <= Wait;
            u     <= '0';
         end if;
      when -- y así sucesivamente para todos los demás estados 
      end case;
   end process;

0voto

Segal Eliezer Puntos 1

Te daré una versión de Verilog como referencia.

Paso 1: Asigna un valor binario diferente a cada estado que actualmente está nombrado en lenguaje humano.

parameter WAIT  = 3'h0;
parameter START = 3'h1;
...

Paso 2: La entidad DFF que contiene el estado actual. (Aquí asumo que el estado predeterminado es WAIT)

reg [2:0] st, st_nxt;
always@(posedge clk or negedge rstn)begin
  if(~rstn)begin
    st <= WAIT;
  end else begin
    st <= st_nxt;
  end
end

Paso 3: Una vez que todas las ramas de transición de estado están completas (todas las ramas posibles y sus prioridades están definidas), ahora puedes generar el próximo estado.

Considera el estado START:

estado actual  |        entrada      |  próximo estado
    START ------ a & (r & ~g & ~b) ---> RED1
            +--- a & ~(r & ~g & ~b) --> WAIT
            +-------- (otros) -------> (permanecer en START)

Codificaremos de la siguiente manera:

always@(*)begin
  case(st)
    START:begin
      if(a & (r & ~g & ~b))begin
        st_nxt = RED1;
      end else if(a & ~(r & ~g & ~b))begin
        st_nxt = WAIT;
      end else begin
        st_nxt = st;
      end
    end
    (código para otros estados)
    default: st_nxt = WAIT;
  endcase
end

Paso 3: Generar señales que son controladas por la máquina de estado.

Aquí simplemente afirmo u para todo el estado RED2. Puedes generar el tuyo si se necesita una salida secuencial u existen otros requisitos.

assign u = (st == RED2);

Finalmente, en el mundo real, también es posible que necesites considerar un tiempo de espera.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X