Bienvenido
a este blog relacionado con la electrónica digital. En
esta serie de entradas abordaremos en un inicio el diseño de
circuitos lógicos combinatorios (CLC), Describiendo de manera breve y según el caso los siguientes aspectos:
Tabla de verdad
Función lógica simplificada
Esquema del circuito
Descripción con HDL
Implementacion
Veremos como realizar la descripción del circuito con el lenguaje
Verilog, por lo que es recomendable que tengas conocimientos básicos
sobre el uso de lenguajes de descripción de hardware HDL. Te dejo aquí
un par de enlaces interesantes <Sitio1><Sitio2>. En
vista que no realizaremos una implementación física como tal, vamos a
verificar la funcionalidad lógica del circuito mediante simulación
utilizando el software ModelSIM que viene instalado
con la suite Quartus/Intel que al día de hoy se llama QuestaSIM.
Aquí te dejo los enlaces para la descarga gratuita del software necesario previo registro:
Dentro del contexto de la electrónica digital; Un sumador es un circuito que realiza la suma aritmética de dos números binarios. En su forma mas simple este circuito opera con dos bits de entrada (A, B) y dos salidas, una para el resultado de la suma (S) y otro para el indicador de acarreo (co) conformando asi un circuito conocido como sumador medio (Half Adder); si a este sumado agregamos una entrada de acarreo (ci), el circuito corresponderá con un sumador completo (Full Adder), tal como se observa en la figura 2.
Fig2. Sumador Medio (HA) y Completo (FA)
Los sumadores que se muestran en la figura 2, operan con entradas de 1-bit, pero pueden interconectarse fácilmente para incrementar el ancho de bits en la suma, el circuito resultante se conoce también como Sumador Paralelo. La figura 3 por ejemplo ilustra la composición de un sumador completo de 4-bits.
Fig3. Sumador paralelo de 4-bit
Notara que en el esquema del sumador paralelo que los dos primeros bits del numero se conectan a un sumador medio (HA) y el resto a sumadores completos (FA) en paralelo, de ahí su nombre. Los bits de acarreo se conectan en cascada, empezando por la salida (co) del primer sumador (HA) que ingresa a la entrada (ci) del siguiente sumador (FA) continuando así hasta el ultimo sumador cuya salida (co) representa el bit de mayor peso en el resultado, por esta razón es que el ancho de bit en la salida del sumador paralelo sera un bit mayor que los números de entrada.
Diseño Lógico del Circuito
Tomando en practica el dicho "divide y vencerás", nos bastara analizar el funcionamiento logico que tiene el sumador medio (HA) empezando por la tabla de verdad de dos entradas para obtener la suma de productos (mini-terminos) y una función final simplificada para cada salida. En la figura 4 que muestra este analisis junto al esquema de circuito.
Fig4. Diseño del sumador medio (HA)
De la misma manera en la figura 5 se analiza el sumador completo y el esquema del circuito. Notara que es una extensión al sumador medio.
Fig5. Diseño del sumador completo (FA)
Implementacion
En esta parte veremos como implementar el circuito utilizando el lenguaje Verilog y la creación de módulos descriptivos.
Tomaremos
como ejemplo la función lógica de ambas salidas del sumador completo analizado en la figura 5. Para este nivel de descripción utilizaremos la palabra de asignación concurrente assign junto a los operadores lógicos del lenguaje, quedando el modulo con la siguiente codificación:
modulefa(a,b,ci,s,co); input a, b, ci; //Entradas del sumador + acarreo output s, co; //Salida del sumador + acarreo assign co = (a&b)|(ci & (a^b));//Función del acarreo Co assign s = a^(b^ci); //Función de salida S endmodule
Ahora si
consideramos implementar el sumador paralelo de 4-bit que se ve en la figura 3, podemos realizar la descripción del modulo utilizando varios sumadores completos, declarando instancias del modulo fa, algo similar a la llamada de procedimientos utilizados en los lenguajes de programación. Entonces nuestra codificación del modulo quedara así:
moduleadder4bit(a, b, s); input [3:0] a, b;//Entradas del sumador output [4:0] s; //Salida del sumador + 1bit wire c1, c2, c3; //Puntos de interconexión fa un1(a[0], b[0], 0, s[0], c1); fa un2(a[1], b[1], c1, s[1], c2); fa un3(a[2], b[2], c2, s[2], c3); fa un4(a[3], b[3], c3, s[3], s[4]); endmodule
Podemos optar también por utilizar el operador binario (+) en la asignación para un mayor nivel de abstracción en la codificación, lo que resulta muy útil al no necesitar una funciona lógica como tal, basta saber como opera la suma aritmética para lo cual nos bastara tomar como referencia un diagrama de bloques como el de la figura 6. Entonces el sumador final quedara así:
Fig6. Esquema de sumador
moduleadder4bit(a, b, s); input [3:0] a, b;//Entradas del sumador output [4:0] s; //Salida del sumador + 1-bit assign s = a + b;//Asigna la suma endmodule
En mi canal de youtube
dentro de la lista GOLAB1 resumo la implementación de un sumador de 4-bit, donde se prueba el funcionamiento en una tarjeta FPGA tangnano 9K. Repositorio GIT <Click Aqui>
Conclusiones
Hemos visto de forma general como es la lógica y estructura de sumador paralelo de 4-bit que fácilmente se adapta a cualquier ancho. Se elaboro la descripción del circuito con lenguaje Verilog para su implementación en un dispositivo logico programable con la idea de ganar mas experiencia en este campo. Una alternativa para ver la implementación de este sumador, es utilizar un circuito integrado de función fija como ser el 74LS283.
Para
finalizar solo quiero agradecer tu visita a mi blog, espero que el
contenido de esta entrada hubiera sido de ayuda en tu formación
educativa, favor cualquier consulta al respecto pueden escribirme a:
Bienvenido a este blog relacionado con la electrónica digital donde abordaremos en un principio, el diseño de circuitos lógicos combinatorios (CLC). Describiendo de manera breve y según el caso los siguientes aspectos:
La teoría de funcionamiento
La tabla de verdad
Función lógica simplificada
Esquema del circuito
Descripción con HDL
Implementacion
Veremos como realizar la descripción del circuito con el lenguaje Verilog, por lo que es recomendable que tengas conocimientos básicos sobre el uso de lenguajes de descripción de hardware HDL. Te dejo aquí un par de enlaces interesantes <Sitio1><Sitio2>. En vista que no realizaremos una implementación física como tal, vamos a verificar la funcionalidad lógica del circuito mediante simulación utilizando el software ModelSIM que viene instalado
con la suite Quartus/Intel que al día de hoy se llama QuestaSIM. Otra alternativa es utilizar EDA Playground que corre en linea desde un navegador, eso si necesitaras conexión en linea.
Aquí te dejo los enlaces para la descarga gratuita del software necesario previo registro:
Un multiplexor (MUX) en su forma simple es un circuito que dispone de varias entradas y una sola salida, permitiendo establecer de manera selectiva cual de sus entradas se conecta con la salida. En la figura 2 podemos ver el diagrama de un multiplexor digital de dos canales y su operación.
Fig2. Operación de un Multiplexor de dos canales
El termino dos canales se refiere a que este circuito permite conectar dos entradas a la salida una a la vez, esto se consigue mediante una entrada adicional que tiene el circuito para la selección S. Como el multiplexor de dos canales solo tiene dos posibles caminos a conectar, bastara una sola linea de selección, pero en otros casos esto va depender de la cantidad de entradas del multiplexor como puede ver en la figura 3.
Fig3. Multiplexor de 4 canales y 8 canales
Los multiplexores que vimos hasta el momento son de un 1-bit por que en todos lo cases se establece la conexión digital de solo una linea con la salida. Dentro de los circuitos digitales como ser un Microprocesador encontraremos multiplexores mayores a un 1-bit que posibilitan canalizar la informacion digital (data-path) para su procesamiento.
Entonces es posible diseñar multiplexores de n-bit interconectando los multiplexores de 1-bit que ya vimos, por ejemplo en la figura 4 se ilustra un multiplexor de dos canales para datos de 4-bit.
Fig4. Multiplexor de dos canales para datos de 4-bit
Como notara en la figura 4, el par de entradas al multiplexor MUX2:1 corresponden a cada bit del dato A y B. Los bits en la salida final estarán conformados por la salida Y de cada multiplexor MUX2:1. En la parte derecha de la imagen se muestra un esquema general de este multiplexor, donde las entradas y salidas son de 4-bit a excepción de la linea de control SEL.
Diseño Lógico del Circuito
Ahora veremos como funciona la lógica de un multiplexor, si vemos el ejemplo mas simple considerado en la figura 2, podemos determinar a partir de una tabla de verdad la siguiente función lógica
Fig5. Análisis del Multiplexor de dos canales
Si bien la tabla de verdad para el circuito multiplexor de dos canales, requiere de tres entradas lo cual genera hasta ocho posibles combinaciones en la salida, notara que esta puede simplificarse si consideramos algunos que algunos de estado en la entrada no afectan al valor de salida, como puede notar en la tabla de verdad de la figura 5 en las dos primeras combinaciones donde la entrada S=0, la salida sera igual a la entrada Y=D0, sin importar el valor que tenga la entrada D1, lo mismo ocurre en el caso donde la entrada S=1. Por ello a partir de esta tabla de verdad reducida podemos obtener fácilmente la función logico a través de la suma de productos donde la salida es Y=1 (mini-terminos)
Un vez obtenida la función lógica podemos elaborar el esquema del circuito, utilizando la simbología de puertas lógicas estándar como puede ver en la siguiente figura.
Fig6. Esquema del Circuito Multiplexor MUX2:1
Si consideramos ahora un multiplexor de cuatro canales como el que se observa en la figura 3 lado izquierdo, nuestro analisis en base a la tabla de verdad que ahora constara de seis entradas adra como resultado la siguiente función lógica.
Fig7. Análisis del Multiplexor de cuatro canales
Como vera la función lógica es ahora mas extensa debido a la cantidad entradas que tiene este circuito. A continuación se muestra el esquema final del circuito.
Fig8. Esquema del Circuito Multiplexor MUX4:1
Implementacion
Como les comente en esta sección no se realizara la implementación como tal, si no mas bien elaboraremos los módulos descriptivos del multiplexor y revisaremos su correcta operación lógica a través de diagramas de tiempo, para lo cual crearemos módulos de estimulo (testbench).
Tomaremos como ejemplo practico el multiplexor de cuatro canales que analizamos en la sección anterior, por lo que considerando el esquema del circuitos de la figura 8, es posible llevar a cabo la descripción estructural del circuito a nivel de puertas lógicas (Gate Level) utilizando las primitivas de verilog, resultando el siguiente código.
modulemux4s(s0,s1,d0,d1,d2,d3,y); input s0,s1;//Entradas para selección input d0,d1,d2,d3;//Entradas D0 a D3 output y;//Salida wire s0n, s1n;//Conexión para las lineas de control S wire y1, y2, y3, y4;//Conexiones intermedias not(s0n, s0);//linea negada de S0 (primitiva not) not(s1n, s1);//linea negada de S1 and(y1, s1n,s0n, d0);//primitiva AND de tres entradas and(y2, s1n, s0, d1); and(y3, s1, s0n, d2); and(y4, s1n, s0, d3); or(y, y1, y2, y3, y4);//primitiva OR de cuatro entradas endmodule
Si
consideramos el analisis de la figura 7, cuyo resultado es la función
lógica del circuito, podemos también realizar la descripción de esta
la función utilizando operadores de asignación con el siguiente
resultado.
module mux4s(s0,s1,d0,d1,d2,d3,y); input s0,s1;//Entradas de selección input d0,d1,d2,d3;//Entradas D0 a D3 output y;//Salida wire y1, y2, y3, y4;//Conexiones intermedias assign y1 = ~s1 & ~s0 & d0;//asigna el primer producto assign y2 = ~s1 & s0 & d1;//asigna el segundo producto assign y3 = s1 & ~s0 & d2;//asigna el tercer producto assign y4 = s1 & s0 & d3;//asigna el cuarto producto assign y = y1 | y2 | y3 | y4;//asigna en salida la suma total endmodule
Un nivel mas abstracto en la que podemos prescindir del esquema de circuito y la función lógica, es la descripción a nivel del comportamiento (Behaviour Level) donde lo importante es conocer el funcionamiento del circuito, en este caso tomando como referencia el diagrama de bloques de la figura 3 nos bastare para elaborar el siguiente código.
module mux41s(s0,s1,d0,d1,d2,d3,y); input s0,s1; //Entradas de selección input d0,d1,d2,d3; //Entradas D0 a D3 output reg y; //Salida always @(*) //Estructura que atiende cualquier cambio case ({s1,s0}) //Se verifica la entrada S 2'b00: y = d0; //Primera asignación 2'b01: y = d1; //Segunda asignación 2'b10: y = d2; //Tercera asignación 2'b11: y = d3; //Cuarta asignación endcase endmodule
Si me preguntan cual de los tres modulo descriptivos elaborados conviene realizar, yo les diría que el ultimo por las siguientes dos razones:
La abstracción que se logra describiendo el comportamiento nos ahorra bastante tiempo, porque realmente no necesitamos conocer la estructura de conexiones a nivel compuertas si ya sabemos que operaciones aritméticas o lógicas deben aplicarse para obtener el resultado esperado.
Los dispositivos lógicos programables como las FPGA están construidos con miles o millones de Elementos Lógicos (LE) configurables, estas pequeñas unidades en realidad están formadas por una tabla de búsqueda LUT y Registros (Flip-Flop) con las que es posible definir su función durante un proceso conocido como síntesis, por lo tanto la optimización de un circuito en cuando a la cantidad de Elementos lógicos utilizados sera mejor con una descripción a nivel de registros, lo que se conoce como RTL (Register Transfer Level), esto a su vez garantiza que el código elaborado sea sintetizable en la FPGA.
Bueno para llevar a cabo las pruebas de funcionamiento escribiremos un modulo de estimulo para el circuito MUX4S, donde tomaremos como base de tiempo una milésima de segundo, para generaremos señales de pulso continuo a cada entrada del multiplexor con los siguientes valores: D0=1Hz, D1=2Hz, D2=4Hz y D3=8Hz, entonces la selección de cada canal se realizara en tiempos de un segundo (1000 ms). El código final se muestra a continuación.
`timescale 1ms/1ns module mux4s_tb; reg fq1, fq2, fq3, fq4;//Señales de entrada reg sel0, sel1;//Lineas de entrada wirefo; //Linea de salida mux4s ins0(.s0(sel0),.s1(sel1),.d0(fq1), .d1(fq2),.d2(fq3),.d3(fq4),.y(fo)); initial begin //Genera señal de 1Hz while(1) #500 fq1 = !fq1; //500ms end initial begin //Genera señal de 2Hz while(1) #250 fq2 = !fq2; //250ms end initial begin //Genera señal de 4Hz while(1) #125 fq3 = !fq3; end initial begin //Genera señal de 8Hz while(1) #62.5 fq4 = !fq4; end initial begin #0000 fq1=0;fq2=0;fq3=0;fq4=0; #0000 sel1=0;sel0=0; //Activa canal 1 segundo 0 #1000 sel1=0;sel0=1; //Activa canal 2 segundo 1 #1000 sel1=1;sel0=0; //Activa canal 3 segundo 2 #1000 sel1=1;sel0=1; //Activa canal 4 segundo 3 end endmodule
Ahora se procede a correr la simulación del modulo con QuestaSIM dando como resultado el diagrama de tiempos que se observa en la figura 9, en la que se puede observar que el multiplexor MUX4S trabaja de forma correcta.
Fig9. Diagrama de tiempos (simulación)
Algo interesante de la descripción de nivel de comportamiento, es que es mas fácil ampliar la funcionalidad del circuito sobre la misma base del código, por ejemplo si nos planteamos llevar a cabo la descripción del circuito multiplexor que se ilustra en la figura 4, podría tomar como base el funcionamiento del multiplexor de dos canales y definir cada entrada como un dato de 4-bit, logrando el siguiente código.
module mux2s4b(s,a,b,y); inputs; //Entrada de selección input [3:0] a,b; //Entradas de 4-bit output reg [3:0] y; //Salida de 4-bit always @(*) //Atiende cualquier cambio case (s) //Verifica la entrada S 1'b0: y = a; //Primera asignación 1'b1: y = b; //Segunda asignación endcase endmodule
En mi canal de youtube dentro de la lista GOLAB1 resumo la implementación del multiplexor de dos canales para datos de 4-bit, donde la prueba de funcionamiento con una tarjeta FPGA, si quieres ver como se hizo la prueba aquí te dejo el enlace. <Click Aqui>
Conclusiones
Hemos visto de forma general como funciona un multiplexor digital, su diseño e implementación a través de Verilog, ya sea describiendo la estructura o el comportamiento el resultado obtenido mediante la simulación fue según lo esperado, por lo que resta continuar revisando mas ejemplos prácticos que nos permitan adquirir mas experiencia en el diseño de circuitos digitales.
Para
finalizar solo quiero agradecer tu visita a mi blog, espero que el
contenido de esta entrada hubiera sido de ayuda en tu formación
educativa, favor cualquier consulta al respecto pueden escribirme a:
Saludos
cordiales, en
esta entrada, abordaremos el tema de los autómatas o maquinas de estado finito, con una breve introducción al concepto para luego realizar la descripción de este modelo utilizando en lenguaje Verilog. Es muy recomendable que el lector tenga conocimientos sobre el diseño de circuitos secuenciales, sobre todo la elaboracion de diagramas de transición.
De aquí en adelante en la redacción utilizare los acrónimos:
MEF(Maquina de Estado Finito)
FSM(Finite State Machine) como referencia.
También revisaremos algunos ejemplos llevando a cabo pruebas de simulación para lo cual utilizaremos la versión altera de ModelSIM que viene instalado con el software Quartus II de Intel.
Aquí te dejo los enlaces para descarga previo registro en la pagina de intel:
En términos generales, podemos definir una Maquina de Estados Finito (FSM) como un conjunto de entradas (inputs), un conjunto de estados (states) y un conjunto de salidas(outputs) cuya transición entre los estados obedecen a una función lógica, denominada función de transición. ver Figura 1.
Además, se dice “estado finito” porque la cantidad de estados es un numero determinado. Los estados son representaciones abstractas que marcan pasos en una secuencia de operaciones donde la función de transición determina el siguiente estado en cada ciclo de reloj considerando el estado actual.
Hay dos modelos conceptuales denominados Mealy y Moore, que se muestran en la Figura 2, con un diferencia muy puntual que es la siguiente:
La salida en el modelo de Moore, depende únicamente del estado presente.
La salida en el modelo de Mealy, depende del estado presente y la entrada.
Fig2. Representación del Modelo Mealy - Moore
Conocida la diferencia entre ambos modelos podemos mencionar lo siguiente:
A diferencia de Mealy, una maquina de Moore tiene la salida sincronizada con el reloj, porque depende únicamente del estado presente.
A diferencia de Moore, una maquina Mealy usualmente utiliza menos estados para llevar a cabo la misma tarea.
Con la practica notara que estos modelos se adaptan mejor a un situación en particular. En muchos casos adoptan el modelo de Moore, porque el análisis temporal con diagramas es mas comprensible porque las salidas de la maquina cambian junto con el reloj.
Desarrollo
Llevaremos a cabo una descripción procedimental de una maquina estados considerando el modelo de Moore, para lo cual utilizare un ejemplo bastante simple.
Ejemplo #1: Maquina de estados finito (FSM) para encender y apagar una luz, utilizando solo un pulsador.
Fig3. Funcionamiento del pulsador
En el planteamiento es fácil entender que esta FSM constara de dos estados, al cual llamaremos ON(encendido) y OFF(apagado), la lógica para validar la entrada es 1(alto) cuando se presiona el pulsador, y 0(bajo) cuando esta liberado, recordemos que este sistema secuencial valida las entradas con una señal proveniente del reloj. Entonces el diagrama de estados y transiciones para representar la maquina FSM considerando ambos modelos, serán:
Fig4. Diagrama de estados y transiciones FSM
Note la validez del concepto descrito en la introducción, en el diagrama de Mealy la salida se establece durante la transición entre estados, reflejando una clara dependencia del estado presente con la entrada. En cambio en el modelo de Moore la salida siempre toma su valor con el estado presente.
Ahora vamos a crear un modulo descriptivo Verilog, para implementar la FSM basándonos en el diagrama de transiciones de la Figura 4, este modulo contara con una entrada(e), y una salida(s), además indirectamente se debe agregar la entrada para el reloj(clk) y también para el reinicio(rstn).
Fig5. Diagrama de bloque FSM
Fig6. Modulo descriptivo basado en el modelo Moore
Observe el diagrama de tiempo de la Figura 6. Aquí la salida establece su valor un ciclo después de que se activa la entrada (e=1), esto pasa porque cuando la entrada se activa, el único registro que cambia es el registro de estado siguiente (nextstate), por lo tanto el registro de estado presente (state) no cambia hasta la llegada del siguiente pulso de reloj (state<=nextstate), entonces una vez cambie el registro de estado presente también cambiara la salida (Moore)
Fig7. Modulo descriptivo basado en el modelo Mealy
Analizando el diagrama de tiempo de la Figura 7, vera que la salida se establece en el mismo tiempo donde se activa la entrada (e=1), esto porque en Mealy la salida depende tanto del estado presente como de la entrada.
Las descripciones que se observan en las Figuras 6 y Figura 7, muestran una representación bastante aproximada al concepto de ambos modelos, donde se identifica claramente las tres etapas o bloques que conforman una FSM.
Es posible simplificar la codificación, uniendo la etapa de salida (función de salida) con la entrada (función de estado siguiente) ver Figura 8, o inclusive describir las tres etapas en una misma sección como muestra la Figura 9.
Fig8. Descripción de la FSM en dos secciones
Fig9. Descripción de la FSM en una sola sección
Fig10. Diagrama de tiempo FSM en una sola sección
En el modulo descriptivo final de la Figura 9 y su diagrama de tiempo (ver Figura 10), notara que el tiempo de respuesta(evento del pulsador - acción de salida)demora dos pulsos de reloj. Esto se debe a que toda la funcionalidad del circuito se describe en un solo bloque secuencial que esta sincronizada con los flancos positivos del reloj, por esta razón tanto el evento como la acción siempre se validan con el siguiente flanco de reloj.
Ahora veremos un caso mas practico y aplicable que el anterior.
Ejemplo #2: Diseñaremos una FSM para determinar el sentido de giro de un codificador rotativo, donde las entradas A (ina) y B (inb) provenientes del codificador son señales cuadradas desfasadas entre si a 90 grados, tal como se observa en la Figura 11. La salida (fwd) para indicar el sentido de giro sera uno (1) para adelante y cero (0) hacia atrás
Fig11. Operación de un codificador rotativo
Fig12. Estados y transiciones del codificador
La Figura 12, ilustra el diagrama de estado y transiciones para la FSM, el nombre de cada estado por ejemplo STA00, representa el momento cuando la señal en ambas entradas es A=0 y B=0. La salida (rate) permtie establecer la relación de cambio para un determinado numero de pasos(resolución), pero no se tomara en cuanta para nuestro ejemplo, y se utilizara como referencia de cambio la entrada A(ina).
Describiremos esta maquina de Mealy en las siguientes secciones:
a) Definición de los estados:
//Secuencia de estados {AB}=00->10->11->01 Adelante // segun entrada {AB]=00->01->11->10 Atras localparam STA00 = 0; //Estado presente INA=0 y INB=0 localparam STA10 = 1;//Estado presente INA=1 y INB=0 localparam STA11 = 2;//Estado presente INA=1 y INB=1 localparam STA01 = 3;//Estado presente INA=0 y INB=1 reg[1:0] state, nextstate;//Registros de estado 2-bit
b) Etapa secuencial que actualiza el registro de estado presente:
always @(posedge clk, negedge rstn) //Sincronizado if(rstn == 0) state <= STA00;//Estado inicial al reiniciar else state <= nextstate; //Actualiza estado presente
c) Etapa combinacional que valida el estado presente, las entradas y establece el valor de salida:
always @(ina,inb,state) //Depende de las entrada y estado case(state) STA00: //Estado presente INA=0 y INB=0 begin if(ina==1 && inb==0) begin fwd <= 1; nextstate <= STA10; end else if(ina==0 && inb==1) begin fwd <= 0; nextstate <= STA01; end else nextstate <= STA00; end STA10: //Estado presente INA=1 y INB=0 begin if(ina==1 && inb==1) begin fwd <= 1; nextstate <= STA11; end else if(ina==0 && inb==0) begin fwd <= 0; nextstate <= STA00; end else nextstate <= STA10; end STA11: //Estado presente INA=1 y INB=1 begin if(ina==0 && inb==1) begin fwd <= 1; nextstate <= STA01; end else if(ina==1 && inb==0) begin fwd <= 0; nextstate <= STA10; end else nextstate <= STA11; end STA01: //Estado presente INA=0 y INB=1 begin if(ina==0 && inb==0) begin fwd <= 1; nextstate <= STA00; end else if(ina==1 && inb==1) begin fwd <= 0; nextstate <= STA11; end else nextstate <= STA01; end endcase
El modulo descriptivo completo se muestra en el siguiente enlace:
Recordar que las maquinas de estado finito conceptos fundamentales en el diseño de sistemas electronicos, y su implementación no se limita únicamente a describir el hardware de los circuitos digitales, si no que puede adoptarse en cualquier sistema informático mediante lenguajes de programación.
También mencionar que la manera de como describí la FSM con verilog no representa la única manera de hacerlo, solo me base en algunas referencias porque hay muchos libros y manuales que aplican estilos propios, pero al final utilizan el mismo principio, lo importante es hacer practicas y analizar la simulaciones para realmente comprender como se van estableciendo las condiciones y estados de la maquina. Te dejo unos enlaces de referencias para el diseño de maquinas FSM por parte de <<Intel>> y <<Xilinx>>:
Para
finalizar solo quiero agradecer tu visita a mi blog, espero que el
contenido de esta entrada hubiera sido de ayuda en tu formación
educativa, favor cualquier consulta al respecto pueden escribirme a: