Máquina de estados finitos para encontrar el divisor común más grande

0

Ok, así que aquí está el problema que tenemos:

Considere la siguiente ruta de datos. Supongamos que el ancho de la ruta de datos n es 4.

La ALU tiene un código de operación de 1 bit OP. Si OP = 0, la ALU realiza A-B. Si OP = 1, la ALU realiza B-A. El circuito de comparación genera un código de comparación de 2 bits CC. CC = 00 si A = B. CC = 01 si A > B. CC = 10 si A < SEGUNDO. El algoritmo de Euclides puede encontrar el Divisor común más grande (GCD) de dos enteros positivos, que se da a continuación:

LOAD A
LOAD B
WHILE (A != B) DO
IF (A > B) THEN
A = A – B
ELSE
B = B – A

// GCD (A, B) se almacena en los registros A y B Diseñe un FSM de tipo Mealy para controlar la ruta de datos para encontrar el GCD de 14 y 4. El FSM debe establecer un Salida ENCONTRADA a 1 cuando se encuentra el GCD.

Simplemente no entiendo cómo empezar a hacer este buscador de GCD ... ¡Me encantaría recibir ayuda con esto!

    
pregunta Tyler Dahle

1 respuesta

1

En realidad, todo está escrito, solo necesitas un par de registros y un poco de lógica combinatoria. Comenzaré a escribir cómo creo que puede hacer que la máquina defina entradas y salidas al diseñarla.

Supongamos que comienza en su estado \ $ S_0 \ $, ese es su estado de "entrada". Lo primero es lo primero, cargar los dos registros. En la primera transición necesitarás: $$ \ begin {cases} \ textbf {LDA} = 1 & \ textit {para escribir en A} \\ \ textbf {LDB} = 0 & \ textit {no quieres escribir en B} \\ \ overline {\ textbf {W}} = 0 & \ textit {para escribir} \ end {cases} $$ En el segundo, por supuesto: $$ \ begin {cases} \ textbf {LDB} = 1 & \ textit {para escribir en B} \\ \ textbf {LDA} = 0 & \ textit {no quieres escribir en A} \\ \ overline {\ textbf {W}} = 0 & \ textit {para escribir} \ end {cases} $$

Ahora estás en otro estado, recuerda que pasaste por un estado "silencioso". Las dos últimas transiciones son condicionales, es decir, no dependen de las entradas.

Llamemos a tu estado actual \ $ S_L \ $, L como en bucle. Ahora estamos implementando el algoritmo de Euclides tal como lo escribiste. En primer lugar, cuando A = B necesitamos salir del bucle y decirle al mundo exterior que hemos terminado, por lo que otra transición sería: $$ \ textbf {if} \ textbf {CC} = 00 \ rightarrow S_ {end}, \ \ textbf {F} = 1, \ \ textbf {LDA} = 0, \ \ textbf {LDB} = 0 $$ Hay dos transiciones más de interés, el aporte importante del curso es CC: $$ \ textbf {if} \ textbf {CC} = 01 \ rightarrow S_ {L}, \ textbf {F} = 0, \ \ textbf {OP} = 0, \ \ textbf {W} = 1, \ \ textbf {LDA} = 1, \ \ textbf {LDB} = 0 $$ $$ \ textbf {if} \ textbf {CC} = 10 \ rightarrow S_ {L}, \ \ textbf {F} = 0, \ \ textbf {OP} = 1, \ \ textbf {W} = 1, \ \ textbf {LDA} = 0, \ \ textbf {LDB} = 1 $$ Estoy llamando "ENCONTRADO" solo "F". Todas las salidas que no están especificadas en una transición pueden tratarse como "no importa"

Finalmente, alrededor de \ $ S_ {final} \ $, es posible que desee permanecer en él manteniendo \ $ \ textbf {F} = 1 \ $.

Resumiendo:

Estados : \ $ S_0, S_1, S_L, S_ {final} \ $

Entradas : CC Salidas : LDA , LDB , W , OP

Usted tiene todo lo que necesita para sintetizar el FSM, regrese si también necesita ayuda con eso.

    
respondido por el Vladimir Cravero

Lea otras preguntas en las etiquetas