Subido por Lian

T2200 Tesis

Anuncio
ESCUELA POLITÉCNICA NACIONAL
ESCUELA DE INGENIERÍA
MÉTODO DIDÁCTICO DE SIMPLIFICACIÓN DE FUNCIONES
BOOLENAS
PROYECTO PREVIO A LA OBTENCIÓN DEL TÍTULO DE INGENIERO EN
ELECTRÓNICA Y TELECOMUNICACIONES
LUIS EDUARDO LÓPEZ MEDINA
DIRECTOR: ING. CARLOS NOVILLO
Quito, Noviembre del 2003
DECLARACIÓN
Yo LUIS EDUARDO LÓPEZ MEDINA, declaro que el trabajo aquí descrito es de
mi autoría; que no ha sido previamente presentada para ningún grado o
calificación profesional; y, que he consultado las referencias bibliográficas que se
incluyen en este documento.
La Escuela Politécnica Nacional, puede hacer uso de los derechos
correspondientes a este trabajo, según lo establecido por la Ley, Reglamento de
Propiedad Intelectual y por la normatividad institucional vigente.
Luis Eduardo López Medina
CERTIFICACIÓN
Certifico que el presente trabajo fue desarrollado por LUIS EDUARDO LÓPEZ,
bajo mi supervisión.
Ing. Carlos
DIREbrOR-BÉPROYECTO
CONTENIDO
R.
RESUMEN
iv
P.
PRESENTACIÓN
vi
1. INTRODUCCIÓN
1
1.1. Introducción
1
1.2. Algebra de Booie
3
1.2.1. Reseña Histórica
1.2.2. Ecuaciones Booleanasy Funciones Lógicas Básicas
1.2.3. Tabla de Verdad
2. SIMPLIFICACIÓN DE FUNCIONES BOOLEANAS
3
7
12
13
2.1. Funciones Booleanas
2.1.1. Deducción de Ecuaciones booleanasa partir de una tabla de
verdad
2.1.2. Tabla de verdad a partir de una ecuación booleana
13
2.2. Métodos de Simplificación
2.2.1. Método del Algebra de Boole
21
21
14
19
2.2.2. Método del Mapa de Karnaugh
24
2.2.3. Método Quine-McCIuskey
33
2.2.3.1. Representación cúbica de fas funciones de Boole
33
2.2.3.2. Obtención de los implicantes primos
36
2.2.3.3. Selección de un conjunto óptimo de implicantes primos. 40
2.2.4. Funciones Incompletamente especificadas
47
2.2.5. Comparación de los métodos de simplificación
49
2.3.lmplementación de las funciones booleanas simplificadas
3. DISEÑO DEL PROGRAMA COMPUTACIONAL PARA
SIMPLIFICAR FUNCIONES BOOLEANAS
3.1. Introducción
3.1.1. Breve descripción del uso de formularios de Visual Basic
3.1.2. Controles de Visual Basic
3.1.2.1.
3.1.2.2.
3.1.2.3.
TextBox
Label
CommandBotton
51
53
53
54
56
57
59
60
3.1.3. Breve descripción del uso de comandos y sentencias en Visual
Basic
,.
62
3.1.3.1. Fundamentos de la programación
3.1.3.2. Variables......
3.1.3.2.1.
Alcances de las variables
3.1.3.2.2.
Establecimiento del alcance de las variables
3.1.3.2.3.
Variables utilizadas en un procedimiento
3.1.3.2.4.
Variables utilizadas en un módulo
3.1.3.2.5.
Variables utilizadas por todos los módulos
3.1.3.2.6.
Declaración de variables
3.1.3.2.7.
Tipos de variables
3.1.3.2.8.
Consideraciones
3.1.3.3. Procedimientos
3.1.3.3.1.
Procedimientos generales....
3.1.3.3.2.
Procedimientos de evento
3.1.3.4. Funciones
3.1.3.4.1.
Llamadas a funciones
3.1.3.4.2.
Paso de argumentos a Procedimientos y
funciones
3.1.3.4.3.
Tipos de datos de los argumentos
3.1.3.4.4.
Paso de argumentos por valor
3.1.3.4.5.
Paso de argumentos por referencia
3.1.3.5. Estructuras de Control (Repetición y decisión)
3.1.3.5.1.
Do While-Loop / Do-Loop While
3.1.3.5.2.
For-Next
3.1.3.5.3.
Else-End If....
3.1.3.5.4.
If-Then-Else
3.1.3.5.5.
Select-Case
62
63
63
64
64
65
65
66
66
67
68
69
70
72
73
3.2. Diagrama de Flujo del Programa
3.2.1. Teoría
73
74
74
74
75
75
76
77
78
78
80
81
3.2.2. Simplificación
82
3.2.3. Tutorial
84
3.3. Diagrama de flujo de la simplificación
3.3.1. Ingreso de los datos en la tabla de combinaciones
85
85
3.3.2. Formación de cubos
88
3.3.3. Tabla de implicantes primos
95
3.3.4. Tabla de simplificación de los implicantes primos
97
3.3.5. Simplificación de la tabla de implicantes primos
102
3.3.6. Ecuación booleana simplificada
108
3.4. Resultados Obtenidos
112
IV
RESUMEN
Dada la importancia que tiene hoy en día el diseño de los circuitos
digitales para múltiples aplicaciones, es necesario aprender a interpretar las
funciones asociadas a cada una de las aplicaciones y traducirlas a tablas de
verdad y funciones booleanas.
Para tener un circuito adecuado es necesario simplificar la función
booleana hasta un mínimo posible, de tal forma que se utilicen la mínima
cantidad de compuertas, sin afectar el funcionamiento del circuito tanto en
entradas como en salidas.
Para poder simplificar una función booleana se pueden aplicar tanto
teoremas del álgebra booleana, como el mapa de Karnaugh (Veitch), como
métodos tabulares como el método de Quine-McCIuskey, que es el que se
implementa en este proyecto.
El método del álgebra de Boole utiliza la lógica matemática y sus
teoremas para poder simplificar la función; sin embargo, este método es
conveniente cuando se tienen pocas variables de entrada.
El método del mapa de Karnaugh es un método gráfico bastante bueno,
pero no es práctico cuando se tienen más de 5 variables de entrada.
El método de simplificación tabular de Quine-McCIuskey es un método
que compara todas las combinaciones con las siguientes dependiendo la
cantidad de unos que contenga cada combinación de las variables de entrada.
Este es un método recursivo y por esta razón es fácil de implementar en una
rutina de programación.
El proyecto de titulación consiste en implementar un programa tutorial
que simplifica funciones booleanas utilizando el método Quine-McCIuskey. El
procedimiento de simplificación de las funciones booleanas puede realizarse
paso a paso o directamente.
El ingreso de datos se puede hacer de dos formas: mediante una tabla
de combinaciones o utilizando un editor de mintérminos.
En este trabajo se incluye un resumen de los comandos y sentencias
utilizadas en Visual Basic para la programación. Además, se explica todo el
proceso de diseño del programa de simplificación.
VI
PRESENTACIÓN
Hoy en día el diseño electrónico no solo se limita a los elementos
analógicos, para poder obtener resultados confiables, rápidos y económicos, es
conveniente diseñar circuitos electrónicos utilizando chips de compuertas
lógicas; para esto es necesario transformar el problema a una función
booleana, y luego simplificarla, para que el número de compuertas utilizadas
sea lo mínimo posible.
La simplificación se la hace rápidamente utilizando el método de QuineMcCIuskey ya que este proceso sirve para cualquier número de variables de
entrada.
En el Capitulo 1 se hace una introducción de los sistemas digitales y su
relación con los sistemas analógicos, una reseña histórica de la álgebra de
Boole, las ecuaciones booleanas, funciones lógicas básicas y las tablas de
verdad.
En el Capitulo 2 se explican los diferentes métodos que existen para
simplificar las funciones booleanas; tanto como álgebra de Boole, mapa de
Karnaugh y el método de Quine-McCIuskey, además se hace una comparación
de los mismos; también se explica la implementación de las funciones
booleanas.
En el Capitulo 3 se da una descripción rápida de los formularios,
comandos y sentencias utilizadas en Visual Basic; Además, se explica el
proceso de diseño del programa tutorial y de simplificación; además se
presentan los resultados de algunas pruebas realizadas.
Finalmente, en el Capitulo 4 se encuentran los comentarios, sugerencias
y conclusiones sobre este trabajo.
CAPITULO 1
INTRODUCCIÓN
1.1.- INTRODUCCIÓN.
El avance de la Tecnología y la necesidad de realizar tareas de una forma
automática, han llevado a desarrollar circuitos integrados que se pueden usar con
facilidad, estos circuitos se denominan compuertas lógicas, que están disponibles
en cápsulas de circuitos integrados.
Un sistema de automatización o de comunicaciones está diseñado utilizando
muchas de estas compuertas, para lo cual se deben desarrollar "tablas de
verdad", en las que se indica el estado de la salida para cada combinación de las
entradas,
la implementación de estos sistemas requiere que el circuito esté
simplificado para que el costo de elementos sea el menor posible y así construir
un sistema fácil de implementar.
La simplificación de la tabla de verdad asociada al sistema que está
diseñándose, se puede hacer mediante varios métodos cuya eficiencia depende
de la cantidad de entradas y la habilidad de la persona que está simplificando, el
proceso de simplificación manual es demasiado tedioso, poco confiable y lleva
mucho tiempo, lo cual impide que el diseñador se dedique a otras cosas más
importantes y productivas, por esta razón se ha pensado en el desarrollo de este
trabajo.
El resultado de la simplificación de la tabla se denomina función booleana la
cual es una relación lógica entre todas las entradas combinadas por medio de
operadores lógicos.
El presente trabajo consiste en desarrollar un programa que indique el
proceso detallado de simplificación de las tablas de verdad utilizando el método
tabular de Quine-McCIuskey de una manera didáctica, ordenada y comprensiva,
hasta obtener la función booleana simplificada, este programa debe ser capaz de
indicar paso por paso todos los detalles de la simplificación, para lograr una
comprensión de este método.
Para obtener un programa con las características descritas en el párrafo
anterior, se utilizó el programa Visual Basic, que permite el fácil manejo de
formularios, comando y menús estandarizados de Windows.
En la Carrera de Ingeniería en Electrónica y Telecomunicaciones no existe
un programa de este tipo para ayudar a la enseñanza de la simplificación de
funciones booleanas utilizando este método, este proyecto servirá para que los
alumnos de Sistemas Digitales comprendan con mayor facilidad el método tabular
de Quine-McCIuskey, y para los diseñadores de sistemas digitales permitirá
simplificar las funciones booleanas asociadas a sus diseños de una manera
rápida y segura,
SISTEMAS ANALÓGICOS Y SISTEMAS DIGITALES.
Representación Analógica.- Es una cantidad que se representa por medio de
otra cantidad directamente proporcional, es decir es una variación totalmente
continua, ya que puede variar gradualmente sobre un intervalo continuo de
valores.
Sistema Analógico.- Es un dispositivo que trabaja con magnitudes netamente
analógicas o de variación continua.
Representación Digital.- Es una cantidad que se representa por medio de
dígitos los cuales son cantidades discretas de valores a pesar de que la magnitud
a la que representa sea continua u analógica.
Sistema Digital.- Es un sistema que trabaja con información discreta, estos
sistemas pueden ser electrónicos, mecánicos, o magnéticos.
Un sistema digital tiene muchas ventajas sobre un sistema analógico.
-
Mayor facilidad de diseñar con Circuitos Integrados.
-
Facilidad para almacenar la información.
-
Más exactitud y precisión.
-
Flexibilidad para implementar los diseños.
-
Es un sistema casi inmune al ruido.
-
Tiene un alto grado de integración.
-
Facilidad de programación para la operación.
1.2. -ÁLGEBRA DE BOOLE.
1.2.1. -RESEÑA HISTÓRICA
"El concepto de variable lógica fue introducido en 1850 a través del uso
del álgebra booleana. El álgebra booleana es un método muy sencillo para
expresar situaciones, en forma de lenguaje matemático. La lógica digital adquiere
su dimensión práctica a través de las compuertas y se consolida como una
ciencia estructurada mediante el álgebra booleana. Sus principios teóricos fueron
desarrollados por el matemático ingles George Boole en su obra "Análisis
matemático de la lógica" publicada en 1847. Sin embargo, sólo hasta 1938 se
descubrió su real utilidad".
"En este año, Claude E. Shannon, estudiante de postgrado del MIT
(Instituto Tecnológico de Massachusetts, EE.UU) presentó un trabajo en el cual
describía
como el álgebra
booleana se adaptaba
perfectamente a la
representación y al diseño de circuitos de conmutación, basados en relés e
interruptores".
"Con el advenimiento de los tubos de vacío, los transistores y los circuitos
integrados y la fabricación de compuertas, circuitos y sistemas digitales con estas
tecnologías, el álgebra booleana adquirió un papel determinante en el desarrollo
de la electrónica digital moderna y sus aplicaciones".
"El álgebra booleana proporciona el método más compacto y conveniente de
representar, analizar y diseñar circuitos lógicos. La operación completa de un
circuito digital se puede describir mejor por el álgebra booleana que utilizando
complicados diagramas lógicos y extensas tablas de verdad".
"Cuando se diseña un circuito por métodos booleanos, el primer paso
consiste generalmente en obtener su tabla de verdad de acuerdo con las
condiciones de entrada y de salida. A partir de esta tabla se deriva entonces una
ecuación booleana que se simplifica y conduce al circuito lógico deseado. El
circuito obtenido por este método es el óptimo porque requiere de un número
mínimo de compuertas para su realización. Esto reduce el costo, el tamaño físico
y el consumo de potencia del mismo y mejora su confiabilidad y velocidad. Todas
estas consideraciones son importantes cuando se diseñan circuitos digitales".1
El álgebra de Boole es un conjunto de elementos y operadores que ayudan
en el diseño de circuitos combinacionales, los axiomas y teoremas que utiliza el
álgebra de Boole ayudan a la simplificación de las funciones booleanas. Todas las
operaciones del álgebra de Boole actúan sobre dos elementos básicos 1 y O que
representan verdad o falsedad,
físicamente estos dos estados se pueden
representar como O lógico (un nivel entre Ov -- 0.8 v), y 1 lógico (un nivel de 2.5v 5v). En la figura 1.1 se representan los niveles lógicos, en función del voltaje.
VOLTAJE
v
2.5
Vx
0.8 i
lógico
1 lógico
NIVEL
Fig. 1.1: Niveles de voltaje para cada valor lógico
1
http://pehuen.chiUan.ubiobio.cl/-lgaiardo/odc/algebra/
Como se puede ver en la figura 1.1 Vx es el rango de voltaje analógico
prohibido, es decir que para representar un 1 lógico o un O lógico no debe existir
un voltaje en este rango.
La utilización de variables que trabajan con dos valores, la desarrolló
Shannon, usando algunas ideas que habían sido expresadas anteriormente por el
matemático inglés George Boole.
Las variables booleanas no toman valores cuantitativos, pero pueden
usarse para representar información cuantitativa.
Para trabajar con variables booleanas, se utilizan operadores similares a
los del álgebra común. A estos operadores booleanos comúnmente se los conoce
como conectivos lógicos.
El álgebra de Boole, como cualquier otro sistema matemático puede ser
definida por un conjunto de elementos, un conjunto de operadores, y un número
de axiomas o postulados.
En 1938 Shannon introdujo una álgebra de Boole de dos valores llamada
álgebra de conmutación en la cual él demostró que las propiedades de los
circuitos de conmutación eléctrica biestables pueden ser representadas por esta
álgebra.
El álgebra de Boole es una estructura algebraica definida para un conjunto
de elementos B juntamente con dos conectivos binarios +(or) y .(and) de tal forma
que cumplan con las siguientes propiedades.
1.
(a) Conjunto cerrado con respecto al conectivo +
(b) Conjunto cerrado con respecto al conectivo.
2.
(a) Un elemento de identidad con respecto a + designado por el 0:
x+0=0+x=x.
(b) Un elemento de identidad con respecto a . designado por el 1:
x.1=1.x=x.
3
(a) Conmutativo con respecto a +: x + y = y + x
(b) Conmutativo con respecto a .: x. y = y. x
4
(a). Es distributivo sobre +: x.(y + z) = (x. y) + (x. z).
(b) + es distributivo sobre .: x + (y. z) = (x+ y). (x+ z).
5
Para cada elemento xeB, existe un elemento x'eB (llamado el
complemento de x) tal que: (a) x+ x' = 1 y (b) x. x' = 0.
6
Existen al menos dos elementos x, y e B tales que x *y.
Al comparar el álgebra de Boole con la aritmética y el álgebra ordinaria se notan
las siguientes diferencias:
1.
Los postulados no incluyen la ley asociativa. Sin embargo esta ley es válida
para el álgebra de Boole y puede deducirse de otros postulados.
2.
La ley distributiva de + sobre . , es decir, x+ (y. z) = (x+ y).(x+ z) es valida
para el álgebra de Boole pero no para e! álgebra ordinaria.
3.
El álgebra de Boole no tiene inversos aditivos o multiplicativos y por tanto
no hay operaciones de sustracción o división.
4.
La propiedad 5 define un operador llamado complemento el cual no está
disponible en el álgebra ordinaria.
5.
El álgebra ordinaria trata con los números reales, los cuales constituyen un
conjunto infinito de elementos. El álgebra de Boole trata con los elementos
del conjunto B, que es un conjunto de solamente dos elementos, O y 1.
El álgebra de Boole se asemeja al álgebra ordinaria en algunos aspectos;
escoger los símbolos + y . es intencional con el fin de facilitar las manipulaciones
con álgebra de Boole por parte de personas familiarizadas con el álgebra
ordinaria. Aunque no se puede usar algunos conocimientos debe ser muy
cuidadoso de no sustituir las reglas del álgebra ordinaria donde no sean
aplicables.
Es muy importante distinguir entre los elementos del conjunto de una
estructura algebraica y las variables de una sistema algebraico, por ejemplo, los
elementos del campo de los números reales son números, mientras que las
variables a, b, c, etc. usadas en el álgebra ordinaria son símbolos que se
establecen para los números reales. Similarmente en el álgebra de Boole se
definen los elementos de un conjunto B y las variables, tales que x, y, z sean
simplemente símbolos que representen los elementos. A estas alturas es
importante darse cuenta que para tener una álgebra de Boole se debe demostrar:
1.
Los elementos del conjunto B.
2.
Las reglas de operación de los dos operadores binarios, y
3.
Que el conjunto de elementos B, juntamente con los dos conectivos,
satisfagan los seis postulados.
1.2.2. -ECUACIONES BOOLEANAS Y FUNCIONES LÓGICAS BÁSICAS.
Las funciones lógicas tienen analogía con los interruptores, debido a una
concepción histórica, ya que antes de la invención de los dispositivos de estado
sólido y de los circuitos integrados, las funciones lógicas se construyeron con
relés electromecánicos (relevadores), y las primeras computadoras tenían miles
de estos dispositivos interconectados mediante conjuntos de alambres.
A continuación se definen algunos términos que servirán para estructurar
una función booleana.
Proposición.- Planteamiento de un teorema o de un problema que se debe
resolver.
Conectivo.- Son los operadores del álgebra de Boole, similares a los del
álgebra común, y representan a los circuitos digitales más fundamentales.
Variable booleana.- Las variables booleanas solo pueden tomar dos
valores lógicos "O" o "1". En un circuito lógico, una variable booleana puede
representar presencia o ausencia de voltaje.
Las ecuaciones booleanas tienen las siguientes características básicas:
1. Cada ecuación tiene la forma F = f (A, B, C) donde F, A, B, C, etc.
son variables booleanas.
2. Todas las variables son variables lógicas, caracterizadas por tener
sólo dos posibles valores: VERDADERO o FALSO, ALTO o BAJO, 1
o O, etc.
3. Las variables lógicas están relacionadas con las ecuaciones
mediante
operadores
lógicos
o
conectivos: EQUIVALENCIA
LÓGICA, AND, OR e INVERSIÓN LÓGICA.
Las operaciones básicas del álgebra de Boole son las siguientes.
1)
Complementaron.- Cambia el valor de verdad de una proposición,
se representa con el símbolo"-" sobre la variable, o con un apostrofe
delante de la variable (A1); la compuerta asociada a esta operación
se denomina "NOT"; la tabla y su símbolo lógico son los siguientes.
2)
Conjunción. - Es una operación de producto lógico. Se lo representa
con el punto o con la ausencia de este. ("A.B"); esta operación se la
realiza con la compuerta "AND", su símbolo lógico y tabla son los
siguientes.
r=A.B
3)
A
0
0
1
1
B
0
1
0
1
A.B
0
0
0
1
Disyunción.- Es equivalente a la operación suma lógica y se
representa con "A+B"; la compuerta asociada a esta operación se
denomina "OR". A continuación se muestra su símbolo lógico y su
tabla de verdad.
1>A+B
4)
Disyunción exclusiva.- Esta operación es una variante de la
operación disyunción y se lee "XOR"; se representa como "A®B".
Basándose en estas cuatro operaciones básicas se genera la función
booleana simplificada a partir de la tabla de verdad asociada a cada diseño
combinacional.
10
Las compuertas AND, OR y XOR tienen otras variantes, que no son más
que, a las compuertas antes mencionadas, añadir a la salida la compuerta NOT,
obteniéndose como resultado las compuertas NAND, ÑOR y XNOR. Las salidas
de estas compuertas son por lo tanto de un valor de verdad contrario ai valor de
verdad origina! de las compuertas.
NAND
A
A
0
0
1
1
.Y=(A.B) '
B
B
0
1
0
1
A.B (A.B)'
0
1
0
1
0
1
1
0
ÑOR
f=(A+B) '
AB
00
01
10
11
A+B (A+B)1
0
1
1
0
1
0
1
0
XNOR
XAÍ
A B A®B
00
0
01
1
10
1
11
0
(A®B)'
1
0
0
1
Todas las compuertas antes mencionadas se las puede reemplazar
únicamente con compuertas NAND o únicamente con compuertas ÑOR, a esta
característica se denomina
universalidad de las compuertas
NAND,
universalidad de las compuertas ÑOR respectivamente, así por ejemplo.
UNIVERSALIDAD DE LAS NAND.
a) NOT.
A'=(A.A)'.
o
11
b) AND.
A.B=((A.B)')'
c) OR.
A+B=(A')'+(B')' = (A'.B1)'
= { A ' .B 1
"-•
(B.B¡
UNIVERSALIDAD DE LAS ÑOR.
a) NOT.
A'=(A+A)'.
b)AND.
A.B=(A'+B')'
(=(A+A) '
A->:
(A+A) '
Y={A'+BI)
B-S
c) OR.
(B+B)
f
A+B=((A+B)')'
O
Y={(ñ+B)')'
A continuación se definen algunos términos que se usan en álgebra
booleana:
Literal.- Es una variable o su complemento (A, A', B, B', etc.)
Término Producto.- Es una serie de literales relacionados con la compuerta
AND, ej. AB'D, ACD'E', etc.
Término Suma.- Es una serie de literales relacionados con la compuerta
OR, ej. A+C+D', A+B+D'+E, etc.
12
Término normal.- Es un término producto o un termino suma en el cual
ninguna variable aparece más de una vez.
1.2.3. -TABLA DE VERDAD.
Una tabla de verdad sirve para representar simbólicamente una función
lógica. Todas las posibles combinaciones de los valores de la variable de entrada
se presentan en una tabla y, para cada combinación única de entradas, los
valores de la variable de salida se listan en una columna separada asignada a
cada una de las variables. De este modo, la tabla de verdad constituye una
especificación completa de la lógica combinacional que se va a diseñar. En
muchos casos, la construcción de una tabla de verdad a partir de la especificación
del problema puede ser muy difícil, por lo tanto, el proceso que se implante en
lógica debe ser estudiado
en detalle,
hasta que se comprendan sus
características.
FORMAS ESTÁNDAR DE LAS FUNCIONES BOOLEANAS.- Es posible
describir una función booleana mediante tablas de verdad en la que se indiquen
los valores de la salida para todas y cada una de las combinaciones de las
entradas, también es posible escribir una función booleana en forma de una
ecuación boofeana; esta ecuación booleana está compuesta por la suma de
productos; en este caso se denomina suma de mintérminos, también se puede
escribir por el producto de las sumas, en este caso se dice es un producto de
maxtérminos.
En el siguiente capitulo se hace una profundización de cómo obtener la
suma de productos (SOP) o producto de sumas (POS).
13
CAPITULO 2.
SIMPLIFICACIÓN DE FUNCIONES BOOLEANAS.
2.1
FUNCIONES BOOLEANAS
Una variable binaria puede tomar el valor O o 1. Una función de Boole es
una expresión formada con variables binarias, los conectivos OR, AND y NOT y el
paréntesis. Para un valor dado de variables, la función puede ser O o 1.
Una función de Boole puede ser representada por medio de la tabla de
verdad, para hacerlo se necesitan 2n combinaciones de unos y ceros de las n
variables binarias, donde n es el número de variables de entrada de la función.
Por ejemplo, si la función tiene 3 variables de entrada, entonces se necesitan 23
= 8 combinaciones. En otra columna se ponen los valores de la función, es decir
el valor que tiene la salida de este sistema 1 o O para cada una de las
combinaciones en las entradas.
Las combinaciones de unos y ceros se pueden obtener fácilmente para
cada fifa de los números binarios contando desde O a 2n-1. Para cada fila de la
tabla, hay un valor para la función igual a 1 o 0.
Las funciones booleanas se pueden transformar de una expresión
algebraica en un diagrama lógico compuesto por compuertas AND, OR y NOT. Se
necesita una compuerta AND para combinar dos o más variables en un término y
una compuerta OR para combinar 2 o más términos.
14
2.1.1 DEDUCCIÓN DE ECUACIONES BOOLEANAS A PARTIR DE UNA
TABLA DE VERDAD
Consideremos la siguiente tabla de verdad:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
A
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
B
0
0
0
0
c
0
0
D
0
1
0
1
1
1
1
1
1
0
0
0
1
1
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
Y
0
0
0
0
0
0
0
1
1
1
0
0
0
0
0
0
0
0
1
1
1
1
1
0
1
1
1
1
Mintérmino m?
Mintérminomn
Mintérmino mi3
Mintérmino mu
0
A continuación se detalla la forma de obtener la ecuación lógica (función
lógica) que se representa o se sintetiza en forma de suma de mintérminos o
suma de términos mínimos.
El primer paso es identificar las filas o combinaciones de entrada que
producen como resultado un 1 a la salida. En nuestro caso, esto es aplicable a
las filas 7, 11, 13 y 14. A continuación, se observa en cada fila los valores que
toma cada variable de entrada. Si una variable determinada vale O, se
reemplaza mentalmente por su complemento (A't B1, C1, D1). Si la variable vale
1, se deja tal como estaba, es decir, sin complementar (A, B, C, D). En la
siguiente tabla se ilustra este paso:
15
A
0
1
1
1
7
11
13
14
7
11
13
14
e
1
1
B
1
0
1
1
0
1
£..„
A
A1
A
A
A
C
c
c
B
B'
B
B
&
1
1
1
C1
c
1
-v *
1
1
1
1
0
o
%
D
D
D
D1
1
1
1
1
1
Seguidamente, se asigna a la salida de cada fila una expresión
booleana equivalente a la operación AND de las variables de entrada
representadas de esta forma. En la siguiente tabla se ilustra este paso:
*£• ¿PL
7
11
13
14
0
1
^Bt.
jf ^
1
1
1
1
1
0
;"<**
1 0
1 1
1 1 1
y^J^tWff?' :
flt$3 *'rt¿T5
0
A'BCD
AB'CD
ABC'D
ABCD'
Mintérmino m7
Mintérmino mu
Mintérmino m13
Mintérmino mu
Cada una de estas ecuaciones es un mintérmino. por ejemplo, el
mintérmino asociado a la fila 13 es:
ini3 = ABC'D
A partir de estos datos se puede escribir la ecuación booleana como
una suma de mintérminos. En nuestro caso:
Y ™ m? •+• rn-M+ mía + m-u
Reemplazando
cada
mintérmino
por
su
expresión
correspondiente, se obtiene la ecuación solicitada:
Y = A'BCD + AB'CD + ABC'D + ABCD1
Esta expresión se denomina SOP (Suma de productos).
booleana
16
A este tipo de ecuación booleana, en la que en cada término están
presentes todas las variables de entrada, en su forma normal o en su forma
complementada, se la denomina forma estándar o forma canónica disyuntiva.
La misma tabla o función booleana se puede representar como un producto
de sumas o maxtérminps.
Consideremos la misma tabla de verdad de la sección anterior:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-*V fj ! #';.;-sjjf£ k -.y ,
0
0
0
0
0
0
0
1 0
0
0
0
0
1 0
1 1
0
0
0
1 0 0
0
0
1 0 1 0
0
1 1 0
0
0
1 1 1
1
0
1 0 0 0
0
1 0 0 1 0
1 0 1 0
0
1 0 1 1
1
1 1 0 0
0
1 1 0 1
1
1 1 1 0
1
1 1 1 1
0
Maxtérmino MO
Maxtérmino Mi
Maxtérmino M2
Maxtérmino Ma
Maxtérmino M4
Maxtérmino Ms
Maxtérmino M6
Maxtérmino Ma
Maxtérmino Mg
Maxtérmino Mío
Maxtérmino Mi2
Maxtérmino Mi 5
A continuación se detalla la forma de obtener la ecuación lógica (función
lógica) que la describe o sintetiza en forma de producto de maxtérminos o
términos máximos.
El primer paso es identificar las filas o combinaciones de entrada que
producen como resultado un O a la salida. En nuestro caso, esto es aplicable a
las filas O, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 y 15. A continuación, se observa en cada
fila los valores que toma cada variable de entrada. Si una variable determinada
vale 1, se reemplaza mentalmente por su complemento (A1, Bf, C1, D'). Si la
17
variable vale O, se deja tal como estaba, es decir, sin negar (A, B, C, D). En la
siguiente tabla se ilustra este paso:
0
1
2
3
4
5
6
8
9
10
12
15
0
1
2
3
4
5
6
8
9
10
12
15
A
0
0
0
0
0
0
0
B
0
0
0
0
c
o
Y
0
0
0
0
0
0
0
0
1
0
0
0
0
1
1
1
1
1
1
1
1
1
1
0
0
0
0
0
1
1
0
0
0
A
A
A
A
A
A
A
A
A'
A'
A'
A1
A'
B
B
B
B
C
C
D
D
B
B'
B'
B'
B
B
B
B'
B'
1
1
1
c
C'
C'
c
c
C'
c
c
C'
c
C'
1
1
0
0
1
1
D'
D
D'
D
D'
D
D
D'
D
D
D'
0
0
0
0
0
0
0
Y
0
0
0
0
0
0
0
0
0
0
0
0
Seguidamente, se asigna a la salida de cada fila una expresión
booleana equivalente a la operación OR de las variables de entrada
representadas de esta forma. En la siguiente tabla se ilustra este paso:
18
A
0
1
2
3
4
5
6
8
9
10
12
15
0
0
0
0
0
0
0
1
1
1
1
1
Y^Mo* jtf-m?itf
-vp¿
c
D
0
0
0
0
0
0
0
1
0
1
1
1
1
1
0
0
0
0
0
0
0
0
1
1
1
1
0
1
M4* M5* M6* M8* M9*
1
1
0
0
1
0
0
1
Miü*Mi2*Mi5
A+B+C+D
A+B+C+D'
A+B+C'+D
A+B+C'+D'
A+B'+C+D
A+B'+C+D'
A+B'+C'+D
A'+B+C+D
A'+B+C+D'
A'+B+C'+D
A'+B'+C+D
A'+B'+C'+D'
Maxtérmíno M0
Maxtérmino MI
Maxtérmino M2
Maxtérmino M3
Maxtérmino M4
Maxtérmino M5
Maxtérmino Me
Maxtérmino M8
Maxtérmino M9
Maxtérmino M-|0
Maxtérmino Mi2
Maxtérmino Mi5
Cada una de estas ecuaciones es un maxtérmino. por ejemplo, el
maxtérmino asociado a la fila 12 es:
Mi2 = A'+B'+C+D
A partir de estos datos se puede escribir la ecuación booleana como un
producto de Maxtérminos. En nuestro caso:
Y=M0* Mi* M2* M3* M4* M5* M6* M8* M9* M10* Mi2* Mi5
Reemplazando
cada
maxtérmino
por
su
expresión
booleana
correspondiente, se obtiene la ecuación solicitada:
Y = (A+B+C+D)(A+B+C+D')(A+B+C'+D') (A+B'+C+D) (A+B'+C+D1)
(A+B'+C'+D) (A'+B+C+D) (A'+B+C+D1) (A'+B+C'+D) (A'+B'+C+D)
(A'+B'+C'+D')
A esta expresión también se la conoce como una función POS (Producto
de sumas).
A esta forma de la ecuación booleana también se llama forma
estándar o forma canónica conjuntiva.
19
Cualquiera de las dos formas canónicas obtenidas para las
ecuaciones booleanas resulta demasiado costosa y difícil de implantar, por esta
razón es necesario simplificar estas funciones. En la siguiente sección se
detallará cada uno de los pasos que se seguirán para simplificar una ecuación
booleana a una forma más sencilla para poder implementarla con mayor facilidad.
2.1.2 TABLA DE VERDAD A PARTIR DE UNA ECUACIÓN BOOLEANA
Una tabla de verdad sirve para visualizar de mejor manera las salidas
que tiene una función con todas y cada una de las entradas, la tabla se
construye con un número de filas igual a 2n; donde n es el número de variables
de entrada
Asi por ejemplo:
F<A,B,C>=A*B'*C+A'*OB*C
Esta función tiene 3 variables de entrada A, B y C por lo tanto la tabla
tendrá 8 filas = 23.
Las salidas dependen de cada uno de los términos de la función, es
decir:
Debido al término A*B'*C, cuando las entradas tienen la combinación
101 tendrán una salida 1, con el término A'C indica que cuando las entradas
tienen la combinación 0X1 tendrán una salida 1 y el término B*C indica que
cuando las entradas tienen la combinación X11 la salida es un 1. El resto de
combinaciones tendrán una salida igual a 0.
Estas combinaciones y la tabla resultante se puede observar en la
siguiente tabla:
20
ABC
0 0 0
0 0 1
0 10
0 11
1 0 0
1 0 1
1 10
1 11
A*B'*C
0
0
0
0
0
1
0
0
A'*C
0
1
0
1
0
0
0
0
B*C
0
0
0
1
0
0
0
1
F<A, B, C,>
0
1
0
1
0
1
0
1
21
2.2.
MÉTODOS DE SIMPLIFICACIÓN.
Para implementar una función booieana mediante un diagrama lógico se lo
puede hacer a partir de la función obtenida de la tabla de verdad, pero la forma
óptima de hacerlo es a partir de una función simplificada. El diagrama lógico de
una función sin simplificar tiene más elementos que el diagrama lógico de una
función simplificada. Provocando que sea más costoso, además de complejo.
Existen 3 métodos para simplificar una expresión algebraica:
•
Simplificación algebraica a través de teoremas o método del Algebra de
Boole.
•
Método gráfico de Mapas de Karnaugh
•
Método tabular de Quine-McCIuskey
2.2.1
MÉTODO DEL ÁLGEBRA DE BOOLE.
Dentro del Álgebra de Boole se define algunos axiomas y teoremas que
pueden ser aplicados a las funciones booleanas para su simplificación. Los
teoremas son los siguientes.
1. - Una variable solo puede tomar 1 de 2 valores: [O, 1]
a) A = O cuando A * 1.
b) A= 1 cuando A *0.
2. - Si A es la entrada a un inversor su salida es A'.
a) Sí A = O luego A' = 1
b) Sí A = 1 luego A' = O
3. -La suma lógica representa una Unión mientras que un producto una
Intersección
a) A + B; A U B suma lógica.
0 +0 =0
22
0+1 =1
1+0=1
1 + 1=1
b) A. B; AnB producto lógico
0.0 = 0
0.1 = 0
1.0 = 0
1.1 = 1
4. -Identidad.
A +0 =A
A.1=A
5. -Elementos Nulos.
A+1 = 1
A.0 = 0
6. -Idempotencia.
A +A =A
A.A = A
7. -Involución.
(A')1 = A.
8. -Complementos.
A + A' = 1
A.AJ = O
9. -Ley Conmutativa
A+B = B+A
A.B = B.A
10. -Ley Asociativa.
(A + B) + C = A + (B + C)
(A.B). C = A. (B.C)
11.-Ley Distributiva.
A.B + A.C = A (B + C)
A + B.C = (A + B)(A + C).
23
12.-Cobertura
A + A.B = A
A. (A+B) = A
13.-Combinación.
AB + AB1 = A
(A + B)(A + B') = A.
14.-Consenso
AB + A'C + BC = AB + A'C
(A + B)(A' + C)(B + C) = (A + B)(A' + C)
15. -TEOREMA DE DeMorgan
A+B=AB
ÁB = Á + B
A + B + C+
+ N = A . B. C
N
A. B. C
N = A + B + C+.... + N
16. -TEOREMA DE SHANNON. (Expansión).
F(X,X2,
,Xn) = XiF(1,X2,X3,
F(X1X2,
,Xn)= [Xi+F(0,X2,X3,
,Xn)-0<iF(0,X2,X3,
,Xn)].[Xi+F(1,X2,X3,
-Xn)
Xn)]
La primera expresión sirve para la suma de productos, mientras que la
segunda expresión sirve para producto de sumas.
Así por ejemplo:
F = xy + x'z + yz.
F = xy + x'z +yz(x+x').
= xy + x'z + xyz + x'yz
Teorema del complemento.
Distributiva.
= (xy+xyz) + (x'z + x'yz)
Asociativa.
= xy(1+z) + x'z(1+y)
Distributiva.
= xy + x'z
Elementos nulos.
24
Si comparamos la función original tiene 3 términos mientras que la función
simplificada tiene únicamente 2 términos, lo cual implica menos compuertas.
Cuando se utiliza este método no existe un solo camino sino que depende
de la habilidad de la persona que está simplificando para aplicar las propiedades.
2.2.2 MÉTODO DEL MAPA DE KARNAUGH.
El proceso del álgebra de Boole se relaciona directamente con la
complejidad de la función booleana, este método no tiene reglas específicas para
predecir cada paso a seguir. El mapa de Karnaugh es un método simple y directo
para simplificar la función booleana, y que puede ser tratado no solamente en
forma de una tabla de verdad, sino como una extensión del diagrama de Venn.
Este método fue propuesto por Veitch y modificado por Karnaugh, por esta razón
se lo conoce como el método de Karnaugh o de Veitch.
El mapa de Karnaugh es una tabla en la que cada cuadrado representa un
mintérmino. Como cualquier función de Boole puede ser expresada como una
suma de mintérminos, se puede concluir que dicha función se reconoce
gráficamente en un mapa a partir del área encerrada por aquellos cuadros en los
que están los "1" como parte de la función, de hecho, el mapa representa un
diagrama visual de todas fas formas posibles en que puede ser expresada una
función en la forma normalizada; al reconocer varios patrones, el usuario puede
derivar expresiones algebraicas alternas para la misma función de las cuales se
puede escoger la más simple. Se asume que la expresión algebraica más simple
es aquella en la que la suma de productos o producto de sumas que tiene el
mínimo número de literales.
Un mapa de Karnaugh o mapa K es una tabla de verdad modificada que
se utiliza para simplificar ecuaciones Booleanas y diseñar circuitos lógicos de
manera sistemática. Los mapas K aprovechan la capacidad del cerebro humano
25
de trabajar mejor con patrones gráficos que con ecuaciones y otras formas de
expresión analítica.
Externamente un mapa de Karnaugh consiste de una serie de cuadrados,
cada uno de los cuales representa una línea de la tabla de verdad. Puesto que la
tabla de verdad de una función de N variables posee 2N filas, el mapa K
correspondiente debe poseer también 2N cuadrados. Cada cuadrado alberga un O
o un 1, dependiendo del valor que toma la función en cada fila.
Este método se basa en dos teoremas básicos del Algebra de Boole, estos
son los siguientes.
í)
XY + X'Y = Y.
íi)
X + X'Y = X + Y.
A este método también se denomina mapa K y se puede trabajar a partir de
mintérminos y o maxtérminos.
El mapa de Karnaugh es un método gráfico que se utiliza para simplificar
una ecuación lógica, para convertir una tabla de verdad a su circuito lógico
correspondiente en un proceso simple y ordenado.
Este método se puede aplicar para cualquier cantidad de entradas aunque
su utilidad práctica se limita a un máximo de seis variables de entrada.
Formato del mapa de Karnaugh.
Cada casilla del mapa K corresponde a una salida de cada combinación de
la tabla de verdad, es decir contiene la misma información que en la tabla de
verdad pero en diferente formato.
Por ejemplo:
26
Para 2 variable -> 22 = 4 filas
A
0
0
1
1
B
0
1
0
1
X
X0
Xi
X2
X3
En el mapa existen 22 = 4 cuadrados.
B'
Para tres variables. 23 = 8 filas.
A
0
0
0
0
1
1
1
1
B
0
0
1
1
0
0
1
1
c
1
X
Xo
Xi
X2
X3
0
X4
0
X5
X6
X7
0
1
0
1
1
En el mapa 23 = 8 cuadrados.
C'
27
Para cuatro variables. -> 24 = 16 filas.
A
0
0
0
0
0
0
0
0
c
B
D
0 0 0
0 0 1
0
0
0 1 1
1 0 0
1 0 1
1 1 0
1
1 1 1
1 0 0 0
1 0 0 1
1 0 1 0
1 0 1 1
1 1 0 0
1 1 0 1
1 1 1 0
1 1 1 1
X
Xo
XT
X2
X3
X4
X5
X6
X7
X8
X9
Xio
Xn
Xi2
Xl3
Xu
Xis
En el mapa 24 = 16 cuadrados.
A'B'
A'B
AB
AB'
C'D' C'D CD CD'
Xi X3 X2
X0
X4
X5 X7 X6
X-I2
Xl3
Xis
Xl4
X8
X9
Xn
Xio
Los cuadrados del mapa K se marcan, de tal forma que los cuadrados
horizontalmente adyacentes solo difieran en una variable. Por ejemplo, el
cuadrado Xo del mapa de cuatro variables es A'B'C'D', mientras tanto que el
cuadrado Xi es A'B'C'D entre estos dos estados únicamente la variable D es
diferente. De la misma manera los cuadrados verticalmente adyacentes difieren
en una sola variable. Por ejemplo, el cuadrado Xo es A'B'C'D' mientras tanto que
el X4 es A'BC'D' en este caso solo la variable B es diferente.
Los cuadrados del renglón superior (X0, Xi, Xa, Xa) se consideran
adyacentes a los cuadrados del renglón inferior (Xg, X9, Xn, XIQ). Así mismo los
28
cuadrados del extremo derecho (X0, X4, Xi2, Xa) se consideran adyacentes a los
cuadrados del extremo izquierdo (X2, Xe, X14,
Para que los cuadrados adyacentes difieran en una sola variable el
marcado de arriba hacia abajo debe estar en el orden A'B', A'B, AB y AB', de la
misma forma de izquierda a la derecha en la parte superior de la tabla. Por
ejemplo:
Para tres variables:
A
0
0
0
0
1
1
1
1
B
0
0
1
1
0
0
1
1
c
X
0
1
1
0
0
0
1 1
0 1
0
1
0
1
1
0
De acuerdo a la tabla de verdad la función será.
X = A'B'C1 + A'B'C + A'BC1 + ABC1.
La misma información en el mapa de Karnaugh es:
29
Para cuatro variables:
A
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
B
0
0
0
0
1
1
1
1
0
0
0
0
c
D X
0 0 0
0 1 0
1 0 1
1 1 1
0 0
0 1
1 0
0
0
0
0
1 1
1
0 0
0 1
1 0
0
1 0 0
1 0 1
1 1 0
1 1 1
0
0
0
0
0
1
1 1
La función correspondiente para esta tabla es:
X = A'B'CD' + A'B'CD + AB'C'D' + AB'CD'.
Representando en el mapa de Karnaugh.
A'B'
A'B
AB
AB'
Agrupamiento.-
C'D'
0
0
0
1
C'D
0
0
0
0
CD
1
0
0
0
CD1
1
0
0
1
La expresión de salida X se puede simplificar
adecuadamente combinando los cuadros en el mapa K que contengan 1. El
proceso para combinar estos unos se denomina agrupamiento.
Agrupamiento de grupos de dos.- Es el agrupamiento que se realiza
entre un par de cuadros adyacentes verticalmente u horizontalmente que
contengan 1 de tal manera que se logra eliminar la variable que está en forma
30
normal en el un cuadrado, y complementada en el otro cuadrado. "El
agrupamiento de un par de unos adyacentes en un mapa K elimina la variable que
aparece en forma complementada y no complementada". A este grupo se
denomina pares.
Agrupamiento de grupos de cuatro.-
A este grupo se denomina
cuádruples y se forma con cuatro unos que están en cuadrados adyacentes.
Cuando se forman grupos cuádruples se eliminan dos variables las cuales están
en forma normal y en forma complementada.
Agrupamiento de grupos de ocho.- Estos grupos están formados por
ocho unos que se encuentran en cuadrados adyacentes, a este grupo se
denomina octeto, cuando se forman grupos de 8 se logran eliminar las 3 variables
que se encuentran complementadas y no complementadas.
Proceso completo de simplificación.- Para simplificar una función
booleana se debe tomar en cuenta que mientras más grande es el agrupamiento
más cantidad de variables se eliminan así, si el grupo es de 2 unos entonces se
elimina una variable, si el grupo es de 4 unos se eliminan 2 variables, si es un
octeto se eliminan 3 variables, etc... El proceso es el siguiente.
1. Construcción del mapa K. Ubicando los unos en los cuadrados que indican la
tabla de verdad y ceros en los otros cuadrados.
2. Examinar el mapa y ver los cuadrados que tienen un "1" pero con cuadrados
adyacentes diferentes a "1" a estos se llaman unos aislados, ya que no se
agrupan con ningún otro cuadrado que tenga un "1".
3. Identificar los cuadrados que pueden combinarse con otro de una sola
manera. Se señala estos grupos de dos cuadrados. Los cuadrados que
pueden combinarse con grupos de dos más de una manera, se omiten de
momento.
31
4. Identificar los cuadrados que puedan combinarse con otros tres de una sola
forma. Si todos los grupos de cuatro así obtenidos no están ya incluidos en
grupos de dos, señalarlos. De nuevo, se omiten los cuadrados que pueden
combinarse con grupos de cuatro, más de una manera.
5. Agrupar cualquier octeto aunque algunos de los cuadrados que tiene unos ya
estén agrupados.
6. Bajo el mismo criterio hacer grupos de 2' cuadrados, donde i = O, 1, 2, 3,...
7. Aplicando el procedimiento anterior, si aún quedan cuadrados sin agrupar,
pueden combinarse con otros, ya agrupados o no, arbitrariamente, tratando de
incluirlos en el menor número de grupos posibles.
8. Se escribe la suma OR de todos los términos generados por cada
agrupamiento.
A continuación un ejemplo para entender mejor estos pasos:
A
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
B
0
0
0
0
1
1
1
1
0
0
0
0
c
D X
0 0
0
0 1 0
1 0
1 1
0 0
0 1
1 0
1 1
0 0
0 1
1 0
1 1
1 0 0
1 0 1
1 1 0
1 1 1
1
0
0
1
0
1
0
0
0
1
0
1
0
1
32
Construimos el mapa K.
A'B'
A'B
AB
AB'
C'D'
0
0
0
0
C'D
0
CD
0
^_ JJ¿\y
^
0
^
CQ'
(U
0
0
0
El cuadrado X2 es el único que contiene un 1 que no es adyacente a ningún
otro cuadrado que contiene 1. Está marcado con rojo. De este agrupamiento se
obtiene el término A'B'CD1, no se elimina ninguna variable ya que es un uno
aislado.
El cuadrado Xn es adyacente solo al cuadrado X15, entre estos dos se
forma un par, está marcado con color verde. De este agrupamiento se forma el
término ACD ya que se elimina B.
Los cuadrados X5, X 7j Xi3 y Xis forman un cuádruple, están encerrados con
azul, de este agrupamiento se obtiene el término BD y se eliminan las variables A
yC.
Note que el cuadrado X15 se repite tanto en el par como en el cuádruple.
Todos los cuadrados que contienen unos ya han sido agrupados.
Se obtiene la función simplificada como suma lógica de los términos
obtenidos.
X=A'B'CD'+ACD
33
2.2.3
MÉTODO QUINE-McCLÜSKEY.
2.2.3.1
Representación cúbica de las funciones de Boole.
Es conveniente introducir una nueva representación de las funciones
booleanas la cual proporcionará una terminología conveniente para el método de
Quine-McCIuskey.
Una variable de conmutación que puede asumir solo dos valores, se puede
representar mediante dos puntos en los extremos de un solo segmento.
0.
1
A
Fig 2.1: Representación de una variable de conmutación.
Los cuatro valores posibles de dos variables de conmutación se pueden
representar mediante los cuatro vértices de un cuadrado.
Con tres variables de conmutación existen 8 combinaciones
representación gráfica lo podemos hacer en los vértices de un cubo.
0
A
001
1
o ooox-"
)
00
A
10
B
B
B
01
A
11
101
¡ ior>^
I
I
B
¡
• — — — 3-*
B
_ **
1
1
B
A
oro
A
o.
A
110
111
ff ^c
Fig 2.2: Representación de 2 y 3 variables de conmutación
y la
34
La extensión a más de tres variables, se requieren figuras de más de tres
dimensiones, es geométricamente difícil, pero bastante sencilla desde el punto de
vista conceptual.
En general las diferentes combinaciones posibles de n variables se
representan como puntos en el espacio - n, y todos los 2n puntos posibles forman
los vértices de un cubo - n o un hipercubo de Boole.
Para representar una función determinada se dibuja el hipercubo, se
marcan con un punto los vértices que corresponden a una combinación que
produce un "1" en fa función.
La representación de funciones booleanas en el cubo - n se realiza
estableciendo una correspondencia uno a uno entre los mintérminos de n variables y los vértices del cubo n. de la siguiente manera. En un cubo - 3, el
vértice 000 corresponde a mo, el vértice 001 es mi, etc. La representación cúbica
de una función de n variables consta, entonces, del conjunto de vértices de un
cubo - n, correspondientes a los mintérminos de la función. Por ejemplo.
F(A,B,C) = Zm<0, 2, 3, 7).
Esta función se representa en el cubo - 3, como se indica en la siguiente
figura.
00
m
r
I
m3 j
0111 _1
010
m2
00.
m
oxo
11
m7
I
m3
011
01X
010
m2
Cubos - O
Cubos - 1
Fig. 2.3: Representación de un cubo-3
m7
35
Los vértices correspondientes a mO, m2, m3, y m7 se indican por medio de
puntos negro. Estos vértices se denominan cubos - O de la función.
Dos cubos - O forman un cubo - 1, si difieren solo en una coordenada en el
ejemplo anterior se tiene tres cubos - 1, que están marcados en rojo, (01X, 0X0,
X11), los cubos - 1 se designan colocando una "X" en la coordenada que tienen
diferentes valores.
Un conjunto de cuatro cubos O, cuyos valores de coordenada son iguales
en todas las variables excepto en dos, forma un cubo - 2 que se representa
gráficamente como un plano sombreado.
Cubos - 2
Fig. 2.4: Representación de un cubo - 2
Cuando todos los vértices de un cubo - k está en el conjunto de
vértices que componen un cubo - k mayor, se dice que el cubo más pequeño está
contenido en/o cubierto por el cubo mayor.
Resumiendo, un cubo - O se representa con un punto, un cubo - 1 se
representa con un segmento, un cubo - 2 con un plano, un cubo 3 con un
volumen, para un cubo - k en espacios - n mayores que 4 no hay representación
geométrica, pero el principio de agrupación de productos fundamentales es el
mismo.
36
Entre la representación cúbica y el mapa de Kamaugh existe una
correspondencia, Los cubos - O corresponden a los cuadrados del mapa K, los
cubos - 1 corresponden a los pares de cuadrados adyacentes, los cubos - 2
corresponden a los cuádruples de cuatro cuadrados adyacentes, etc.
2.2.3.2
Obtención de los implicantes primos.
Definición. - "Un implicante primo es cualquier cubo de una función que no
esté totalmente contenido en otro cubo mayor de dicha función".
El método
ingeniosamente
de Quine-McCIuskey es
para efectuar
un procedimiento
una búsqueda
exhaustiva de
organizado
todas
las
combinaciones posibles de cubos - O en cubos mayores y, luego, seleccionar la
combinación mínima de cubos requerida para realizar la función.
El punto de partida de este método es la lista de mintérminos de la función.
Ejemplo 1. f(A, B, C, D) = Im(0, 2, 3, 6, 7, 8, 9, 10, 13)
MINTÉRMINO COMBINACIONES
A B C D
0 0 0 0
0
0 0 0 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0
0
0
0
0
0
1
1
1
1
1
1
1
0
0
1
1
1
1
0
0
0
0
1
1
1
1
1
0
0
1
1
0
0
1
1
0
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1 1 1 1
NUMERO DE "UNOS" FUNCIÓN
0
1
1
2
1
2
2
3
1
2
2
3
2
3
3
4
1
0
1
1
0
0
1
1
1
1
1
0
0
1
0
0
37
En la tabla de productos fundamentales de la función, se dispone de la
representación binaria de las combinaciones de las variables de entrada, ya que
se ha definido que se consideran lógicamente adyacentes dos términos cuyas
combinaciones de variables son idénticas excepto en una sola de ellas, se halla
que una de las condiciones es que el número de "UNOS" en las representaciones
binarias difieran solo en una unidad.
Se separan únicamente los mintérminos que tienen un "UNO" asignado a la
función, y se los ordena de acuerdo al número de "UNOS" existentes en las
combinaciones de entrada, se separan los mintérminos en grupos con el mismo
número de unos por medio de las lineas horizontales. "Este agolpamiento de los
mintérminos se hace para reducir la cantidad de comparaciones que se deben
efectuar para determinar los cubos UNO".
V
V
V
V
V
V
V
V
V
COMBINACIÓN
A
B C D
mo 0 0 0 0
nri2 0 0 1 0
m8 1 0 0 0
1113 0 0 1 1
m6 0 1 1 0
iTlg
1 0 0 1
mío 1 0 1 0
m7 0 1 1 1
mis 1 1 0 1
#de
"UNOS"
0
1
2
3
Se compara las combinaciones de cada grupo con las combinaciones del
grupo siguiente, si existe una variable diferente entre las dos combinaciones que
se están comparando entonces se reemplaza como una sola poniendo en el lugar
que está la variable diferente con una X anotando el mintérmino que se combina.
A los términos originales que se combinan se coloca una marca, por ejemplo "V".
También se debe anotar los números enteros correspondientes a los
mintérminos que se combinaron. En el caso de nuestro ejemplo mo se combina
con m2 para formar el cubo - 1 (XOOO) esta combinación es equivalente a la
operación algebraica A'B'C'D' + A'B'CD' = A'B'D'(C + CJ) = A'B'D'.
38
El mintérmino m0 se combina también con ms para formar el cubo - 1
(XOOO). Esto completa la comparación entre los mintérminos de los dos primeros
grupos, de manera que se traza una línea por debajo de los cubos - 1 resultantes.
A continuación, se comparan en la misma forma los mintérminos del segundo y
tercer grupos. Esta comparación produce cinco cubos - 1 más, formados de rr}2 y
ms, ms y mg, etc. Se traza una recta debajo de estos cinco cubos 1 para indicar la
terminación de las comparaciones entre el segundo y tercer grupos. Cada
mintérmino de un grupo se debe comparar con cada mintérmino del otro grupo,
incluso si cualquiera o ambos ya han sido marcados, y han formado un cubo - 1 ,
se debe encontrar cada cubo - 1 .
Este proceso de comparación se repite entre los grupos sucesivos hasta
que se agote la lista de mintérminos.
Cubo 1
0,2
0,8
00X0
XOOO
2,3 001 X
2,6 0X10
2, 10 X010
8,9 100X
8, 10 10X0
3,7 0X11
6,7 01 1X
9, 13 1X01
V
V
V
V
V
V
V
V
Una vez obtenida esta tabla se debe seguir el mismo proceso para obtener
la tabla de cubos 2, pero aquí interviene un nuevo elemento como es la X.
Nuevamente, los cubos de cada grupo se deben comparar sólo con los cubos del
siguiente grupo hacia abajo. En el ejemplo nuestro el cubo - 1 (0,2) se combina
con el cubo - 1 (8,10) y se obtienen el cubo 2 (O, 2, 8, 10) (XOXO), los dos cubos 1 usados se marcan para indicar que se han usado para formar cubos - 2.
Una explicación algebraica de esta combinación es la siguiente.
39
mO + m2 + m8 + m10 = A'B'C'D1 + A'B'CD' + AB'C'D' + AB'CD'
= A'B'D'(C + C') + AB'D'(C+ C1)
= A'B'D' + AB'D'
=B'D'(AÍ + A)
=B'D'.
Al comparar el cubo - 1 (0,8) con el cubo -1 (2,10) también se obtiene el
cubo - 2 (O, 2, 8, 10) (XOXO), el cual ya existe en la tabla de cubos 2.
Luego de comparar todos y cada uno de los cubos - 1 se obtiene la
siguiente tabla.
Cubo -2
0, 2, 8, 10 XOXO
2, 3, 6, 7 OX1X
Este proceso se sigue hasta cuando ya no existan elementos que se
puedan combinar siendo esta tabla la de los cubos de mayor orden.
Existen combinaciones que no están marcadas razón por la cual no están
en cubos de mayor orden, a estas combinaciones se denominan implicantes
primos.
Un mintérmino que no se combina para formar cubos de mayor orden
también se debe considerar como parte de los implicantes primos.
Para el ejemplo anterior, la tabla de cubos - 2 tiene elementos que no se
pueden combinar entre sí para formar cubos - 3 es decir que todos estos son los
implicantes primos, también en la tabla de los cubos - 1 existe algunas
combinaciones que no se combinaron para formar cubos - 2, estos términos
también forman parte de los implicantes primos.
40
IMPLICANTES PRIMOS
1
1
X
O
2.2.3.3
O
X
O
X
O
0
X
1
X
1
O
X
Selección de un conjunto óptimo de implicantes primos.
No todos los términos de la tabla de implicantes primos forman parte de la
solución ya que pueden tener varias soluciones y se debe escoger la que
contenga menos mintérminos. Para lograr encontrar los términos adecuados se
hace una tabla en la que en la fila se encuentran los términos originales y en la
columna estarán los implicantes primos. En el cruce de una fila y una columna se
coloca una marca si ese termino está contenido en el implicante primo.
Para el ejemplo anterior la tabla será:
0
*
1 0 0 X
1 X 0 1
X 0 X 0-
*
n y 1 y-
*
2
3
6
7
8
V
9
y
T
y
v
í
,/
•J•
^1
'
Jy
JV
V
V
V V V V
1
^
10
13
•\
V
V
V
Basándose en esta tabla se encuentra los implicantes primos esenciales de
la siguiente manera.
Buscamos en cada una de las columnas dónde se encuentra una
sola marca.
41
ii)
El implicante primo que se encuentra en esta fila se considera como
un implicante primo esencial.
iii)
Toda la fila se elimina para indicar que ya ha sido tomada en cuenta
iv)
Las columnas en las que se encuentran las señales eliminadas
también se eliminan.
v)
Se forma la tabla de implicantes primos esenciales.
IMPLICANTES PRIMOS ESENCIALES
X O X O
O X 1 X
1 X 0 1
vi)
A continuación se escoge una de las señales en las columnas en las
que se encuentran 2 señales y se eliminan las columnas y filas con
el mismo criterio anterior. Pero en nuestro ejemplo no existen
columnas sobrantes con dos o más marcas, por esta razón la
solución es única.
La solución entonces es:
XOXO -> B'D'
OX1X -^ A'C
1X01 ->AC'D.
F(A, B, C, D) = A'C + AC'D + B'D'.
Ejemplo 2.
F(A, B, C, D, E) = Smíl, 2, 3, 5, 9, 10, 11, 18, 19, 20, 21, 23, 25, 26, 27).
42
TABLA DE COMBINACIONES.
Mintér- Forma Binaria No. del's
minos A B C D E
mi
0 0 0 0 1
1
Tf\2
ma
ms
m9
mío
mu
mis
mi9
m2o
m2i
m23
m25
m2e
m27
V
V
V
V
V
V
V
V
V
V
V
V
V
V
V
0
0
0
0
0
0
1
0
0
0
1
1
1
0
0
0
1
0
0
0
0
1
1
0
0
1
1
1
0
1
1
1
0
1
0
1 0 0 1 1
1
1
1
1
0
0
0
1
1
1
1
0
0
0
1
0
0
1
1
1
1 1 0 1 0
1 1 0 1 1
CUBOS - 0
1 0000
2 0 0 0 1
3 0 0 0 1
5 0 0 1 0
9 0 1 0 0
10 0 1 0 1
18 1 0 0 1
20 1 0 1 0
11 0 1 0 1
19 1 0 0 1
21 1 0 1 0
25 1 1 0 0
26 1 1 0 1
23 1 0 1 1
27 1 1 0 1
1
2
2
2
2
3
2
3
2
3
4
3
3
4
No. 1 's
1
0
1
1
1
0
0
0
1
1
1
1
0
1
1
1
2
3
4
43
V
V
V
V
V
V
V
V
V
V
V
v
v
V
V
V
V
V
V
V
V
V
CUBOS - 1
000X1
1,3
1,5
00X01
0X001
1,9
0001 X
2,3
2, 10 0X010
2, 18 X0010
3,11 0X011
3, 19 X0011
5,21
X0101
9,11
010X1
X1001
9,25
10, 11 0101X
10,26 X1010
18, 19 1001X
18,26 1X010
20,21 1010X
11,27 X1011
19,23 10X11
19,27 1X011
21,23 101X1
25,27 110X1
26,27 1101X
Cubos - 2
0X0X1
1,3,9,11
2,3, 10, 11
OX01X
2,3, 18, 19
X001X
2, 10, 18,26 XX010
3, 11, 19,27
9, 11,25,27
10, 11,26,27
18, 19,26,27
XX011
X10X1
X101X
1X01X
Cubos - 3
2, 3, 10, 11, 18, 19, 26, 27
XX01X
IMPLICANTES PRIMOS
1,5
00X01
5,21
X0101
20,21
1010X
10X11
19,23
101X1
21,23
1,3,9, 11
0X0X1
9, 11,25,27
X10X1
2,3, 10, 11, 18. 19,26,27 XX01X
44
TABLA DE REDUCCIÓN DE LOS IMPLICANTES PRIMOS.
2
00X01 V
X0101
1010X"
10X11
101X1
0X0X1 V
3
*
X10X1-
*
vYrnly\
Y
/v/xU
9
10
11
18
19
20
21
"N
V
^
23
25
26
27
_/
1
V
j
V
V
V
V
V
- — J —,»,
*
5
"
^|
\l
1
V
^
V
V
-/
f
V
V
V
V
V
tl
_/
f
V
^/
f
J
V
-\l
„/
**
V
•Jí
_/
V
V
V
V
IMPLICANTES PRIMOS ESCENCIALES
X10X1 -» BC'E
XX01X ^ C'D.
Una vez que tenemos los implicantes primos esenciales, ya tenemos una
parte de fa función simplificada ahora tendremos que ver los implicantes primos
secundarios que tienen menor costo, es decir, que tienen menos variables en el
término.
Teorema: 'Sean a y b dos términos implicantes primos de una tabla
reducida de tal manera que el costo de a sea menor o igual al costo de b.
Entonces, si a domina a b o si a y b son intercambiables existe una suma mínima
de productos que no incluye a b.
Utilizamos los implicantes que no se han tomado en cuenta como
implicantes primos esenciales, con las columnas que no han sido eliminadas de la
tabla de simplificación de los implicantes primos para buscar los implicantes
primos secundarios.
45
00X01
1
5 23
V
V
V
X0101
10X11
101X1
0X0X1
V
V
V
El implicante primo 00X01 cubre el mintérmino mi y el mintérmino m5
mientras que el implicante primo X0101 cubre únicamente al mintérmino m5 entre
estos dos el que tiene menos costo es el 00X01, luego el implicante 10X11 y
101X1 ambos cubren únicamente al mintérmino m2s tomamos cualquiera de los
dos
1
*
*
/
00X01 J i
10X11
0X0X1 - V
V
5
i
V
23
/
V
V
V
IMPLICANTES PRIMOS SECUNDARIOS
00X01 -> A'B'D'E
10X11 -* AB'DE.
Como se puede observar existen implicantes primos esenciales y
secundarios, la función resultante simplificada es la operación OR de todos estos
implicantes.
F(A, B, C, D, E) = AB'CD' + BC'E + C'D + A'B'D'E + AB'DE.
46
Ejemplo 3.
F(A, B,C) = Sm(1,4 ( 6,7).
MINTÉRMINO COMBINACIONES NUMERO DE "1S" FUNCIÓN
A B C
0
0 0 0
0
0
1
0 0 1
1
1
2
0 1 0
1
0
3
0 1 1
2
0
4
1 0 0
1
1
1 0 1
5
2
0
6
1 1 0
1
2
1
7
1 1
1
3
Tabla de cubos O
mi
rru
m6
m7
COMBINACIÓN
A B C
0 0 1
1 0
0
1 1 0
1 1 1
número de
"UNOS"
1
V
V
V
2
3
Tabla de cubos - 1
Combinaciones
Cubos 1
M
4, 6
1
X
0
6, 7
1
1
X
IMPLICANTES PRIMOS
0
0
1 X
1 1
1
0
X
M
47
TABLA DE IMPLICANTES
IMPLICANTES PRIMOS ESENCIALES
0
1
1
O
X
1
1
O
X
FUNCIÓN RESULTANTE
En el ejemplo anterior solamente existen implicantes primos esenciales y
no existen implicantes primos secundarios por esta razón existe una única
solución.
2.2.4
FUNCIONES INCOMPLETAMENTE ESPECIFICADAS.
Recordemos que una función de conmutación es especificada en la tabla
de verdad en la que se indica una lista de valores para las 2n combinaciones
posibles para una función de n variables. Los diseños consisten en resolver un
problema o una descripción que por lo general es verbal de un trabajo lógico
traduciendo en una tabla de verdad, para luego buscar una función específica que
satisfaga esta tabla de verdad y un costo mínimo.
En algunas ocasiones el circuito que se diseña es un sistema en el que
ciertas combinaciones no influyen en el funcionamiento del sistema, es decir que
no importa para la salida de este sistema cuando estas combinaciones de
48
entradas sea "O" o "1". Otra posibilidad es que algunas combinaciones de las
entradas nunca suceden debido a restricciones externas del sistema que se va a
diseñar.
Cuando sucede cualquiera de las situaciones antes descritas se dice que la
función es no especificada. Este tipo de salidas se indica en la función como una
salida "X" en lugar de poner un "O" o un "1". Estas condiciones se las conoce
como opcionales y se dice que las funciones están
incompletamente
especificadas. La realización de una función incompletamente especificada es
cualquier circuito que produce las mismas salidas para todas las combinaciones
de entrada para las cuales se especifica la salida
Es conveniente tener una forma algebraica compacta para indicar una
función incompletamente especificada. Para lo cual se usa la suma de los
mintérminos mas una suma de términos no especificados. Ejemplo una función no
especificada es:
F(A, B, C) = Im<4, 5) + d(0, 6, 7).
Esta función indica que los mintérminos m4 y m5 tienen como salida "1"
mientras que los mintérminos mo, me y m7 tienen como salida no especificada.
Representando esto en la tabla de verdad queda.
A
0
0
0
0
1
1
1
1
B
0
0
1
1
0
0
C
0
1
0
1
0
1
1 0
1 1
F(A, B, C)
X
0
0
0
1
1
X
X
Para simplificar las funciones incompletamente especificadas es más
practico usar el método del mapa de Karnaugh ya que en este mapa se toma a
49
las salidas no especificadas como "1" o "O" de acuerdo como produzca un grupo
de mayor cantidad de cuadros, con el objeto de tener una función más
simplificada posible.
1
En este caso los mintérmino me y m? se tomaron como "1" mientras que el
mintérmino m0 se le tomo como riO" ya que con estas consideraciones se obtienen
un grupo de más cuadros es decir la mínima simplificación.
F(A,B)=A
2.2.5 COMPARACIÓN DE LOS MÉTODOS DE SIMPLIFICACIÓN.
-
El método del álgebra de Boole es complicado cuando se tienen funciones con
muchas variables de entrada mientras que el método de mapa de Karnaugh
es un método directo y simple sin importar la cantidad de mintérminos.
-
En el método del álgebra de Boole se necesita que la persona que está
simplificando la función tenga habilidad para aplicar los axiomas apropiados ya
que no existe una regla que especifique cual axioma se debe aplicar con
certeza; mientras que los métodos tanto del mapa de Karnaugh como el
método de Quine-McCIuskey son métodos mecánicos y con proceso fijo lo
cual se puede decir con precisión cual método seguir en el siguiente paso.
-
El método del mapa Karnaugh es un método muy rápido, mientras el método
de Quine-McCIuskey es más elaborado por lo tanto más largo.
50
Cuando existen más de cuatro variables el método del mapa de Karnaugh es
dudoso su seguridad mientras que el método de Quine-McCIuskey es seguro y
confiable.
Cuando son cuatro variables o menos el método del mapa de Karnaugh es
mucho más confiable ya que el método de Quine-McCIuskey es más largo.
El método del mapa de Karnaugh no es un iterativo lo cual dificulta la
posibilidad de implementar un programa computacional, mientras que el
método de Quine-McCIuskey utiliza una técnica iterativa lo cual facilita la
Implementación de un programa computacional para su uso y así lograr
simplificar funciones de muchas variables de entrada.
51
23
IMPLEMENTACION DE LAS FUNCIONES BOOLEANAS
SIMPLIFICADAS.
Una vez simplificada la ecuación correspondiente a la función obtenida
para resolver el problema planteado, se debe implementarlo
para su
funcionamiento, es decir construir el hardware necesario para que cumpla el
objetivo y realice el trabajo planteado en el problema.
Para construir este hardware se utilizan las compuertas lógicas relacionas
con cada una de las operaciones existentes en la función simplificada.
En el primer ejemplo se tiene.
Y = A'C + AC'D + B'D'.
En esta expresión observamos que tanto las entradas A, B, C, y D están
complementadas
es decir que se necesitan pasar por compuertas NOT para
obtener A', B1, C1 y D'.
Para obtener el primer término A'C es necesario las salidas de A' y C
ingresarlas por una compuerta AND de dos entradas, entonces a la salida de la
compuerta AND se obtendrá el valor correspondiente a la expresión A'C.
De la misma manera obtendremos el valor correspondiente al término AC'D
para lo cual la variable A, la salida de C' y la variable D en forma directa se
ingresan a una compuerta AND de tres entradas, o a dos compuertas AND de 2
entradas, y a la salida de cualquiera de estas compuertas se obtendrá AC'D.
Para obtener B'D' igualmente en una compuerta AND se ingresa la salida
de B1 y la salida de D' en forma directa y se obtiene el valor correspondiente de
B'D'.
52
Las tres salidas de las tres compuertas AND antes descritas se deben
ingresar a una compuerta OR de tres entradas para obtener la respuesta final.
Todo esto se resume
en el siguiente
gráfico
del
esquemático
correspondiente al circuito de la función dada.
n
£>«BU-I
i'C
Y=A1C+AC'D+B'D'
Jo.B'D'
Fig. 2.5: Circuito Esquemático de la función Simplificada
Para implementar este esquemático se necesita los siguientes chips:
-
Un chip 7404 el cual contiene 6 compuertas NOT.
-
Un chip 7408 el cual contiene 4 compuertas AND.
-
Un chip 7432 el cual contiene 4 compuertas OR.
Como se puede observar únicamente con tres circuitos integrados se
puede construir el sistema planteado con la función booleana del ejemplo.
53
CAPITULO 3
DISEÑO DEL PROGRAMA COMPUTACIONAL PARA
SIMPLIFICAR FUNCIONES BOOLEANAS.
3.1. INTRODUCCIÓN.
Para simplificar las funciones booleanas utilizando un computador, es
necesario programar el proceso de simplificación paso a paso, en un lenguaje que
permita presentar una interfaz gráfica, amigable, llamativa y fácil de usar, esto
permitirá entender el proceso de Simplificación de Quine-McKIusky.
El programa que se diseñará tendrá una sección teórica en la que se
explica todo el proceso de simplificación de funciones booleanas utilizando ei
método de Quine-McKIusky paso a paso.
Existe otra sección en la que se presenta un tutorial de cómo utilizar el
programa
de simplificación explicando cada una de las partes y objetos
existentes en este programa diseñado.
La tercera sección de este software, es un programa que sirve para
simplificar funciones booleanas de hasta 10 entradas, el programa realiza el
proceso de simplificación utilizando el método de Quine-McKIusky paso a paso
presentando cada uno de los cubos hasta obtener los implicantes primos, luego
indica la tabla de simplificación o de selección de los implicantes primos
esenciales, a continuación realiza una optimización de los implicantes primos
secundarios de menor costo, y por ultimo presenta la función totalmente
simplificada.
Este programa también permite guardar la tabla de combinaciones para
que sea utilizada en otro momento.
54
El ingreso de los datos se los puede hacer directamente en la tabla de
combinaciones o por medio de un editor de mintérminos.
El software diseñado funciona en cualquier computador que tenga el
sistema operativo Windows 95 o superior.
El desarrollo de este software se lo hace utilizando el lenguaje de
programación Visual Basic 6.0 ya que este lenguaje permite programar cualquier
aplicación bajo Windows.
A continuación se hace una descripción de los más importantes objetos de
Visual Basic usados para realizar la aplicación descrita anteriormente.
3.1.1. BREVE DESCRIPCIÓN DEL USO DE FORMULARIOS DE VISUAL
BASIC.
Un formulario en Visual Basic es un objeto en el que se presenta toda la
información, en este objeto se pone los controles los cuadros de texto para el
ingreso de datos, gráficos, listas de datos, comandos, tablas etc.
Fig. 3.1: Formulario usado en VisualBasic.
55
Cuando se ejecuta el programa muestra únicamente el formulario que está
definido como formulario inicial, para mostrar los demás formularios hay que
escribir el código respectivo.
Un formulario al igual que todos los objetos de Visual Basic responden a
eventos que se generan durante la ejecución del programa. Hay cuatro métodos
para trabajar con los formularios.
Show.- Como su nombre indica, el método Show muestra el formulario en
la pantalla, y lo pasa al primer plano del escritorio si está cubierto por otro
formulario. Para ello, cuando use el método Show, Visual Basic comprueba
primero que el formulario está cargado en la memoria, si no lo está, lo carga. La
sintaxis básica de método Show es
/VombreFomru/arío.Show
Load.- La palabra Load carga el formulario en la memoria pero no lo
presenta. Visual Basic carga también el formulario en la memoria siempre que se
haga referencia a sus propiedades o controles en el código. Por esto, la razón
principal para cargar un formulario antes de mostrarlo es disminuir el tiempo de
respuesta, a cambio se emplea más memoria, ya que Visual Basic tiene que
reservar memoria suficiente para el formulario. La sintaxis es
Load NombreFormularío.
Cuando Visual Basic carga un formulario, restaura en todas las
propiedades del mismo los valores definidos inicialmente al diseñarlo, y luego
llama al procedimiento de evento Form_Load.
Hide.- La palabra Hide retira el formulario de la pantalla, pero no lo
descarga de la memoria, los controles no están af alcance del usuario, pero puede
seguir haciendo referencia a ellos en el código. Los valores de fas variables al
nivel de formulario no desaparecen, igual que al cargar el formulario, la ocultación
56
del formulario aumenta la velocidad si va a necesitarlo de nuevo, pero a cambio
de seguir usando la memoria para guardarlo. La sintaxis es
NombreFormulario. Hide
Unload.- Esta palabra borra el formulario de la memoria es decir tiene el
mismo efecto que pulsar el botón de salida o pulsar dos veces en el cuadro de
control en la parte izquierda de la barra de titulo, se pierde toda la información
contenida en sus variables al nivel de formulario. La sintaxis es
Unload NombreFormulario
Cuando se carga, descarga y vuelve a cargar un formulario, siempre
activará el evento Form_Load, pero la única llamada al método Load que activa el
evento Initialize es la primera.
3.1.2. CONTROLES DE VISUAL BASIC
Antes de empezar a conocer los controles básicos veamos cuales son sus
características generales:
Propiedades.- Todos los controles disponen de una serie de propiedades
las cuales se puede cambiar al incluirlos en nuestras aplicaciones; ejemplos de
propiedades son el color, el tipo de letra, el nombre, el texto, etc...
Métodos.- Son procedimientos asociados a los controles, es decir, rutinas
ya establecidas que podemos invocar desde nuestras aplicaciones para que se
realice alguna operación sobre el control.
Eventos.- Son acciones que pueden ser motivadas por el propio usuario o
por mismo sistema operativo. Ejemplos pueden ser el movimiento del ratón o
hacer click sobre su botón. En Visual Basic se puede decir que se utiliza la
programación orientada a eventos, lo cual es una de las diferencias más
importantes respecto a la programación lineal de MS DOS. No necesitamos
57
detectar cuando se ha producido un evento determinado, Windows lo detecta
automáticamente. Los eventos ya están definidos, son bastantes y cada control
cuenta con los suyos propios, aunque son muy parecidos, lo único que se tiene
que hacer es asociar el código necesario al evento que necesitemos tratar.
3.1.2.1 TextBox
Fig. 3.2: Objeto TextBox
Mediante este control se puede realizar tanto la entrada como la salida de
datos en nuestras aplicaciones.
No hace falta indicar las coordenadas de la situación del formulario en
pantalla, simplemente se tiene que marcar sobre el control de la caja de
herramientas y dibujarlo con el tamaño deseado en el formulario.
Propiedades:
Las propiedades de las que dispone el control son las siguientes
Text: Aquí se indica el texto que aparecerá en el control. Podemos
asignarle cualquier texto en tiempo de diseño o ejecución. También podemos
tomar el texto que haya introducido el usuario para tratarlo durante la ejecución.
Ñame: Esta propiedad tiene todos los controles, el nombre que viene por
defecto en este caso Textl y es el nombre con el que se conocerá el control
cuando lo utilicemos en el código. En un mismo formulario no puede haber 2
controles con el mismo nombre. Conviene poner un nombre que represente la
función que tiene el control en la aplicación para que el código quede más claro.
MultiLine: Permite introducir varias líneas de texto en el control en lugar de
sólo una.
Alignment: Es la alineación que tendrá el texto dentro del control: izquierda,
centro o derecha. Para que funcione la propiedad MultiLine debe estar con el
valor true.
Locked: Si está con valor true bloquea el control, es decir, el usuario no
puede introducir ni modificar el texto que contenga. Nos puede servir para utilizar
el control como salida de datos sin que el usuario pueda modificarlos por error.
Otras propiedades que son comunes a la mayoría de los controles:
Backcolor: color de fondo.
Forecolor: color de letra.
Font: tipo y tamaño de letra.
Métodos
Recordemos que por métodos se entienden los procedimientos o funciones
asociados a un control, los cuales nos permiten realizar ciertas operaciones útiles
sobre dicho control: Ej. Ordenar sus elementos, buscar un dato, etc...
Eventos:
Los eventos son acciones que se pueden realizar en cualquier control:
click, doble click, movimiento del ratón. A estos eventos se les puede asociar
código para que se ejecute al producir el evento.
MouseMove: Al mover el ratón por encima del control.
MouseDown: Al pulsar cualquier botón del ratón.
59
Change: Al cambiar el contenido del control.
Click: Al hacer click con el botón izquierdo del ratón sobre el control.
DoubleClick: Al hacer doble click con el botón izquierdo del ratón sobre el
control.
GetFocus: Este evento se activa cuando el control recibe el enfoque, es
decir, cuando se activa el control en tiempo de ejecución para introducir datos en
él o realizar alguna operación.
LostFocus: Es el contrario del anterior evento, se activa cuando el control
pierde el enfoque, es decir, se pasa a otro control para seguir introduciendo datos.
3.1.2.2 Labe!.
Fig. 3.3: Objeto Label
Este control es también uno de los más utilizados, aunque su utilidad
queda restringida a la visualización de datos en el mismo, no permitiendo la
introducción de datos por parte del usuario.
La forma de utilizarlo es similar a la del control anterior, dibujar el control en
el formulario con el tamaño que queramos y asignarle un texto en tiempo de
diseño o de ejecución esta vez sin utilizar la propiedad text puesto que no la
incorpora, sino utilizando la propiedad Caption.
Este control sirve para mostrar mensajes en nuestro formulario que
orienten al usuario sobre la utilidad de los demás controles que tengamos en la
aplicación o para indicarnos acciones que podemos realizar.
60
Propiedades
Caption: Es el texto que contendrá el control.
Alignment: Alineación del texto contenido en el control, no necesita que
esté activada ninguna otra propiedad.
BorderStyle: Si queremos que aparezca un borde alrededor del control
activaremos esta propiedad.
Para este control no se suelen utilizar los eventos ya que su contenido
suele cambiar poco a lo largo de la ejecución de la aplicación. De todas formas
los eventos son casi los mismos del control textbox excepto que no dispone de los
eventos GetFocus y LostFocus ya que a este control no se le puede dar el
enfoque.
3.1.2.3.
CommandButton
Fig. 3.4: Objeto CommandButton.
Este control es el típico botón que aparece en todas las aplicaciones y que
al hacer click sobre él nos permite
realizar alguna operación concreta,
normalmente Aceptar o Cancelar. Aunque según el código que le asociemos
podremos realizar las operaciones que queramos.
Pero sólo con introducir un control de este tipo con el texto salir que se
introduce a través de la propiedad Caption no basta. Habrá que asociarle un
código que nos permita salir de la aplicación en el evento adecuado. Y el evento
por excelencia de este control es click. Así pues accederemos al código del
control y la sentencia que nos permitirá salir de la aplicación es End, simplemente
61
tecleamos esa palabra en el evento click y comprobar que realmente
finalizaremos nuestra aplicación al pulsar sobre dicho botón.
Propiedades
Gaption: Aquí se pone el letrero que queremos que aparezca en el botón:
aceptar, cancelar, salir, etc...
Enabled: Esta es una nueva propiedad, cuando su valor es true el botón
funciona normalmente, cuando su valor es false el botón se encuentra
desactivado, no responde a los eventos producidos sobre él y el texto aparece en
un gris claro advirtiéndonos de su estado. Podemos utilizar esta propiedad para
activar o desactivar un botón dependiendo del estado de otros controles.
Eventos
Click: Es el evento típico de este control y el que más se utiliza.
MouseMove: Como sabemos detecta el movimiento del ratón sobre el
control. Puede servir para que aparezca un mensaje en un control Label que nos
aporte información sobre la utilidad del control ampliando el texto que hayamos
colocado como Caption del CommandButton.
3.1.3. BREVE DESCRIPCIÓN DEL USO DE COMANDOS Y SENTENCIAS EN
VISUAL BASIC.
3.1.3.1.
Fundamentos de la Programación
Cada módulo de formulario contiene procedimientos de evento (secciones
de código donde se colocan las instrucciones que se ejecutarán como respuesta a
62
eventos específicos). Los formularios contienen controles, por cada control de un
formulario, existe el correspondiente conjunto de procedimientos de evento en el
módulo de formulario; además de procedimientos de evento, los módulos de
formulario pueden contener procedimientos generales que se ejecutan como
respuesta a una llamada desde cualquier procedimiento de evento.
El código que no esté relacionado con un control o un formulario específico
se puede colocar en un tipo diferente de módulo, un módulo estándar (. bas). Se
deben colocar en un módulo estándar los procedimientos que se puedan utilizar
como respuesta a eventos de diversos objetos, en lugar de duplicar el código en
los procedimientos de evento de cada objeto.
¿Cómo Funciona una Aplicación controlada por Eventos?
Un evento es una acción reconocida por un formulario o un control. Las
aplicaciones controladas por eventos ejecutan código Basic como respuesta a un
evento. Cada formulario y control de Visual Basic tiene un conjunto de eventos
predefinido. Si se produce uno de dichos eventos y el procedimiento de evento
asociado tiene código, Visual Basic llama a ese código.
Aunque los objetos de Visual Basic reconocen automáticamente un
conjunto predefinido de eventos, se decide cuándo y cómo se responderá a un
evento determinado. A cada evento le corresponde una sección de código que se
denomina procedimiento de evento, cuando se desea que un control responda a
un evento, se escribe el código en el procedimiento de ese evento.
Los tipos de eventos reconocidos por un objeto varían, pero muchos tipos
son comunes a la mayoría de los controles, por ejemplo, la mayoría de los objetos
reconocen el evento Click: si un usuario hace clic en un formulario, se ejecuta el
código del procedimiento de evento Click del formulario; si un usuario hace clic en
un botón de comando, se ejecuta el código del procedimiento de evento Click del
botón, el código en cada caso será diferente.
63
Aquí una secuencia típica de eventos en una aplicación controlada por
eventos:
•
Se inicia la aplicación y se carga(LOAD) y muestra(SHOW) el formulario
inicial.
•
El formulario (o un control del formulario) recibe un evento. El evento puede
estar causado por el usuario (por ejemplo, por la pulsación de una tecla) o
por el sistema (por ejemplo, un evento de cronómetro) o, de forma indirecta
por el código (por ejemplo un evento Load cuando el código carga un
formulario).
•
Si hay código en el procedimiento de evento correspondiente, se ejecuta.
La aplicación espera al evento siguiente.
3.1.3.2.
Variables.
3.1.3.2.1. Alcances de las Variables
El alcance de una variable define qué partes del código conocen de su
existencia; cuando se declara una variable en un procedimiento, sólo el código de
dicho procedimiento puede tener acceso o modificar el valor de la variable, tiene
un alcance que es local al procedimiento.
A veces, sin embargo se necesita utilizar una variable con un alcance más
general, como aquella cuyo valor está disponible para todos los procedimientos
del mismo módulo o incluso para todos los procedimientos de toda la aplicación;
Visual Basic fe permite especificar el alcance de una variable cuando la declara.
3.1.3.2.2. Establecimiento del Alcance de las Variables
64
Dependiendo de cómo se declara, una variable tiene como alcance un
procedimiento (local) o un módulo.
Alcance
Nivel de
procedimiento
Nivel de módulo
Privado
Las variables son privadas
del procedimiento en el que
aparecen.
Las variables son privadas
del módulo en el que
aparecen.
Público
No es aplicable. No puede
declarar variables públicas
dentro de un procedimiento.
Las variables están disponibles
para todos los módulos.
3.1.3.2.3. Variables Utilizadas en un Procedimiento
Las variables al nivel de procedimiento
sólo se reconocen en el
procedimiento en el que se han declarado. Se las conoce también como variables
locales. Se declaran mediante las palabras clave Dim o Static. Por ejemplo:
Dim col As Integer
- o bien Static col As Integer
Los valores de variables locales declaradas con Static existen mientras se
ejecuta la aplicación, mientras que las variables declaradas con Dim sólo existen
mientras se ejecuta el procedimiento.
Las variables locales resultan una elección apropiada para cálculos
temporales. Por ejemplo, puede crear una docena de procedimientos distintos que
contengan una variable llamada col, como cada col se ha declarado como una
variable local, cada procedimiento sólo reconoce su propia versión de col.
Cualquier procedimiento puede alterar el valor de su col local sin que ello
afecte a las variables col de los demás procedimientos.
3.1.3.2.4. Variables Utilizadas en un Módulo
65
De forma predeterminada, una variable al nivel de módulo está disponible
para todos los procedimientos del módulo, pero no para el código de otros
módulos. Se crea variables al nivel de módulo declarándolas con la palabra clave
Prívate en la sección Declaraciones al principio del módulo. Por ejemplo:
Prívate col As Integer
Al nivel de módulo, no hay diferencia entre Prívate y Dim, pero es preferible
Prívate porque contrasta con Public y hace que el código sea más fácil de
comprender.
3.1.3.2.5. Variables utilizadas por todos los Módulos
Para hacer que una variable al nivel de módulo esté disponible para otros
módulos, se utiliza la palabra clave Public para declarar la variable. Los valores de
las variables públicas están disponibles para todos los procedimientos de la
aplicación.
Al igual que todas las variables al nivel de módulo, las variables públicas se
declaran en la sección Declaraciones al principio del módulo. Por ejemplo:
Public col As Integer
A/o se puede declarar variables públicas en un procedimiento, sólo en la
sección Declaraciones de un módulo.
3.1.3.2.6. Declaración de Variables
La forma de declarar las variables es la siguiente:
Dim \ | Static nombre_varíable As tipo
Dim: Al declarar una variable con esta palabra estamos diciendo que la
variable sea local al ámbito en que se declara; puede ser dentro de un
66
procedimiento o dentro de un formulario, de esta forma no sería accesible desde
los demás procedimientos o formularios.
Public: Las variables declaradas serán publicas y podrán estar accesibles
desde todos los formularios de la aplicación. Para conseguirlo tendremos que
declararlas en un módulo de código, no en la sección declarations de cualquier
formulario de los que conste la aplicación. Para crear un módulo de código en el
menú principal de Visual Basic marcamos en PROYECTO/INSETAR MÓDULO y
aparecerá junto a los demás formularios de la ventana de proyecto aunque con un
icono distinto indicando que se trata de un módulo de código
3.1.3.2.7. Tipos de Variables
Tipo
Comentario
BOOLEAN
Sólo admite 2 valores TRUE o FALSE
BYTE
Admite valores entre 0 y 255
INTEGER
Admite valores entre -32768 y 32767
LONG
Admite valores entre -2.147.483.648 y 2.147.483.647
SINGLE
Admite valores decimales con precisión simple
DOUBLE
Admite valores decimales de doble precisión
CURRENCY
Válido para valores de tipo moneda
STRING
Cadenas de caracteres (Texto)
DATE
Fechas, permite operar con ellas
Matrices
Para declarar matrices debemos colocar entre paréntesis el número de
elementos de los que constará a continuación del nombre de la variable:
Dim fíl(16) as Integer
67
De esta forma tenemos una matriz de 16 elementos identificados del O al
15
También se puede indicar los límites inferior y superior de la matriz:
Dim filaanulada(5 To 14) as Integer
Lo que seria una matriz de 10 elementos cuyos índices van del 5 al 14
Las matrices multidimensionales se declaran de la siguiente forma:
Dim Tabla(1 To 1023, 1 To 1023) as Integer
3.1.3.2.8. Consideraciones
Al trabajar con Visual Basic es preferible que se active la opción que nos
obligue a declarar todas las variables que se utilizan, de esta forma nos
ahorraremos errores inesperados como el de trabajar con una variable ya utilizada
anteriormente produciéndose un conflicto difícil de resolver.
En cambio si se intenta declarar 2 variables con el mismo nombre, en el
mismo formulario o procedimiento se produce un error en tiempo de edición
avisándonos de la situación.
Otra opción que es interesante activar, es la de Guardar los cambios en la
ficha entorno, la cual guarda una copia del código antes de ejecutarlo por si acaso
luego no podemos, se bloquea la aplicación etc... de esta forma se asegura que lo
último que se haya ejecutado se tiene guardado en el disco.
3.1.3.3.
Procedimientos
Se puede simplificar las tareas de programación si se divide los programas
en
componentes
lógicos más pequeños.
Estos
componentes,
llamados
68
procedimientos, pueden convertirse en bloques básicos que le permiten mejorar y
ampliar Visual Basic.
Los procedimientos
resultan muy útiles para condensar las tareas
repetitivas o compartidas, como cálculos utilizados frecuentemente, manipulación
de texto y controles.
Hay dos ventajas principales cuando se programa con procedimientos:
•
Los procedimientos permiten dividir los programas en unidades lógicas
discretas, cada una de las cuales se puede depurar más fácilmente que un
programa entero sin procedimientos.
•
Los procedimientos que se utilizan en un programa pueden actuar como
bloques de construcción de otros programas, normalmente con poca o
ninguna modificación.
En Visual Basic se utilizan varios tipos de procedimientos:
•
Procedimientos Sub que no devuelven un valor.
•
Procedimientos Function que devuelven un valor (normalmente conocidos
como funciones).
Un procedimiento Sub es un bloque de código que se ejecuta como respuesta a
un evento. Al dividir el código de un módulo en procedimientos Sub, es más
sencillo encontrar o modificar el código de la aplicación.
La sintaxis de un procedimiento Sub es la siguiente:
[Prívate | Public][Static]Sub nombre_procedimiento (argumentos)
instrucciones
End Sub
69
Cada vez que se llama af procedimiento se ejecutan las instrucciones que hay
entre Sub y End Sub. Se pueden colocar los procedimientos Sub en módulos
estándar, módulos de clase y módulos de formulario.
De forma predeterminada, los procedimientos Sub son Public en todos los
módulos, lo que significa que se les puede llamar desde cualquier parte de la
aplicación.
Los argumentos de un procedimiento son como las declaraciones de variables;
se declaran valores que se pasan desde el procedimiento que hace la llamada.
Resulta muy útil en Visual Basic distinguir entre dos tipos de procedimientos Sub,
procedimientos generales y procedimientos de evento.
3.1.3.3.1
Procedimientos generales
Un procedimiento general indica a la aplicación cómo realizar una tarea
específica. Una vez que se define un procedimiento general, se le debe llamar
específicamente desde la aplicación. Por el contrario, un procedimiento de evento
permanece inactivo hasta que se le llama para responder a eventos provocados
por el usuario o desencadenados por el sistema.
¿Por qué se crean procedimientos generales? Una razón es que muchos
procedimientos de evento distintos pueden necesitar que se lleven a cabo las
mismas acciones. Es una buena estrategia de programación colocar las
instrucciones comunes en un procedimiento distinto (un procedimiento general) y
hacer que los procedimientos de evento lo llamen. Esto elimina la necesidad de
duplicar código y también hace que la aplicación sea más fácil de mantener.
3.1.3.3.2. Procedimientos de evento
Cuando un objeto en Visual Basic reconoce que se ha producido un evento,
llama automáticamente al procedimiento de evento utilizando el nombre
70
correspondiente al evento. Como el nombre establece una asociación entre el
objeto y el código, se dice que los procedimientos de evento están adjuntos a
formularios y controles.
•
Un procedimiento de evento de un control combina el nombre real del
control (especificado en la propiedad Ñame), un carácter de subrayado (_)
y el nombre del evento. Por ejemplo, si desea que un botón de comando
llamado siguiente llame a un procedimiento de evento cuando se haga clic
en él, Se utiliza el procedimiento siguiente_Click.
•
Un procedimiento de evento de un formulario combina la palabra "Form",
un carácter de subrayado y el nombre del evento. Si desea que un
formulario llame a un procedimiento de evento cuando se hace clic en él,
se utiliza el procedimiento Form_Click, (Como los controles, los formularios
tienen nombres únicos, pero no se utilizan en los nombres de los
procedimientos de evento.)
Todos los procedimientos de evento utilizan la misma sintaxis general.
Sintaxis de un evento de control Sintaxis de un evento de formulario.
Prívate Sub nombrecontrol_nombreevento (argumentos)
instrucciones
End Sub
Prívate Sub Fotrn_nombreevento (argumentos)
instrucciones
End Sub
Aunque se puede escribir procedimientos de evento nuevos, es más sencillo
utilizar los procedimientos de código que facilita Visual Basic, que incluyen
automáticamente los nombres correctos de procedimiento.
71
Se puede seleccionar una plantilla en la ventana Editor de código si selecciona
un objeto en el cuadro Objeto y selecciona un procedimiento en el cuadro
Procedimiento.
También es conveniente establecer la propiedad Ñame de los controles antes
de empezar a escribir los procedimientos de evento para los mismos. Si se
cambia el nombre de un control tras vincularte un procedimiento, se deberá
cambiar también el nombre del procedimiento para que coincida con el nuevo
nombre del control. De lo contrario, Visual Basic no será capaz de hacer coincidir
el control con el procedimiento.
Cuando el nombre de un procedimiento no coincide con el nombre de un
control, se convierte en un procedimiento general.
Llamadas a Procedimientos.
Un procedimiento Sub difiere de un procedimiento Function en que, al
procedimiento Sub no se le puede llamar mediante su nombre en una expresión.
La llamada a un procedimiento Sub es una instrucción única.
Además, un procedimiento Sub no devuelve un valor en su nombre como
hace una función. Sin embargo, al igual que Function, un procedimiento Sub
puede modificar los valores de las variables que se le pasan.
Hay dos formas de llamar a un procedimiento Sub:
Ambas instrucciones llaman a un Sub denominado MostrarTabla.
Cali MostrarTabla (PrímerArgumento, SegundoArgumento)
MostrarTabla PrímerArgumento, SegundoArgumento
72
Cuando se utiliza la sintaxis Cali, se debe poner los argumentos entre
paréntesis. Si omite la palabra clave Cali, se debe también omitir los paréntesis
alrededor de los argumentos.
3.1.3.4.
Funciones
La sintaxis de un procedimiento Function es la siguiente:
[ Prívate \ nombre_j>rocedimiento(argumentos)
[As
tipo]
instrucciones
End Function
Al igual que un procedimiento Sub, un procedimiento Function es un
procedimiento diferente que puede tomar argumentos, realizar una serie de
instrucciones y cambiar el valor de los argumentos. A diferencia de los
procedimientos Sub, los procedimientos Function pueden devolver un valor al
procedimiento
que realiza
la
llamada.
Hay tres
diferencias entre
los
procedimientos Sub y Function:
•
Generalmente, se llama a una función incluyendo el nombre y los
argumentos del procedimiento en la parte derecha de una instrucción o
expresión mayor (Vaior_Retorno = funciónQ).
•
Los procedimientos Function tienen tipos de datos, al igual que las
variables. Esto determina el tipo del valor de retorno. (En ausencia de la
cláusula As, el tipo es el tipo predeterminado Variant.)
•
Se devuelve un valor asignándole al propio Nombre_Procedimiento.
Cuando el procedimiento Function devuelve un valor, se puede convertir en
parte de una expresión mayor.
3.1.3.4.1. Llamadas a Funciones.
73
Normalmente se llama a un procedimiento de función que se ha escrito de la
misma forma en que se llama a una función intrínseca de Visual Basic como Abs;
es decir, utilizando su nombre en una expresión:
También es posible llamar a una función igual que se llama a un procedimiento
Sub. Las instrucciones siguientes llaman a la misma función:
Cali Year(Now)
YearNow
Cuando llama a una función de esta manera, Visual Basic desecha el valor de
retorno.
3.1.3.4.2
Paso de Argumentos a Procedimientos y Funciones
Normalmente el código de un procedimiento necesita cierta información
sobre el estado del programa para realizar su trabajo. Esta información consiste
en variables que se pasan al procedimiento cuando se le llama. Cuando se pasa
una variable a un procedimiento, se llama argumento.
3.1.3.4.3
Tipos de datos de los argumentos
Los argumentos de los procedimientos que escriba tienen el tipo de dato Variant
de forma predeterminada. Sin embargo, puede declarar otros tipos de datos para
los argumentos.
3.1.3.4.4
Paso de argumentos por valor
74
Sólo se pasa una copia de la variable cuando se pasa un argumento por
valor. Si el procedimiento cambia el valor, el cambio afecta sólo a la copia y no a
la variable propiamente dicha.
3.1.3.4.5
Paso de argumentos por referencia
El Paso de argumentos por referencia le da al procedimiento acceso al
contenido real de la variable en su ubicación de dirección de memoria. Como
resultado, el procedimiento al que se pasa el valor de la variable se puede
modificar de forma permanente. La forma predeterminada de pasar valores en
Visual Basic es por referencia.
Si especifica el tipo de dato de un argumento que se pasa por referencia,
debe pasar un valor de ese tipo para el argumento. Se puede eludirlo si pasa una
expresión en vez de un tipo de dato como argumento. Visual Basic evalúa la
expresión y la pasa como el tipo requerido si puede.
La forma más sencilla de convertir una variable en una expresión es
ponerla entre paréntesis.
3.1.3.5
Estructuras de Control (Repetición y Decisión)
3.1.3.5.1
Do While - Loop / Do - Loop While.
El bucle Do se utiliza para ejecutar un bloque de instrucciones un número
indefinido de veces. Hay algunas variantes en la instrucción Do...Loop, pero cada
una evalúa una condición numérica para determinar si continúa la ejecución.
75
Como ocurre con If.Then, la condición debe ser un valor o una expresión
que dé como resultado False (cero) o True (distinto de cero).
En el ejemplo de Do...Loop siguiente, las instrucciones se ejecutan siempre y
cuando condición sea True:
Do While condición
instrucciones
Loop
Cuando Visual Basic ejecuta este bucle Do, primero evalúa condición. Si
condición es False (cero), se salta todas las instrucciones. Si es True (distinto de
cero), Visual Basic ejecuta las instrucciones, vuelve a la instrucción Do While y
prueba la condición de nuevo.
Por tanto, el bucle se puede ejecutar cualquier número de veces, siempre y
cuando condición sea distinta de cero o True. Nunca se ejecutan las instrucciones
si condición es False inicialmente. Por ejemplo, este procedimiento cuenta las
veces que se repite una cadena de destino dentro de otra cadena repitiendo el
bucle tantas veces como se encuentre la cadena de destino.
Otra variante de la instrucción Do...Loop ejecuta las instrucciones primero y
prueba condición después de cada ejecución. Esta variación garantiza al menos
una ejecución de instrucciones:
Do
instrucciones
Loop While condición
Hace el bucle al menos una vez
Do Until condición
instrucciones
Loop Do
76
instrucciones
Loop Until condición
3.1.3.5.2
For-Next.
Los bucles Do funcionan bien cuando no se sabe cuántas veces se
necesitará ejecutar las instrucciones del bucle. Sin embargo, cuando se sabe que
se va a ejecutar las instrucciones un número determinado de veces, es mejor
elegir el bucle For...Next. A diferencia del bucle Do, el bucle For utiliza una
variable llamada contador que incrementa o reduce su valor en cada repetición
del bucle. La sintaxis es la siguiente:
For contador = iniciar To finalizar [Step incremento]
instrucciones
Next [contador]
Los argumentos contador, iniciar, finalizar e incremento son todos
numéricos.
El argumento incremento puede ser positivo o negativo. Si incremento es
positivo, iniciar debe ser menor o igual que finalizar o no se ejecutarán las
instrucciones del bucle. Si incremento es negativo, iniciar debe ser mayor o igual
que finalizar para que se ejecute el cuerpo del bucle. Si no se establece Step, el
valor predeterminado de incremento es 1.
Al ejecutar el bucle For, Visual Basic:
•
Establece contador al mismo valor que iniciar.
•
Comprueba si contador es mayor que finalizar. Si lo es, Visual Basic sale
del bucle. (Si incremento es negativo, Visual Basic comprueba si contador
es menor que finalizar.)
77
•
Ejecuta instrucciones.
•
Incrementa contador en 1 o en instrucciones, si se especificó.
•
Repite los pasos 2 a 4.
3.1.3.5.3
Else-Endlf.
Se usa la estructura If.Then para ejecutar una o más instrucciones basadas
en una condición. Se puede utilizar la sintaxis de una línea o un bloque de varias
líneas:
If condición Then instrucción Aquí no hace falta cerrar con End If
If condición Then
instrucciones
Endlf
Condición normalmente es una comparación, pero puede ser cualquier
expresión que dé como resultado un valor numérico. Visual Basic interpreta este
valor como True o False; un valor numérico cero es False y se considera True
cualquier valor numérico distinto de cero. Si condición es True, Visual Basic
ejecuta todas las instrucciones que siguen a la palabra clave Then. Puede utilizar
la sintaxis de una línea o de varias líneas para ejecutar una instrucción basada en
una condición.
3.1.3.5.4
If...Then...Else
Se utiliza un bloque lf...Then...Else para definir varios bloques de
instrucciones, uno de los cuales se ejecutará:
If condición 1 Then
[bloque de instrucciones 1]
/E/se
ui i
v GMWI
ci i ui ia
noua,
oc
acfJdi di i 1UO
vclKJI C&
UUII
IAJI11 día.
WdUd
Uiuque
U tí
79
instrucciones contiene cero o más instrucciones. Si más de un Case coincide con
la expresión de prueba, sólo se ejecutará el bloque de instrucciones asociado con
la primera coincidencia. Visual Basic ejecuta las instrucciones de la cláusula
(opcional) Case Else si ningún valor de la lista de expresiones coincide con la
expresión de prueba.
Observe que la estructura Select Case evalúa una expresión cada vez al
principio de la estructura.
80
3.2
DIAGRAMA DE FLUJO DEL PROGRAMA
Este programa presenta un formulario inicial desde el que se puede
acceder a las diferentes opciones que tiene el programa como son: Una parte
teórica, que explica el proceso de simplificación de Quine-McCIuskey, la segunda
sección en la que se da un tutorial de cómo utilizar el programa de simplificación,
y la tercera parte es para la simplificación de funciones de hasta diez variables de
entrada, en este programa el ingreso de los datos y el proceso de simplificación
se lo realiza paso a paso hasta obtener la respuesta de la función simplificada.
También hay la opción de correr el programa en un solo paso, y por último hay la
opción de salir. En la fig. 3.5 se indica el diagrama de flujo correspondiente al
primer interface del programa.
Menú
Principal
Fundamento
Teórico
Presentación
\e la Teoría
Iniciar
/
Simplificación /""
J
Presentación
del tutorial
f
Proceso de
Fig. 3.5: Diagrama de Flujo del inicio del programa
\
Simpl
81
3.2.1 TEORÍA
Regresar
al Menú
Comando
presionado
Imprimir-
Flechas de Navegación
i
Imprimir el Texto
completo
Navegaren el
Texto
Fig. 3.6: Diagrama de flujo de la presentación de la Teoría,
Es una explicación teórica, en la que se presenta todo lo referente a la
teoría, con respecto al método de simplificación de Quine-McCIuskey, para esto
lo que se hace es abrir un documento realizado en Word y guardado con una
extensión rtf.
La explicación se la hace siguiendo todo el proceso de simplificación para
un ejemplo en particular, el cual está compuesto de tres variables de entrada [A,
82
B, C]. Esta sección es una parte de consulta en la que se explica paso a paso
todo el proceso de simplificación de las funciones booleanas utilizando el método
de Quine-McCIuskey. La presentación
de la teoría se hace
únicamente
presentando en un objeto RichTextBox el documento realizado en Word y
guardado con el nombre "Texto, rtf, la navegación y revisión del texto se lo hace
con la barra de navegación existente en el objeto RichTextBox..
En esta ventana también existe la opción de imprimir todo el contenido del
Texto; y se puede seleccionar y copiar una parte del texto y pegarlo en alguna
otra aplicación. La figura 3.6 muestra el diagrama de flujo de la rutina de
presentación de la teoría en la pantalla del monitor
3.2.2
SIMPLIFICACIÓN
En esta parte existe un programa que permite simplificar paso a paso una
función booleana de hasta diez variables o entradas utilizando el método de
Quine-McCIuskey, el ingreso de datos se puede hacer por medio de una tabla de
combinaciones, en la que el programa genera cada una de fas combinaciones de
las variables de entrada mientras que el usuario ingresará las salidas O o 1
correspondientes a cada combinación, el programa se encarga de poner los
mintérminos respectivos en el editor de mintérminos. También se puede ingresar
directamente todos y cada uno de los mintérminos en este caso el programa se
encarga de calcular el número de entradas y construir la tabla de combinaciones
correspondiente a la suma de los mintérminos asociados, este programa también
permite guardar la tabla de datos ingresada para recuperarla en otro momento, la
extensión de los archivos tipo texto con los que se guarda es *.boo, también se
puede abrir un archivo o una tabla ingresada anteriormente para simplificarla.
En el figura 3.7 se presenta el diagrama de flujo del programa para la
simplificación de funciones lógicas.
83
^Simplificación
Presenta la pantalla de
ingreso de datos
-Abrir
Abrir el Archivo
Ingresar datos
por mintérminos
Ingresar datos
por tabla
iF
Presentar Tabla de
Combinaciones y
mintérminos
Comando
Ingresado
O¡
Tiene la
respuesta
final?
Está la tabla de
combinaciones
Simplifica el
siguiente paso
Simplifica el
paso anterior
Fig. 3.7: Diagrama de flujo para la simplificaóión de las funciones.
84
3.2.3
TUTORIAL
El tutorial enseña paso a paso a utilizar el programa de simplificación para
lo cual se utiliza un ejemplo de 4 variables de entrada, la presentación es igual
que la presentación de la simplificación, también se explica paso a paso la forma
de utilizar este programa tanto en el ingreso de datos como en el proceso de
simplificación. En la figura 3.8 está el diagrama de flujo para el tutorial.
Inicio
Tutorial
Presenta la
Teoría
Ingresar
Comando
/Siguiente
Comando
Ingresado
Anterior /
Ultima
xplicación?
Primera
xplicación?
Presentar la
siguiente
explicación
Presentar la
anterior
explicación
Fig. 3.8: Diagrama de flujo del Tutorial.
85
33.
DIAGRAMA DE FLUJO DE LA SIMPLIFICACIÓN.
Para realizar la simplificación de una función se siguen los siguientes
pasos:
Ingreso de los datos en la tabla de verdad
Formación de los cubos n
Construcción de la tabla de implicantes primos
Construcción de la tabla de simplificación
Simplificación de la tabla de implicantes primos
Obtención de la ecuación booleana
3.3.1. INGRESO DE LOS DATOS EN LA TABLA DE COMBINACIONES.
El ingreso de los datos se puede hacer de dos formas: directamente en la
tabla, o ingresando los mintérminos. Si el ingreso se hace en la tabla los
mintérminos se actualizan automáticamente, para esto se debe saber cuantas
entradas o variables tiene la función. Si el ingreso de datos es por medio de los
mintérminos la tabla de combinaciones se actualiza automáticamente, también se
calcula inmediatamente el número de entradas de acuerdo a los mintérminos
ingresados.
Si el ingreso de datos se lo hace por medio de la tabla, la salida debe ser
un 1 o un O caso contrario aparece un mensaje que indica que se ha ingresado un
dato incorrecto, la combinación que tiene como salida un 1, da lugar a un
mintérmino, este mintérmíno se actualiza en un vector r(i), luego se actualiza en el
indicador de mintérminos, Cuando la salida de la función es O o 1, también se
actualiza el indicador de mintérminos, a continuación se revisa que se haya
ingresado todos los datos de la tabla, si es así se habilita el botón del comando
<siguiente> para estar preparado y empezar en cualquier momento el proceso
de simplificación.
86
Mientras se ingresa las salidas de la función se puede regresar a cambiar
cualquier dato errado o fallante, el cambio o corrección también se puede hacer
en el indicador de mintérminos.
Las combinaciones se ponen automáticamente de acuerdo al número de
entradas de tal forma que una función de n entradas tendrá 2n combinaciones. En
la figura 3.9 se indica una función con 4 entradas que contiene 16 combinaciones.
Número de entradas A
Indicador
\s
/Tabla de
-x
V Combinaciones^
Fig. 3.9: Tabla de una función con 4 entradas
Cuando se ingresa los datos por medio de la tabla se debe también
analizar si el dato ingresado es O o 1 caso contrario se debe volver a pedir el
ingreso del dato correspondiente, también estos datos ingresados en la salida de
la función se almacena en un vector r(i), que es el que tienen los datos de salida
de la función. Basándose en el valor del r(i) se actualiza el indicador de
mintérminos.
87
(jngresoj
Nuevo
~z_
Ingresar Mintérminos
Ver indicador de Mintérminos
Calcular n
Actualizar r(i)
Actualizar Tabla
<Otro>
<Space>
<Enter>
Calcular n
Actualizar r(i)
Actualizar Tabla
Ingresar Tabla
*
~
Ingresare!
número de
entradas
Indicar
Combinación
/
/ Ingresar la /
función /
No
r(i)=f
Actualizar mintérminos
Habilitar botón Siguiente
Habiliotar Menú Guardar
C
Fin
)
Fig. 3.10: Diagrama de flujo para el ingreso de los datos.
88
Cuando se ingresa los datos por medio de la ecuación o mintérminos en
cambio la posición r(i) se escribe un 1 basándose en el mintérmino ingresado y en
las posiciones r(i) que no tiene dato alguno se pone el 0. Inmediatamente y
basándose en el mintérmino más alto ingresado se calcula el valor de n, y
finalmente se actualiza la tabla de combinaciones.
Cuando se presiona la tecla <Enter> quiere decir que ya se han ingresado
todos los mintérminos correspondientes a esta función entonces habrá que
completar la tabla de combinaciones y dejar listo para empezar el primer paso de
la simplificación.
En la figura 3.10 se indica el diagrama de flujo para el ingreso de los datos
ya sea directamente en la tabla o como un mintérmino.
33.2. FORMACIÓN DE CUBOS.
La formación de los cubos O, cubos 1, cubos 2, etc... depende del número
de entradas. Para poder realizar la formación de cubos se utiliza una matriz de
cubos c(i, j) que está definida como una matriz de orden 2047 x 16 debido a que
el programa se hará de hasta 10 variables y para seguridad por el número de
combinaciones en cada uno de los cubos se define de 2047. la primera columna
de la matriz contiene los cubos O, la segunda columna tiene el cubo 1, la tercera
columna tiene los cubos 2, y así sucesivamente, los datos de cada una de los
cubos de simplificación se indican en dos objetos llamados ListBox. Para llevara
el control de que cubos han sido calculados se utiliza una variable llamada (coi),
para tener control de cuantos elementos existen en cada columna de la matriz se
utiliza un vector fil(¡) en el que se almacena el número de elementos en cada una
de las filas. También se debe almacenar los mintérminos, y combinaciones de
mintérminos utilizados para construir los respectivos cubos, este almacenamiento
se hace en otra matriz O(i, j).
Los cubos se forman únicamente con las combinaciones que tienen como
salida un 1, se ordena estas combinaciones de acuerdo al número de 1s que tiene
cada combinación.
Finalmente eí resultado se muestra en un ListBox. Si ya fueron calculados
fos cubos O únicamente se muestran sin necesidad de volver a calcularlos. En la
fig. 3.11 se muestra una tabla de cubos ceros para la función anterior.
rnrri[ilifu:.i<Mnn
Número de entradas 4
MINTERMINOS
0001
001 1
0101
0111
1 001
1011
1101
1111
CUBOS O
0001
001 1
0101
1 001
0111
1011
1101
1111
Fig. 3.11: Tabla de Cubos ceros para una función de 4 entradas
Los cubos O se almacenan en la primera columna de la matriz c(i, j) los
demás cubos se almacenaran en las demás columnas de la misma matriz. En las
figura 3.12 y 3.13 se indica el diagrama de flujo para la obtención de los cubos 0.
Una vez calculado los cubos ceros se debe calcular los cubos 1, cubos 2, hasta
cuando ya no haya mas combinaciones que se asocien las combinaciones que se
han asociado forman parte de los cubos n y las combinaciones que no se ha
combinado con otras para formar parte de los cubos de orden superior formaran
parte de los implicantes primos, para esto se señala la combinación asociada
ubicando unas marcas en la misma posición de la matriz c(i, j) en otra matriz
90
llamada marca(í, j), basándose en esta matriz se encontraran los implicantes
primos. En las figuras 3.14, 3.15 y 3.16 se indica el diagrama de flujo para obtener
los cubos n de una función booleana. En la figura 3.17 se indica las tablas de
cubos 1 y cubos 2 para una función booleana de 5 entradas.
Ocultar la Tabla de combinaciones
col=col"M
No
fila=fila+1
c(fila,0)=i
Fig. 3.12; Diagrama de Flujo para la obtención de los cubos 0.
91
i— u
*
3r
Mn
•*^-"~*"'r7ÍV-T^"1""fc-^»^
Si
t
cont=0 |
^
pos=1
Bit=Val(Mid(*fíi\
Hv» 1\
P05» ';/
i i.^-^^fíií-T
1^>
—-""""^
s¡
No
•
pos=pos+1
J>
J L
I cont=cont+1 I
if
Si
J*
No
-r-*^*rnnf~iTi^*^^-^
i: +1
it
1
Si
raya = raya + 1
fila * fila + 1
c(fila, col) = f(i)
O(fila, col) = Str(i)
*--—-"""^T?* n^
i""?"—**-•
Si
^-——nrr"^-
4)
j=j+1
^i
Nn
M~
Si
Y
fil(col)=fila
Mostra *
cubos 0
Habilitar Comandos
Actuiiza MaxCol y Max
O7F*in_^>
Fig. 3.13: Continuación del diagrama de flujo para la obtención de los cubos 0.
92
cont=cont+1
spos=j
cpos = pos
Fig. 3.14: Diagrama de flujo de obtención de los cubos n
93
fila = fila + 1
c(fila, col + 1) = c(i, col)
Marca(i, col) = "*"
Marcaü, col) = "*"
Mid(c(fila, col + 1), cpos) = "X"
cont2 = O
k=1
c(fila, col + 1) = c(k, col+
O(fila,col
O(i, col) & " " & Oíspos, col)
Fig. 3.15: Continuación del diagrama de flujo de obtención de los cubos n
94
©
fil(col + 1) = fila
Actualizar MaxColCubos, MaxCol, Max
col=col+1
fila = O Or col = Aux
ultima = True
fíl(col) = auxiliar
Mostrar los cubos n
o los implicantes primos
Fig. 3.16: Continuación del diagrama de flujo de obtención de los cubos n
95
Simplificación
1(1235910111819202123252627)
CUBOS 1
000X1
00X01
0X001
0001X
0X01 O
X001O
0X01 1
X001 1
X01 01
01 0X1
XI 001
01 01 X
XI 01 O
1 001 X
1X010
Número de entradas 6
CUBOS 2
0X0X1
OX01X
X001 X
XX01 O
XX01 1
X1 0X1
XI 0 1 X
1 X01 X
Fig. 3.17: Tabla de cubos 1 y cubos 2 para una función de 5 entradas.
3.3.3. TABLA DE IMPLICANTES PRIMOS
Para hallar los implicantes primos se debe tomar todas las combinaciones
de cada uno de los cubos n que no se combinaron para formar cubos de orden
superior. Para lo cual leemos en la matriz marcafi, j) las posiciones en las que no
existe la marca "*" dentro de esta matriz corresponden a los implicantes primos.
Como se puede ver en el diagrama de flujo de la figura 3.18, únicamente si
los implicantes primos no han sido hallados antes aux1<>col se hace el cálculo de
los implicantes primos caso contrario se muestra directamente.
En ai figura 3.19 se indica una tabla de implicantes primos de una función
de 5 entradas.
96
No
No
fila = fila + 1
O(fila, col) = O(i( j)
c(fila, col) = c(i, j)
Marca(fila, col) =""
fil(col) = fila
i'
Mostrar Implicantes Primos
Actualizar MaxCof
Actualizar Max
Implicantes =True
d
-J r
Fin^>
Fig. 3.18: Diagrama de flujo para la obtención de los implicantes primos.
funcionSb boo
(12359101118192021232526271:3
Número de entradas b
IMPLICANTES PRIMOS
00X01
X01 01
1 01 OX
1 0X1 1
1 01X1
0X0X1
XI 0X1
XX01 X
Fig. 3.19. Tabla de implicantes primos para una función de 5 entradas.
3.3.4. TABLA DE SIMPLIFICACIÓN DE LOS IMPLICANTES PRIMOS.
La tabla de simplificación de implicantes primos es una tabla que se
construye en base de todos los implicantes primos y los mintérminos, poniendo
una marca en cada casillero que pertenece al mintérmino y al implicante primo en
el que está contenido; para construir esta tabla de simplificación se ubica en la
primera columna
a todos los implicantes primos, y todos los mintérminos
ordenado en la primera fila y en cada celda que corresponde al implicante primo
con sus respectivos mintérminos se ubica una marca.
Los mintérminos se encuentran en forma desordenada dentro de la matriz
O(i, j) pero en la tabla se debe poner en forma ordenada ascendentemente para lo
cual la primera columna de la matriz O(i, j) la pasamos a un vector s(i) para poder
ordenarlo.
En la figura 3.20 se indica una tabla de simplificación para una función de 5
entradas.
98
235310111819202123252627
Numero de entradas 5
TABLA DE SIMPLIFICACIÓN
0 oso i
X 0 1 0 1
1 O 1 OX
Para poder construir esta tabla de simplificación primero se debe construir
una matriz tabla(i, j) en la que se guardan las marcas en la misma posición que se
ubica dentro de la tabla.
La matriz tabla(i, j) tiene el mismo número de filas que el número de
implicantes primos, y el mismo número de columnas que el número de
mintérminos o del vector S(i, j).
Cada elemento de la última columna de la matriz O(i, j) se compara con
cada uno de los elementos del vector S(i) y en el caso de que coincidan quiere
decir que el mintérmíno correspondiente contiene al elemento S(i) entonces se
pondrá una marca en esa posición de ía tabla.
Luego comparamos cada elemento del vector s(i) con cada uno de los
elementos de la matriz Q(i, j) para ver cual mintérmino coincide con los elementos
del vector.
Como se puede observar en el diagrama de flujo si la tabla ya ha sido
calculada lo único que se hace es indicarla, sin necesidad de volver a calcularla.
En las figuras 3.21, 3.22 y 3.23 se indica el diagrama de flujo para construir la
tabla de simplificación.
99
aux = s(i)
s(i) = aux
Fig. 3.21: Diagrama de flujo para la construcción de la tabla de simplificación.
100
subíndice = Mid(O(i, col), p1, P2-P1)
1f
No
al(subindice) = Val(s(j))
O-
Fig. 3.22. Continuación del diagrama de flujo para la construcción de la tabla de
simplificación.
101
3ps = Len(O(i, col)]
T
Si
subíndice = Mid(O(i, col), p1, p2 - p1 + 1)
al(subtndice) = Val(s
Dibujar Tabla
Tablalmplicantes = True
marcas = True
Fig. 3.23. Continuación del diagrama de flujo para la construcción de la tabla de
simplificación.
102
33.5.
SIMPLIFICACIÓN DE LA TABLA DE IMPLICANTES PRIMOS
La simplificación de la tabla de implicantes primos consta de dos partes la
primera parte corresponde a encontrar los implicantes primos esenciales.
xxoix
1010X
X1 0X1
Fig. 3.24: Tabla de los implicantes primos esenciales y la tabla de
implicantes primos secundarios.
La segunda parte corresponde a encontrar los implicantes
primos
secundarios si existen ya que es posible que no estén cubiertas todas las
columnas.
En la figura 3.24 se indica una tabla de implicantes primos esenciales y
secundarios para una función de 5 entradas.
Para encontrar los implicantes primos esenciales seguimos el siguiente
criterio.
Buscamos la primera columna que tiene una sola marca y lo
marcamos
como
anulada,
para
esto
se
crea
un
vector
ColumnaAnulada(i) en el que se almacenará los valores True o
False según sea la columna anulada o no.
El implicante primo que está en la fila de la marca encontrada se
toma como implicante primo esencial y forma parte ya de la solución
y le ponemos una marca como fila anulada, esto se hace utilizando
un vector FHaAnulada(i) en el que se almacena un True o un False.
103
iii)
Todas las columnas que tienen marca en dicha fila se lo marca
como anulada usando el vector ColumnaAnulada(i).
«C^Esenciales
__
contvmax = O
i=1
ablaíi, i) = T
contv(i)=contv
contvmax < contv
T
Si
contvmax = contv(i)
contv(i) = 1 and
lumnaAnulada(i) = Fals
ColumnaAnuladfa(i)=True
1=1
Fig. 3.25: Diagrama de flujo para hallar los implicantes primos esenciales.
104
abiafj, i) = "*" And filaAnuladaíi) = False
filaAnulada(j) = True
numeroFila(i) = j
fila = fila + 1
c(fila, col + 1) = c(j, col)
¡2 = 1
Tabla(j, Í2) = "*"
olumnaAnulada(¡2)
No
fs o
cok
columnaAnulada(¡2)
True numeroFiia(i2)
fe~*
Poner las marcas
fil(col+1)=fila
Actualizar MaxCoí
Actualizar Max
MostrarEsenciales
esenciales=True
Fig. 3.26: Continuación del diagrama de flujo para obtener los implicantes primos
esenciales.
105
iv)
Se repite este proceso en todas las columnas que tienen una sola
marca y no está anulada.
En las figuras 3.25 y 3.26 se indican el diagrama de flujo para encontrar los
implicantes primos esenciales.
Para calcular ios implicantes primos secundarios, se debe hallar los que
tengan el mayor costo con el objetivo de simplificar al máximo.
i)
En cada fila se cuenta cuantas marcas tiene dentro de las columnas
no anuladas, para esto se crea un vector ContH(i) en el que se
almacena el número de marcas que tiene cada fita en tas columnas
no anuladas.
ii)
Empezando por la fila que tiene el mayor número de marcas y se
toma ese implicante primo como secundario y formará parte de la
solución y se anula la fila para lo cual utilizamos el vector
FilaAnulada(i).
iii)
Se eliminan todas las columnas que tienen marca en el implicante
primo tomado en el numeral anterior.
iv)
Repetimos este proceso hasta que todas las columnas estén
anuladas.
Tanto los implicantes primos primarios y secundarios se almacenan en la
matriz c(i, j)f en las posiciones c(col+1, j) y c(col+2, j) respectivamente, para
tomarlas luego de esas columnas para hallar la solución.
En las figuras 3.27 y 3.28 se indica el diagrama de flujo para la
obtención de los implicantes primos secundarios.
106
marcasmax=0
contH(i)=0
filaAnulada(i):
lumnaAnulada(j)
conth(i) = conth(i) + 1
marcasmax < conthfi
marcasmax
conth(i)
Si
Fig. 3.27: Diagrama de flujo par obtener los implicantes primos
secundarios.
107
conthQ) = marcasmax
And filaAnulada(j) = False
nd marcasmax > O
sihay=False
¡2 = 1
TablaG, ¡2) = "*"
lumnaAnulada(¡2)
columnaAnulada(i2) = True
numeroFíla(¡2) =j
sihay = True
filaAnulada(j) = True
fila = fila + 1
c(fila, col + 2) = c(j, col)
MostrarMarcas
fil(col + 2) = fila
Actualizar MaxCol
Actualizar Max
MostrarSecundarios
Fig. 3.28: Continuación del diagrama de flujo para obtener los
implicantes primos secundarios.
108
33.6.
ECUACIÓN BOOLEANA SIMPLIFICADA
La ecuación booleana simplificada se calcula basándose en los implicantes
primos esenciales y basándose en los implicantes primos secundarios, de la
siguiente manera.
La ecuación booleana simplificada es una suma de productos.
Cada uno de los productos se forman de los implicantes primos obtenidos
tomando en cuenta que las variables que están con un 1 se toman las variables
directamente; la variable que está con un O se toma la variable complementada;
mientras que las variables que están con una X no se les toma en cuenta.
El resultado lo ponemos en un TextBox.
Como se puede ver primero analiza los implicantes primos esenciales
luego los implicantes primos secundarios.
En las figuras 3.29 y 3.30 se indican los diagramas de flujo para obtener la
solución de la ecuación booleana.
109
disolución
1'
Text6="Y="
i=1
'Text6=Text6+Variable
Complementada
XxText6=Text6+Variable
Fig. 3.29: Diagrama de flujo para obtener la solución.
LIO
Text6=Text6+Variable
Complementada
Text6=Text6+variable
-^Mostrar Solución ^^
Fig. 3.30: Continuación del diagrama de flujo para la obtención de la
solución
111
3.4
RESULTADOS OBTENIDOS.
Para probar los resultados del programa diseñado se hizo con varias funciones
existentes en el libro de Hill and Peterson y se obtuvo los siguientes resultados.
La función de 4 entradas: f(A, B, C, D)=Zm(0, 2, 3, 6, 7, 8, 9, 10, 13).
'ínter minos 1 0 2 3 6 7 8 9 1 0 1 3 )
Fig. 3.31: Editor de mintérminos
Una vez ingresada la ecuación dentro del indicador de mintérminos
automáticamente se construye la tabla de combinaciones y se calcula el valor de
n correspondiente.
14
1000(1"
¡1001 [í"
Fig. 3.32: Tabla de combinaciones de la función ingresada como mintérminos.
Como se puede comprobar la tabla de combinaciones esta de acuerdo con
los mintérminos ingresados sin ningún error el tiempo de calculo fue de menos de
un segundo.
112
A continuación presionamos el comando para calcular el cubo O y
obtuvimos el siguiente resultado.
0
2
3
6
7
8
9
10
13
0000
001 0
001 1
0110
0111
1 000
1 001
1010
1101
0000
001O
1 000
001 1
01 1 O
1 001
1010
0111
1101
Fig. 3.33: Tabla de cubos 0.
El tiempo de demora fue mucho menos que un segundo, efectivamente los
mintérminos están ordenados de acuerdo al número de unos que tiene cada
combinación. Y únicamente coge como cubos O a las combinaciones que tienen
como salida un 1.
Todos los cálculos hechos en el programa concuerdan con los cálculos
realizados a mano.
A continuación calcularemos los cubos 1 obteniendo el resultado que se
indica en la figura 3.34.
Los cubos 1 son las combinaciones resultantes de combinar dos cubos O
como se puede ver en la parte inferior de la tabla de cubos 1, el cubo 1 10X0
viene de combinar el m8 y el m10.
El tiempo de cálculo de los cubos 1 fue de aproximadamente 1 seg., lo cual
hace que sea bastante rápido.
113
* 0000
00X0
xooo
"0010
* 1 000
001 X
0X1 O
X01 O
1 OOX
"0011
"0110
* 1 001
"1010
0X1 1
01 1 X
1X01
* 01 1 1
* 1 1 01
Fig. 3.34: Cubos 1 de una función de 4 variables de entrada.
A continuación calculamos los cubos 2.
CUBOS 2
* 00X0
" XOOO
1(0, 2. 8.
0X1 X
* 001 X
* 0X1 O
* X01 O
* 1 0X0
* 0X1 1
* 01 1 X
1 X01
Fig. 3.35: Tabla de cubos 2 para la función de 4 variables de entrada.
Combinando los cubos 1 se calcula los cubos 2 por ejemplo el cubo 2
XOXO se formo combinando los cubos 1 (0,2) y (8, 10) mientras que los cubos 1
que no se combinaron para formar cubos 2 como es el caso de los cubos 1 (8, 9)
y los cubos 1 (9, 13), pasarán a formar parte de los implicantes primos.
114
Las combinaciones del cubo 1 que se combinaron para formar cubos 2 se
marcan con una "*" como se puede ver en la tabla de la parte izquierda, mientras
que los cubos 1 que no se combinaron no se marcan.
En la figura 3.36 se indican, los cubos 3 si es que existiera pero en este
caso ya no existen cubos de mayor orden es decir el siguiente paso será calcular
los implicantes primos.
GMBOS2
IMPLICANTES PRÍMOS
xoxo
100X
1X01
xoxo
0X1 X
11,2,3.6,7)1
Fig. 3.36: Tabla de implicantes primos
Los implicantes primos son los cubos anteriores que no se combinaron
para formar cubos de orden superior como se puede ver en el gráfico el cubo 2
0X1X forma parte también de los implicantes primos.
Una vez calculado los implicantes primos se procede a optimizarlos
utilizando una tabla de simplificación de los implicantes primos.
o
2
*
*
3
6
7
1 0 0 X
1 X 0 1
xoxo
0 X 1 X
6
*
9
*
10
13
*
*
*
*
*
*
*
*
Fig. 3.37:Tabla de Simplificación de los implicantes primos.
En la Figura 3.37 podemos ver que el implicante primo 100X contiene a los
mintérminos
m8 y m9 mientras que el implicante primo 0X1X contiene a los
mintérminos m2, m3, m6, m7. Es decir esta tabla se forma con los implicantes
primos y los mintérminos involucrados en estos implicantes primos.
115
El cálculo de los implicantes primos esenciales se los hace tomando los
implicantes primos que coinciden con las columnas que tienen una sola marca.
Todas las columnas que tienen marcas en la misma fila del implicante
primo encontrado se eliminan poniendo una marca en la parte inferior de las
columnas.
c
TABLA DE SIMPLIFICACIÓN
2
3
É
e
-
1 0 0X
—j
(•\s>
jii
(•\»
>
fk ¡i)
,
t
j
i
i3
/\• >i>
T
!
3
xoxo
9
i
oxix
;
1X01
;
Fig. 3.38: Tabla de los implicantes primos esenciales.
Como todas las columnas de la tabla están señaladas como anuladas no
existe implicantes primos secundarios y únicamente existen implicantes primos
esenciales.
El siguiente paso será entonces calcular la solución basándose en estos
implicantes.
Fig. 3.39: Solución simplificada de la función de 4 entradas
La solución obtenida es una solución de compuesta por una suma de tres
términos, es igual que la calculada manualmente.
A continuación se realiza una pruebe con una función de 5 entradas o
variables.
116
La función a probarse es:
f(A, B, C, D, E) = Z(0, 6, 8, 10, 12, 14, 17, 19, 20, 22, 25, 27, 28, 30)
En este caso haremos el ingreso de los datos directamente en la tabla de
combinaciones de 5 entradas, para este caso utilizamos el menú, como se indica
en la figura 3.40.
•
f
Quine McCIuskey Simplificación
Fig. 3.40: Comando para una función de 5 entradas.
Una vez ejecutada este comando aparece la siguiente ventana en la que
ingresaremos las salidas para cada una de las combinaciones.
Mint éi minos |(Q6810121417 192022 25 27 28 30)31
|OQQQQ[Í|IOOOO[O'
0 0 0 0 1 [0
00010JO
0 0 0 1 1 ¡0
¡001 00|0
10001 |1
10G1QJO
1001 1 ¡1
1 0100J1
I O Q I O I [5*11 0101 [ÍT
|ooi iofT|i 011 op"
|001 11 [O |101 1 1 [O
j___^p__j_.
11001 fT
11 oí ofo"
o i o i ijo" 11011 pT
ioofT|n i o o f T
OIQOI
|om i fo Jn 111 |T
Fig. 3.41: Tabla de combinaciones.
117
Cuando se ingresa la tabla automáticamente se actualizan los mintérminos
cuando se termina de ingresar todas las salidas se habilita el comando de
siguiente para proceder a la simplificación.
CUBOS O
"00000
0X000
* 01000
01 0X0
01 XOO
"00110
"01010
"01100
* 10001
"10100
"01110
"10011
"10110
"11001
0X1 1 O
X01 1 O
01X10
01 1X0
X1 1 00
1 00X1
1 X001
1 01X0
1 X1 00
Fig. 3.42: Primera página de los Cubos O y cubos 1 de una función de 5 entradas.
En este caso como el número de cubos 1 es mayor que 16 mostramos por
paginas verticales de 16 en 16 para lo cual se muestra un comando para poder
ver las siguientes páginas con los otros cubos 1.
"11011
"11110
1X011
1X110
1 1 0X1
1 1 1 XO
Fig. 3.43: Segunda página de los cubos O y de los cubos 1.
Cuando se indica la siguiente pagina aparece otro comando para mostrar la
pagina anterior.
118
01 XXO
0X000
01 XXO
XX1 1 O
X1 1X0
1 XOX1
1 XI XO
XX1 1 O
X1 1 XO
1X O X 1
1X1 XO
Fig. 3.44: Cubos 2 e Implicantes primos.
TABLA DE SIMPLIFICACIÓN
0
*
_
„
_
—
__
6
10
8
c{ s>
f
\
12
,¿
17
2O
22
25
27
'
-. -4
•< >,J
^
/,
\
X 1 1 X0
*,
-
1 X O X1
•
19
-;
4 •'
f -\
{
1
l'l
>
íl !?
1 X 1 X Q-
•
*
!
'
-
Fig. 3.45: Primera página horizontal de la tabla de simplificación
2
30
A U U Lr^
*
1 A A Lr^
>i
>
X 1 1 X0
A
U A
1
A
1
U^
A
/• !>
\l.'
ÉSCEENCiALES
0X000
XX1 1 O
01XXO
1X0X1
1X1X0
Fig. 3.46: Segunda página horizontal de la tabla de simplificación e implicantes
primos esenciales.
Y^AWE'+CDE'+A'SE'+AC'E+ACE'
Fig. 3.47: Solución simplificada de la función de 5 entradas
119
En esta función también únicamente existe implicantes primos esenciales y
la función obtenida es igual a la obtenida manualmente.
A continuación se prueba con otra función también de 5 entradas.
f(A, B, C, D, E) = Zm(1, 2, 3, 5, 9, 10, 11, 18, 19, 20, 21, 23, 25, 26, 27).
Esta función fue guardada anteriormente en el disco para lo cual tenemos
que abrirlo utilizando el menú como se indica a continuación el siguiente gráfico.
•
Quine McCtuskey: Simplificación
Función TutoMi Teoría
Fig. 3.48: Ejecución del comando para abrir un archivo guardado en el disco
Ejecutando este comando aparece la siguiente ventana en la que se
selecciona el archivo deseado.
[MASTER
I Consultas
Qj Piimef Texto presentado
C3 TEXTO
tunctónICb.boo
functón2.boo
función3.boo
Iunctón3b.boo
Iuncion4boo
Iuncion4b.boo
luncionSboo
JfuncionSb boo
m \. 3.49: Ventana para seleccio
L ^J
i
120
Este comando abre la función, construye la tabla de combinaciones,
actualiza los mintérminos y actualiza el número de entradas quedando listo para
proceder a la simplificación.
En la figura 3.50 y figura 3.51 se indica el proceso de obtención de
implicantes primos.
|oooon|o
OOQO[0
|OOOQl[T'fÍ' 0001 [o
|OOQ1o[l"p'
ooiopr
ioooiifi~p' 0011
001 00
fT
ÓF oioopr
0 0 1 0 1 "F 0101 |T
|ooi loprp 011 o|o
fooTTTfoT" oTTTfT
|01QQO|o'p 1000(0'
| 0 1 0 0 l f T p 1001 [T
|oioio[Tp 1010(1"
[oToTTfrp 1011 [T
101100(5" p
|0110l(?p
|0111Q[cTp
lonnJíTp
Fig. 3.50: Función abierta
En la figura 3.51 se indica todo el procedimiento para obtener los
respectivos Cubos O, Cubos 1, Cubos 2, cubos 3 y los implicantes primos
correspondientes a esta función que estamos utilizando como ejemplo.
121
CUBQS1
CUBOS O
* 0001 O
00011
00101
01001
01010
10010
10100
CUBOS 3
CUBOS2
000X1
00X01
0X001
0001X
0X01 O
X001 O
0X0X1
OX O1 X
X OO1 X
XX01O
| XX 0 1 X
XX01 1
XI 0X1
X 1 O1 X
1 X O1 X
IMPUONTES PRfWOS
01011
10011
10101
1 1 001
11010
10111
11011
00X01
X01 01
1 01 OX
1 0X1 1
101X1
0X0X1
XI 0X1
XX01 X
1 01 OX
X I 01 1
1 0X1 1
1 X01 1
101X1
1 1 0X1
1 1 01 X
Fig. 3.51: Proceso de obtención de los implicantes primos.
En las figuras 3.52 y 3.53 presentaremos la tabla de simplificación de los
implicantes primos, los implicantes primos esenciales, los implicantes primos
secundarios y la función simplificada.
T/s.81A DE;S.M PiIF G¿id 0»1
e
9
1D
i i 13
:-•'-
]
f\
2
2
f- \
\
'
f\\
1
X 0 1 0 1
*
1 0 1 X 1
0 X 0 X 1
X
1
_ _ _1_ 0
_ HX __
19
2
>1>
•
ir
=
*
•
-H.. .,1
/•\>,>
F
-.
>
M|
Fig. 3.52: Primera página de la tabla de simplificación.
En el sentido horizontal no alcanzan todos mintérminos por esta razón hace
falta otra página horizontal para poder mostrar todos los mintérminos.
122
25
*
U
X U
26
27
JT^
X 0 1 0 1
*
U
1 U Jt~
•
U
A 1
1~
0
X
1
X
1
0
0
0
1
1
1
X-
1
0
X
X
X
X
X
1
:•
':y
I
,;
'ESCENeíALESSeCUNDARiOS
XX01X
00X01
1 01ÜX
10X1 1
XI 0X1
Fig. 3.53: Segunda pagina de la tabla de simplificación e implicantes primos
En este gráfico se puede comprobar que fa función tiene 3 implicantes
primos esenciales y dos implicantes primos secundarios.
La primera fila de la tabla de simplificación
contiene a todos los
mintérminos, mientras que la primera columna contiene a los implicantes primos.
También se observa que a la izquierda de los implicantes primos están las marcas
de los implicantes primos que son tomados en cuenta como esenciales o
secundarios.
Fig. 3.54: Solución simplificada de la función abierta
La solución contiene los tres primeros términos que provienen de los
implicantes primos esenciales y los dos últimos términos que salen de los
implicantes primos secundarios.
Función de 6 entradas:
f(A, B, C, D, E, F) =Zm(1, 2, 3, 4, 5, 8, 9, 10, 17, 20, 21, 24, 25, 27, 32, 33, 34, 36,
37, 40, 41, 42, 43, 44, 45, 46, 47, 48, 56, 59, 62)
123
( oooooo (irI o 10000(0 | looooo fT11 0000(1
joooooT 010001|1 f l O O C i G I [T 11 0001(0
(QOQQ1Q
I Q O O O I I [i"loiooii(o(ioocni [o [110011 [o*
000100
(000101 1 (010101
( 0 0 0 1 1Q,|ÍT|01 011 O o
(ioono|o'|noiio
I O O Q I I I |cT|oioTii 0 ( 1 0 0 1 1 1 lo"! 110111'
í"l 1 0 1 0 0 0 (fl 111_000|1
J 0 0 1 0 0 1 [v [oí 1001(1 (101 d o i
To.
1 J11101 o|o
10011 oo|oj011100(011011 oo[i~|i 11100(0
1111 01 (O
001101 fo 011101
101110(1" 111110(1
O 01110 Jo" 0 1 1 1 1 0
001111 [ O j 0 1 1 111JO J 1 0 1 1 11 ff (1 11 11 1 (0
Fig. 3.55: Tabla de combinaciones de una función de 6 entradas.
CUBOSo
* oooooi
* 101000
*
*
*
*
* 1 10000
00001 O
000100
001000
100000
* 00001 1
* 000101
* 001001
* 00101 O
* 010001
"010100
* 01 1000
* 100001
* 10001 O
CUBOS0
"101111
"111011
"111110
"010101
"011001
"100101
" 101001
"101010
"101100
* 1 1 1000
"011011
"101011
"101101
"101110
* 100100
Fig. 3.56: Tabla de cubos 0.
124
CUBOS 1
0000X1
000X01
00X001
0X0001
XOOOOI
00001X
00X01 O
X0001O
0001OX
0X0100
X00100
001OOX
0010X0
0X1000
X01000
1OOOOX
CUBOS 1
1000X0
100X00
10X000
1XOOOO
0X0101
X00101
0X1001
X01001
X0101 O
010X01
01X001
0101OX
011OOX
X11000
100X01
CUBOS 1
10X001
10X01O
1 OO1 O X
1 OX 1 O O
1 01OOX
1010X0
101X00
1X1000
1 01 1 O X
1011X0
XI 101 1
101X11
1X1011
1011X1
101 1 1 X
1X1110
1 • xooo
01 1 0 X 1
10X101
1010X1
01X01
1 0 10 1X
1 0 1X 1 0
Fig. 3.57: Tabla de cubos 1,
CUBOS 2
0X0X01
XOOX01
OXX001
XOX001
XOX01O
0X01OX
XQ01OX
0X1OOX
X01OOX
X010X0
XX1000
* 1OOXOX
CUBOS 3
1 OXXOX
"1OXX01
* 1 0X1 OX
* 1 01OXX
* 101XOX
"101 XXO
1 01 XXX
* 1 01XX1
* 101XIX
* 1 01 1 XX
* 1OXOOX
10X0X0
* 1OXXOO
1XXOOO
Fig. 3.58: Tabla de cubos 2 y de cubos 3.
125
IMPLICANTES PRIMOS IMPLICANTES PRIMOS
XX1000
0000X1
10X0X0
00001X
1XXOOO
0110X1
1OXXOX
X11011
1 01 XXX
1X1011
1X1110
0X0X01
XOOX01
OXX001
XOX001
XOX01O
0X01OX
X001OX
0X1OOX
X01OOX
X010X0
Fig. 3.59: Tabla de implicantes primos.
]
TABLA DE SIMPLIFICACIÓN
c
3
2
4
e
G
D
17
2D
2
f\)1
*
0 0 0 0 1X
;
0 1 1 0 X 1
1 X 1 0 1 1
0 X 0 X O 1
X 0 0 X O 1
(\f
(• \
(1 1
1
_X _ 0_ _X_ 0_ _0 _
'
f
\
*
f
\
1
)
{• >,
\t
X 0 0 1 0 X
_
--
-
n
1-1
V
U X 1 U O X
X 0 1 0 0 X
X 0 1 0 X0
_J
id
,.—.,,
Fig. 3.60: Primera página Horizontal y Primera página Vertical de la tabla de
simplificación
126
TABLA DE SIMPLIRCACION
1
2
4
3
8
*
5
X X 1 0 0 O
1 0 X 0 X 0
1 X X 0 0 0
9
10
17
20
21
-
¡
t
i
1
^^•'1
Fig. 3.61: Primera Página Horizontal y Segunda Vertical de la tabla de
Simplificación.
TABLA DE SIMPLIFICACIÓN
24
25
27
32
33
34
36
37
40
41
42
1
»
0 O 0 0 1X
0 1 1 0 X 1
c-\¡ \
•
1 X 1 0 1 1
•
0 X 0 X 0 1
X 0 0 X0 1
i
1
•
(y. •>>
X 0 X0 0 1
X 0 X 0 1 0-
.
*
X 0 0 1 0 X
- -tí*..
^
|
(
X 0 1 0 OX
X 0 1 0 X 0
pcsr^crur-iAi t=c
r~
QPi^iiunADiric
Fig. 3.62: Segunda Página Horizontal y primera página Vertical de la tabla de
simplificación.
TABLA DE SIMPLIFICACIÓN
24
X X 1 0 0 0
f
1 0 X 0 X 0
1 X X 0 0 0
!
•
„
i
i
i
25
27
32
33
ir
34
36
41
•
if
f
^
42
{• \7
f \0
1
:
^^^^^j
^^B^S
1
Fig. 3.63: Segunda página Horizontal y segunda página vertical de la tabla de
simplificación.
127
43
*
44
45
46
47
48
56
59
62
U U U A 1
0 0 0 0 1X
0 1 1 0 X 1
*
(\\
1 1 U 1 1
1 X 1 0 1 1
•
s
\
A l l í Lr^
0 X 0 X 0 1
X 0 0 X 0 1
•
A X U U 1
X 0 X 0 0 1
*
U A U i Lr^
*
A U 1 U A
X
0
X
X
0
X
0
0
0
1
1
1
1
0
0
0
0 X
0 X0 X
X0
A * -t-r*
Fig. 3.64: Tercera Horizontal y primera vertical de la tabla de simplificación.
TABLA DE SÍM PURGACIÓN
1
43
44
45
46
47
X X 1 0 0 0
1 0 X 0 X 0
1 XX0 0 0
*
U
A A U A
<•
U
1
A A A
48
56
59
62
-
T;
1
¿
}
\i
ri y
^^
(. 7
\
(• V
\
(.\>
ce
Fig. 3.65: Tercera página Horizontal y segunda página vertical de la tabla de
simplificación.
ESCENCIALES
0X01OX
101XXX
1XXOOO
1X1110
SECUNDARIOS
OXXOQ1
0X1OOX
XOX010
1OXXOX
X11011
0000X1
Fig. 3.66: Implicantes primos esenciales y secundarios.
Fig. 3.67: Solución simplificada de la función
128
Función de 7 entradas.
F(A, B, C, D, E, F, G) =Sm (1, 2, 3, 5, 7, 9, 11, 15, 17, 19, 21, 22, 23, 25, 27, 29,
30, 31, 33, 37, 38, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 65, 66, 67, 69, 71,
73, 75, 77, 79, 81, 83, 85, 87, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111,
113, 115, 117, 119, 121, 123, 125, 127).
0000000
J0000001
0000010
0000011
0000100
0000101
0000110
0000111
0001000
00010D1
0001010
D00101 1
0 0010QOOJO
0100000
1
1
1
01000D1
0
1
0
1
0
1
0
1
0001 1 00 o
0001101 o
0001 1 10 0
0001 1 1 1
0010001
0010010
0010011
00101 00
0010101
00101 10
00101 11
001 1000
001 1001
001 1010
001101 1
0011100
001 1101
J001 1110
1
o
•
p
0100011 P
01 0 0 1 0 0 p
0100101
0 0100010
1
0
1
F
ir
ir
1
1
0110000|
0110001 |
011001 O J
011001 1 |
0110100]
0110101 |
011Ü11QJ
01001 10
0 1 0 0 1 11
01101 1 1 ¡
0 0101000
01 1 1 0 0 0 ¡
[T 0 1 0 1 0 0 1
0111001J
0 0 1 0 1 0 1 0 0 01 1 1 0 1 0 J
010101 1
0111011
o
"
p
ir
r
0101 100 0 0111 100
0101 101
1
011 1 101
" 0101 110 0 \ 1 1 11 1 0
i joomi iF" 0101111 1 ¡0111 111 j
Fig. 3,68: Tabla de combinaciones.
1
2
3
5
7
9
11
15
17
19
21
22
23
25
27
29
000000 1
00000 10
000001 1
0000 10 1
0000 1 11
000 100 1
000 1011
000 1 1 1 1
00 1000 1
00 100 1 1
00 10 10 1
00101 10
00101 1 1
00 1 1 00 1
00 1 10 1 1
00 1 1 101
MINTERMINOS
30
31
33
37
38
39
41
43
45
47
49
51
53
55
57
59
0 0 1 1 1 1 1)
001111
01 0000
010010
01 001 1 )
(
010011
010100
010101
0101 10
010111
01 1 000
01 1 001
011010
011011
011100
011101
Fig. 3.69: Mintérminos.
MINTERMINOS
61
65
66
67
69
71
73
75
77
79
81
83
85
87
91
93
01 1 1 1 01
1 0 000 0 1
1 00 00 1 0
1 0000 1 1
1 0 00 1 0 1
1 000 1 1 1
1 00 1 00 1
1 00 1 0 1 1
1 00 1 1 0 1
1 00 1 1 1 1
1 0 1 000 1
1 0 1 00 1 1
1 01 01 01
1 01 01 1 1
1 0 1 1 01 1
1 01 1 1 01
129
95
97
99
101
103
105
107
109
111
113
115
117
119
121
123
125
1011111
1 100001
1 1 0001 1
1100101
1100111
1 1 01 0 0 1
1101011
1101101
1101111
1 1 10001
1110011
1110101
1110111
1111001
1111011
1111101
Al
H|
MINTERMINOS
127 1 1 1 1 1 1 1
*j .
IB
Fig. 3.70: Míntérminos.
A continuación se indica los cubos ceros.
CUBOS O
*OOOOOQ1
* 000001 0
* 0 0 0 0 0 11
"0000101
* 000 100 1
* 001 0001
* 0 1 0000 1
* 100 0 001
* 1000010
* 00001 11
* 0001 0 1 1
" 001 001 1
* 001 1 001
* 01 0 0 1 01
Al * 01 0 0 1 1 1
jQ " 0 1 0 1 0 1 1
Al " 0 0 1 1 1 1 1
JH " 0 1 0 1 1 1 1
0 1 0 0 1 10
" 0 1 0 1 001
* 01 1 0 0 0 1
0 1U1 10 1
"0110011
* 01 1 0 1 01
"0111001
"1000111
"1001011
"1001101
"1010011
iU 1 U 1U1
"1100011
" 1 1 0 0 1 01
* 1 1 01 0 0 1
"1110001
0110111
"0111011
. -í * 01 1 1 1 0 1
* 10 0 1 1 11
"1010111
• * 1000011
'•'•• - • ; * 1 0 0 0 1 01
* 1 o o 1o n i
" 1 01 0 0 0 1
* 1 100001
* 0001 1 11
"0010111
"0011011
" 001 o í 01 [si * 0 0 1 1 1 01
* oo 1 o 1 1 o
IB * n n 1 1 1 1 n
m¿
wi
A] " 1 0 1 1 1 1 1
JH " 1 1 0 1 1 1 1
"1110111
J: " 1 1 1 1 0 1 1
"1111101
"1111111
* 1o 1 1n 1 i
"1011101
"1100111
1 1 v I U I 1
jAé
„ - *
"1101101
• •
"1110011
* 1 11 01 01
v v. ; ;,,
"1111001
n-?M
Fig. 3.71: Cubos O
má
"3$
130
Desde la figura 3.72 hasta la figura 3.74 se indican los cubos unos.
CUBOS1
CUBOS 1
00000X1
0000X01
000X001
00X0001
0X00001
X000001
000001X
X00001 0
X000101
00010X1
00X1 001
0X01 001
X001 001
001 00X1
001 0X01
001 X001
0000X1 1
000X01 1
00X001 1
X00001 1
00001X1
00X0101
0X00101
CUBOS 1
X01 001 1
T| 0 0 1 0 1 X 1
001X101
000X1 1 1
00X01 1 1
0X001 1 1
001X110
f\v i f\ i
UX 1 Ü U 0 1
V
A Uf\ U1 1U
X01 0001
01 00X01
01 0X001
01 X0001
XI 00001
0001 XI
00X1 01
0X01 01
X001 01
001 0X1
*| 10000x1
W\J1000X01
Al
CUBOS 1
Al 100x001
TI 10X0001
1X00001
1 00001 X
jy 001x01 1
T| 0X1 001 1
XI
01
01
01
XI
0X1 0 1 0 1
X01 01 01
001 01 IX
001 1 0X1
001 1 X 0 1
0X1 1 001
1 1 1
1
1
1
1
1
Al 0 1 0 1 X 0 1
3¡ 0 1 X 1 0 0 1
1 000X1 1
1 00X0 1 1
1 0X001 1
1 X0001 1
01001X1
01 0X1 01
01 X01 01
XI 001 01
*| 0 1 0 0 1 1 X
5] 0 1 0 1 0X1
01 001
1 00X1
1 0X01
1 X001
1 0001
1 0001 XI
1 00X1 01
1 0X01 01
Jl 1 X001 01
'W 1 001 0X1
Fig. 3.72: Cubos 1
CUBOS 1
CUBOS 1
i 001 x o i
Al 0 0 1 1 x 1 1
JQ o x i 1 0 1 1
1x01001
1 01 0 0 X 1
1 01 0X01
1 XI 0 0 0 1
1 1000X1
1 100X01
1 1 0X001
1 1X0001
00X1 1 1 1
0X01 1 1 1
X001 1 11
001X111
0X10111
X 0 1 01 1 1
X 0 1 1 01 1
001 1 1X1
0X1 1 1 01
X 0 1 1 1 01
001 1 1 1 X
01 0X1 11
01 X 0 1 1 1
X I 0 0 1 11
0101X11
01X1011
XI 01 01 1
01011X1
fr) 01X1101
™ X 1 0 1 10 1
CUBOS 1
0110X11
01 1 X 0 1 1
XI 1 001 1
01101X1
011X101
XI 1 01 01
0 1 1 1 0X1
01 1 1 X01
XI 11 0 0 1
1 00X1 1 1
1 0X01 1 1
1 X001 1 1
1001X11
1 0X1 01 1
1 1 1 X 0 1 01 1
™ 10011X1
Al
¥1
CUBOS 1
Al
Tj 1 X 0 1 1 01
1 01 0X1 1
101X011
1X10011
10101X1
101X101
1X10101
1 1 00X1 1
1 1 0X011
1 1 X001 1
11001X1
1 1 0 X 1 01
1 1 X 0 1 01
jlj 1 1 0 1 o x i
W\ o1x1i 0110x10 1
Fig. 3.73: Cubos 1
CUBOS 1
Si
1 1 1 00X1
1 1 1 0X01
1 1 1X001
X01 1 1 1 1
XI 01 1 1 1
XI 1 01 11
X1 1 1 0 1 1
XI 1 1 1 01
1 0X1 1 1 1
1 X01 1 1 1
101X111
1X10111
jrj 1 0 1 1 X 1 1
AjW\1 1 X 1 1 0 1 1
131
CUBOS 1
lonixi
1X11101
1 1 0X1 1 1
1 1X01 1 1
1101X11
11X1011
11011X1
11X1101
1 1 1 0X1 1
111X011
11101X1
111X101
1 1 1 1 0X1
1 1 11X01
1x11111
CUBOS 1
Al
11X1111
j] 1 1 1 X 1 1 1
1111X11
11111X1
•1
X
VI
Fig. 3.74: Cubos 1
Desde la figura 3.75 hasta la figura 3.77 se indican los cubos 2.
CUBOS 2
CUBOS 2
OOOOXX1
000X0X1
00X00X1
XOOOOX1
00X0X01
0X00X01
XOOOX01
OOXX001
0X0X001
XOOX001
OXX0001
XOX0001
XX00001
X00001 X
00X0X11
XOOOX11
OOXX01 1
XOOX01 1
XOX0011
0 0 X 0 1 X1
0 X 0 0 1 XI
X 0 0 0 1 XI
O X X 0 1 01
X O X 0 1 01
XX001 01
00X1 0X1
0X01 0X1
X 0 0 1 0X1
OOOXX1 1
n
y 11vn\Jn 11
U y
/\S
ffl
XX01001
Al
10
CUBOS 2
ooioxxi
Al
Al 0 X 0 1 X I 1
T| X 0 0 1 X 1 1
O X X 1 01 1
X01 00X1
X O X 1 01 1
001 XX01
X X 0 1 01 1
0X1 0X01
001 XX1 1
X01 0X01
0X1 0X1 1
0X1 X001
X01 0X1 1
XX1 0001
0X1 X01 1
01 O X X 0 1
OOXX1 1 1
X01 X01 1
01 X O X 0 1
0X0X1 1 1
X X I 00 1 1
XI 0 0 X 0 1
XOOX1 1 1
001X1X1
01 X X O Q 1
OXX01 1 1
0 X 1 01 XI
XI 0 X 0 0 1
X 0 1 01 XI
XOX01 1 1
n
y i y i ni
yU
n\Jn1 1
•1 y
•y
1 .A.
U )XV 1 .A. 1 \J 1
/>. 1
1 /*^yo
v vn
U o
1 i ^tl
^H
A.
1 1 i i .^tl •
1
0
0
0
X
X
1
Tj
X
"
0 0 x 1 xi i T] 0 1 X I 0 1
001X0X1
100X0X1
T\1 10 00 X
X 01 0 X 1
1X000X1
1 OOXX01
1 0X0X01
1X00X01
1X0X001
1XX0001
Fig. 3.75: Cubos 2
133
CU8OS8
OOXOXX1
XOOOXX1
OOXXOX1
XOOXOX1
XOXOOX1
OXXOX01
XOXOX01
XXOOX01
OXXX001
XXOX001
XXX0001
OOXXX1 1
XOOXX1 1
XOXOX1 1
CUBOS3
r
oxxoixi
'M x i x x o o i
XOX01X1
XX001X1
XXX0101
OXX1 0X1
XX010X1
001 XXX1
0X1 O X X 1
X01 OXX1
0X1X0X1
H.
X X I
00X1
[jg
xoxxoi 1 \m
xioxxoi
X1XOX01
XOXX1 11
XXOX1 11
XXX01 11
X O X 1 XI 1
X X 0 1 XI 1
a| x x x i o n
1H< x o i x x n
Fig. 3.78: Cubos 3
CUBOS3
1XXOX11
1XXX01 1
1 OXX1XI
1XOX1X1
1XX01XI
1XXX101
1X01XX1
1X1OXX1
11OXXX1
11XOXX1
11XXOX1
11XXX01
M XX1 0X1 1
ül X X 1 X 0 1 1
10XOXX1
1XOOXX1
1X0X0X1
1XXOOX1
1XOXX01
1XXOX01
:
0X1 XX01
XX 1 0 X 0 1
01 X X X 0 1
i ooxxxi
1X1XX11
1X1XIX1
1 1XXX1 1
11XXIXI
1 1X1XXI
1 1 1XXXI
1XXX111
1XX1XI1
1XX11X1
Fig. 3.79: Cubos 3
mt
m
X01X1X1
XX1 0 1 X 1
X X 1 XI 01
XI 0 X 1 X 1
X1 X 0 1 X1
X 1 X X 1 01
X I 01 X X I
X1X1 0X1
X1 X I X 0 1
XI 1 O X X 1
X1 1 X 0 X 1
XI 1 X X 0 1
1 OXXX1 1
1XOXX1 1
134
CUBOS 4
xoxoxxf
XXXOX01
XOXXX11
XXX01X1
XXIOXX1
X1XXX01
1XOXXX1
1XXOXX1
1XXXX11
1XXX1X1
11XXXX1
Fig. 3.80: Cubos 4
En la figura 3.81 se indican los implicantes primos.
IMPLICANTES PRIMOS IMPLICANTES PRIMOS IMPLICANTES PRIMOS
01001 1 X
X01X1X1
11XXXX1
X00001X
001XI1X
OOXXOX1
XOOXOX1
OXXX001
XXOX001
OXX10X1
XX010X1
001XXX1
0X1X0X1
0X1XX01
XXOX111
XX01X11
XXXI011
XXIX011
XX1X101
XI0X1X1
X101XX1
XIXI0X1
X11X0X1
XOXOXX1
XXXOX01
XOXXX11
XXX01X1
XX1OXX1
X1XXX01
1XOXXX1
1XXOXX1
1XXXX11
1XXX1X1
Fig. 3.81: Implicantes primos
Desde la figura 3.82 hasta la figura 3.96 se indican la tabla de simplificación
135
TABLA DE SIMPLIFICACIÓN
1
2
3
/4. ;
s
fL \
5
7
9
15
17
19
•
—
-
_
-,
X O U O O 1 JS~
1
*
0 0 X X 0 X 1
•
•
1
*
T
_
.
•
0 X X X 0 0 1
••
X X 0 X 0 0 1
"
(• \1
~•
X X 0 1 0 X 1
T
0 X 1 X 0 X 1
0 X 1 X X 0 1
,
X X 0 1 X 1 1
X XX 1 0 1 1
X X 1 X0 1 1
*
*
»
T
T
T
r
Fig. 3.82: Tabla de Simplificación
TABLA DE SIMPLIFICACIÓN
21
22
23
f\
t
\
25
27
29
30
31
¿ )•i
f\3
*
*
«
^
*
0 0 X X 0 X 1
*
0 X X X 0 0 1
X X 0 X 0 0 1
i-sfl7
—
X X0 1 0 X 1
f
\
»
0 X 1 X 0 X 1
0 X 1 XX0 1
X X0 1 X 1 1
X XX 1 0 1 1
X X 1 X0 1 1
T
*
*
Fig. 3.83: Tabla de Simplificación
37
«w
136
"
3
39
41
(• -,
\
J
c\
)
¡
1.
43
47
i
5
1
53
55
!
!
«
*
0 0 X X 0 X 1
49
,
<
i
t
t
0 X X X 0 0 1
X X Q X 0 0 1
(3
\5
^
X X 0 1 0 X 1
1
•
0 X 1 X 0 X 1
0 X 1 X X 0 1
1
X O X 1 1 1
-
t
X X 0 1 X 1 1
X X X 1 0 1 1
'
1
1
X X 1 X 0 1 1
•
j
ii
i
!
i
1
"V
Fig. 3.84: Tabla de Simplificación
TABLA DE SIMPLIFICACIÓN
57
59
61
*
65
6
6
/•\f
t\ht
69
71
1
75
*
0 0 X X0 X 1
_
(• \
\
0 XXX0 0 1
X X 0 X 0 0 1
*
f.
X X 1 O X 1
)
X X 0 1 0 X 1
T
*
0 X 1 X 0 X 1
0 X 1 X X 0 1
i
1
•
•
X U X 1 1 1
i
V
m
*
X X 0 1 X 1 1
X XX 1 0 1 1
V
X X 1 X 0 1 1
•4»
Fig. 3.85: Tabla de Simplificación
137
TABLA DE SIMPLIFICACIÓN
79
91
81
83
e 5 87
77
93
95
97
-"
*
a
í
0 0 X X 0 X 1
;
0 X X X 0 0 1
'.
X X0 X 0 0 1
i
X X 0 1 0 X 1
*
0 X 1 X 0 X 1
o xi r xoi
1
X X 0 1 X 1 1
X X X 1 0 1 1
1
T
f
X X 1 X 0 1 1
m
mm
*
WÉf
Fig. 3.86: Tabla de Simplificación
99
Vr
*
10 1
10 3
10 5
10 7
10 9
11 1
11 3
11 5
11 7
,
*
0 0 X X 0 X 1
0 X X X 0 0 1
X X 0 X 0 0 1
F
X X 0 1 0 X 1
>
^
*
'
0 X 1 X 0 X 1
0 X 1 X X 0 1
.*
'•
X X O 1 X 1 1
X X X 1 0 1 1
X X 1 X 0 1 1
•
•'
• -
fV*
má
Fig. 3.87: Tabla de Simplificación
138
119
12 1
12 3
12 5
127
i
*
i
j
..1 ,
0 0 X X 0 X 1
u u x u & i
i
0 X X X 0 0 1
X X 0 X 0 0 1
i
1
_]
i
h""
X X 0 1 0 X 1
U
1
;
i
f
~1
X A X 1
\
0 X 1 X 0 X 1
0 X 1 X X 0 1
A
U Ji.
1
1 1
s
X X0 1 X 1 1
X X X 1 0 1 1
X X 1 X0 1 1
!
Fig. 3.88: Tabla de Simplificación
i
1
3L
2
I
7
•
*
cí
11
15
17
19
X 0 1 X 1 X1
X X 1 X 1 0 1
X 1 0 X 1 X 1
X
X
X
X
1
1
1
0
0
X
1
X
1
1
X
0
X
0
0
X
X
X
X
X
1
1
1
1
\„
X
X
X
X
1
1
.
•
f \
*
0
X
X
1
X
X
X
X
1
X
0
X
X
0
O
X
X
0
X
1
X
X
X
X
1 1
X 1
X 1
0 1X 1
X 1
-'
*
f ilf
\
f
\
.**
;*••-
'f -
^
-- -.
.4.
w
«
—
——
— —( «_
—
„;_
,_
—
1 XX X X 1 1
,—„ . -™^ .
1 X X X 1 X 1-
^.~
•fH
Fig. 3.89: Tabla de Simplificación
139
TABLA DE SIMPLIFICACIÓN
22
21
X
X
X
X
X
X
X
0
X
1
1
1
1
0
1
1
0
0
X
1
X
X
X
X
1
1
X
0
1
1
1
X
0
0
X
X
0
X
X
X
X
X
25
23
27
29
30
1
1
1
1
1
1
1
31
•
33
37
•
/ •l
»
f.{\
k)
/. \
\
..*, .
X 0 X X X 11
X X X 0 1 X 1
'
«
1 X 0 X X X1
1 X X 0 X X1
1 X X X X 11
Jí
•P>
Fig. 3.90: Tabla de Simplificación
TABIA DE SIMPLIFICACIÓN
39
39
41
43
! 45
47
49
S
53
55
X 0 1 X 1 X1
X X1 X1 0 1
X 1 0 X 1 X1
X
X
X
X
1
1
1
0
0
X
1
X
1
1
X
0
X
0
0
X
X
X
X
X
•
Jr
1
1
1
1
•t
i
/¡ •,
v¡ >
/1
1. >
*
X 0 X X X 1 1
X X X 0 1 X 1
1 i
X X U
-
-
i
„
1—
\\
-*¡ *~
^
1
1 X 0 X X X 1
1 X X 0 X X 1
1 XXX X 1 1
1
1
•NP
Fig. 3.91: Tabla de Simplificación
140
TABLA DE SIMPLIFICACIÓN
59
61
65
66
67
69
1
57
X 0 1 X 1 X 1
7í
73
75
•
•T-
'
1
X X 1 X 1 0 1
X 1 0 X 1 X 1
X 1 0 1 X X 1
X 1 X 1 0 X 1
1
X 1 1 X 0 X i
'
•
•
X 0 X 0 X X 1
/ •>
1)
*
/ „.,,
<! &
1-
-
X 0 X X X 11
X X X 0 1 X 1
1
A A A U 1-
•
1 X 0 X X X 1
1 X X X X 1 1
\1—
1 X X X 1 X 1-
1
'
J!
J[
^
1 X X 0 X X 1
T
*
-
.
—
•P»
Fig. 3.92: Tabla de Simplificación
TABLA DE SIMPLIFICACIÓN
79
a 1 83 85 87 91
77
1
X 0 1 X í X 1
X X 1 X 1 0 1
X 1 0 X 1 X 1
93
ir
i
95
iF
97
X 1 0 1 X X 1
X 1 X 1 0 X 1
X 1 1 X 0 X 1
X 0 X 0 X X 1
f !7i
V.
t
*
_
_
_
_
_
.
_
•
T-
X 0 X X X 1 1
X X X 0 1 X 1
V
•
T
f\ 'i
.
.
f—
X 1 A X A U 1
••
1 X0 X X X 1
T
1 X X 0 X X 1
_..
<s
)
^
1k
_
1" "
i•
- '¿.
•
1 X X X X 1 1
1 X X X 1 X1 . ¿
*-_-
1
!*—~
*
,,
¥
—^
—,
Fig. 3.93: Tabla de Simplificación
•*
•—^r_.
^^
h
—^
•v»
141
TABLA DE SfM PI.1 FICACION
10 3
1C
99
1C 5
10 7
10 9
11 1 11
11 5 11
X 0 1 X 1 X 1
X X 1 X 1 0 1
;•
X 1 0 X 1 X 1
X 1 0 1 X X 1
1
X 1 X1 0 X1
X i 1 X0 X1
•
1
1
X 0 X 0 X X 1
f s
>
f
\>^
*
v
i
r*
*r
ir
*r
\
/ ,
\&
4
OA2 X 1 1
X XX0 1 X 1
X 1 U A A 1—
')
•
1 X 0 X X X 1
1
1
1 X X 0 X X 1
•
1 X X X X 1 1
4
-á
1 *T
X T»
X *»
X 1 «•
X1
-y
•V
Fig. 3.94: Tabla de Simplificación
DE SfMPUPCAGION
11 9 12 1 12 3 12 5
i•
X
X
X
X
X
X
X
*
0
X
1
1
1
1
0
1
1
0
0
X
1
X
X
X
X
1
1
X
0
1
1
1
X
0
0
X
X
0
X
X
X
X
X
1
1
1
1
1
1
1
'
'
1'
A A U A U 1
U
A A A
1
1
X X X 0 1 X 1
A
1
U A A
i
r
ihr
1 & A A U 1
'fl
1 X 0 X X X 1
1 X X 0 X X 1
1 X X X X 1 1
£
•
Fig. 3.95: Tabla de Simplificación
.. ..
12 7
142
TABLA DE SIMPLIFICACIÓN
1
5
7
2
3
9
11
|
1
1
21
•
|
t
1
22
15
19
17
|
T
1
23
^W
25
1
1
27
30
31
33
49
1
1
51
53
55
|
1
29
37
TABLA DE SIMPLIFICACIÓN
38
39
1
1
41
,
!
43
I
1
1
45
1
47
1
í
A i iro
•P
TABLA DE SIMPLIFICACIÓN
57
•
i
59
1
61
65
I
i
66
67
|
1
1
I
69
71
73
J
1
1
75
•
i
93
95
97
1
•
TABLA DE SIMPLIFICACIÓN
77
79
81
83
85
87
1
91
!
^E9r
TABLA DE SIMPLIFICACIÓN
99
•
1 1 X X X X 1-
101
103
A
T
T
105
107
109
i
\í\
T
i
111
113
115
117
lí.
r
í
TABLA DE SIMPLIFICACIÓN
119
1 1 X X X X 1-
121
123
T
(ti
'T
125
127
,
;
jfSr
Fig. 3.96: Tabla de Simplificación
En la figura 3.97 se presenta los implicantes primos esenciales y
secundarios
SECUNDARIOS
X00001X
001X1IX
01 0 0 1 I X
XXXOX01.Í
X1XXX01
1XXX1X1
11XXXX1
XOXXX11
OXX10X1
XX1OXX1
XOOXOX1
001XXX1¿J
XXOX11 Fig. 3.97: Tabla de Simplificación
144
CAPITULO IV
CONCLUSIONES.
4.1
-
COMENTARIOS.
El método de simplificación Quine-McCIuskey es un método tabular que se
debe tener cuidado
en el desarrollo
del mismo para no cometer
equivocaciones, lo cual provocará que la simplificación no sea mejor.
-
El programa de simplificación del presente proyecto de titulación es muy
simple de utilizar, ya que está hecho para correr bajo el sistema Windows y
prácticamente en cualquier Computador Personal, ya que fue desarrollado en
una máquina Pentium I, con 24 MB de memoria RAM.
-
Para desarrollar el programa se usó el lenguaje de programación Visual Basic
6.0, ya que teñe las herramientas necesarias para diseñar este programa.
-
Cada uno de los cubos n se almacena en una matriz que tiene el número de
filas de acuerdo al mayor número de cubos encontrados durante el desarrollo,
por ejemplo si se encontraron 80 cubos, entonces la matriz tendrá 80 filas;
mientras que el número de columnas que tiene esta matriz depende de los
cubos de mayor orden, por ejemplo, si se tiene hasta cubos 7 la matriz tendrá
7 columnas.
-
La tabla de simplificación también se construye basándose en una matriz en la
que se ubican las marcas, dependiendo de los implicantes primos(filas), y los
mintérminos de la función original (columnas).
-
Si se usa el programa hasta 5 variables de entrada se ha incluido un retardo
en cada uno de los pasos para visualizar de mejor manera, y entender el
proceso de simplificación, estos retardos se incluyen para facilitar el proceso
de aprendizaje, puesto que se trata de un proyecto de titulación didáctico.
Mientras que para un número mayor de variables no se introducen estos
145
retardos de tiempo porque, en este caso se necesita simplificar lo más rápido
posible y obtener la función simplificada sin importar el proceso.
-
El archivo que contiene la teoría del método de simplificación tabular QuineMcCIuskey se encuentra en el CD con el nombre Texto.rtT.
4.2
CONCLUSIONES.
Luego de terminar este trabajo se pueden obtener las siguientes
conclusiones:
-
Las ecuaciones con más de 6 variables de entrada no se pudieron comprobar
manualmente debido a que el método gráfico del mapa de Karnaugh ya no es
aplicable, y el tiempo que tomaría la simplificación manual de una función de
tantas variables de entrada, sería demasiado largo, y poco confiable.
-
El programa puede ser usado como un tutorial de aprendizaje usando hasta 5
variables de entrada, mientras que se puede usar profesionalmente para un
número mayor de variables de entrada.
-
Este programa encuentra la función simplificada verdadera debido a que
calcula los implicantes primos esenciales, y los implicantes primos secundarios
de menor costo.
-
El tiempo de demora de simplificación del programa es casi imperceptible
hasta una función de 3 entradas; mientras que hasta 6 entradas, el tiempo que
emplea es de únicamente unos pocos segundos; para un número alto de
variables el tiempo empleado es un poco alto, pero adecuado y aceptable,
considerando la cantidad de operaciones que se deben realizar hasta obtener
la función totalmente simplificada.
-
Debido a que todos los cubos n se almacenan en una matriz, facilita para
regresar o adelantar con facilidad, sin necesidad de volver a realizar los
146
cálculos involucrados en el proceso. Esto ayuda a revisar el proceso de
simplificación y regresar a cualquier paso del mismo.
4.3
-
RECOMENDACIONES.
Este programa se puede usar tanto como un tutorial de aprendizaje de
simplificación de funciones booleanas utilizando el método de Quine-McKIusky
como para simplificar funciones booleanas de hasta 10 variables de entrada
con propósitos profesionales.
-
Este programa se puede cambiar, para utilizarlo en la simplificación de una
función de más de 10 variables de entrada, únicamente utilizando una
computadora más veloz y con una cantidad grande de memoria RAM para
almacenar las matrices de los cubos y la tabla de simplificación.
-
Los cambios que se deben hacer son: Definir matrices de mayor orden en la
rutina de módulos, ya que este programa está desarrollado definiendo
matrices lo suficientemente grandes como para no tener problemas en la
simplificación de hasta 10 variables de entrada, además en la rutina de
escritura de la solución se debe incluir más líneas de programación que
permitan ingresar las variables adicionales.
-
El programa permite realizar la simplificación de una función mientras se
revisa la teoría de simplificación o también se revisa el tutorial de uso del
programa, permitiendo de esta manera utilizar el programa como una guía de
aprendizaje y manejo.
147
BIBLIOGRAFÍA.
-
M. MORRIS MANO, Lógica Digital y Diseño de Computadoras, Prentice
hall, 1982. México.
-
Cornell Gary, Visual Basic 6.0 Manual de Referencia, Me Graw Hill, 1999,
España.
-
Ronald J. TOCCI, Sistemas Digitales. Principios y aplicaciones, Sexta
edición, 1996. México.
-
Fredrick J. Hill/ Gerald R. Peterson, Switching Theory & Logical Design,
Tercera Edición, 1981, New York.
-
John F. Weakerly, Diseño Digital, Principios y prácticas, 1992, México
-
Maurice Bird & Roy Schmidt. Practica! Digital Electronics, Laboratory
Workbook, Hewlett- Packard, Santa Clara California, 1974.
-
Manual de circuitos integrados TTL de la Texas Instruments, Second
Edition, 1981.
-
Apuntes de Sistemas Digitales EPN.
-
http://campus.murravstate.edu/academic/facultv/bob.pilqrim/405/quine.html
-
http://logik.phl.univie.ac.at/-chris/qmo-uk.html
-
http://www.algoritm.qm.home.ro/
-
www.seattlerobotics.orq/encoder/200106/qmccmin.htm
-
www.ihs.theoinf.tu-ilmenau.de/-sane/projekte/qmc/embed_qmc.html
-
www.math.uni-muenster.de/informatik/Scripten/
Praktischelnformatiklll/html/node38.html
-
www.rpi.edu/dept/ecse/coco/SOO/W03/Q-Mmethod.ppt
-
www.ece.odu.eduMeathrum/ECE241_284/support/quine.html
-
http://pehuen.chiilan.ubiobio.cl/-lqaiardo/odc/aigebra/
148
ANEXO A.
LISTADO DEL CÓDIGO DEL PROGRAMA.
MODULO 1
Public ColorInicialBotones As ButtonConstants
Public ColorEnfoque As ButtonConstants
Public e As Integer
Public f(0 To 1023) As String
Public FigNum As Integer
Public n As Integer
Public num_tema As Integer
'indica el numero de frame que se va a mostrar es
utilizada en la forma Indice_tutorial
Public m As Integer
Public pagina As Integer
Public paginal As Integer
Public paginaO As Integer
Public r(0 To 1023) As Integer
Public Tutor 'contiene el valor que indica el tema del tutorial
Function valida_Numero(k)
Select Case k
CaseS, 13, 32,46,48 To 57
valida_Numero = k
Case Else
valida_Numero = O
End Select
End Function
FORM1.
Prívate Type Registro
combinación As String * 20
respuesta As Stríng * 1
End Type
Prívate dato As Registro
Prívate Grupo(2047,16) As Integer
Prívate s(2047) As String
Prívate c(2047, 16) As String * 20
Prívate O(2047,16) As String
Prívate contv(2047) As Integer
Prívate conth(2047) As Integer
Prívate fíl(16) As Integer
Prívate Marca(2047, 16) As String
Prívate Tabla(2047, 2047) As String
Prívate fílaAnulada(2047) As Boolean
Prívate columnaAnulada(2047) As Boolean
Prívate numeroFüa(2047) As Integer
Prívate fila As Integer
Prívate col As Integer
149
Prívate MaxColCubos As Integer
Prívate max As Integer
Prívate MaxCol As Integer
Prívate Auxl As Integer
Prívate Aux2 As Integer
Prívate ultima As Boolean
Prívate Implicantes As Boolean
Prívate Tablalmplicantes As Boolean
Prívate marcas As Boolean
Prívate lineas As Boolean
Prívate Resultado As Boolean
Prívate escenciales As Boolean
Prívate ancho
Prívate alto
Prívate valizcom
Prívate PaginaHorizontal
Prívate PaginaVertícal
Prívate NumeroGrupo
Prívate espacio
Prívate ColorLinea
Prívate Tiempo
Const ColumnasDeTabla =17
Sub simplifiqueQ 'Esta función simplifica la función directamente y da la respuesta
Commandl.Enabled = False 'Para desabilitar el comando de siguiente
Simplificar.Enabled = False 'Para desabilitar el menú de simplificar
Commandl4,Enabled = False 'Para desabilitar el comando de terminara
Simppaso.Enabled = False Tara desabilitar el menú de simplificar el siguiente paso
Command2.Enabled - False 'Para desabilitar el botón de paso anterior
Simplificaranterior = False 'Para desabilitar el Menú de paso anterior
Command3,Enabled = False 'Para desabilitar el botón de Salir
Menu.Enabled = False Tara desabilitar el Menú
Text4,Locked = Truc 'Bloque el Editor de minterminos
MousePointer = vbHourglass 'Cambia la forma del cursor del mouse a un reloj
Titulo(2).Visible = False 'Esconde el titulo
Mensaje.Top = Text4.Top + Text4.Height + 500 'Posición vartical del mensaje
Mensaje.Visible = True 'Hace visible el mensaje
raya = " " 'borra la variable raya
For i = 1 To n 'Ubica tantas lineas como se necesiten
raya = raya & "--"
Next i
DoEvents 'Actualiza los eventos ejecutados
If lineas = True And Resultado = False Then 'Esta sección Genera la solución
Titulo(O). Visible = False
Titulo(l). Visible = False
Mensaje.Caption = "¡Generando la solución!"
Mensaje.Left = (Forml.Width - Mensaje.Width) / 2
Command 10. Visible = False
Commandl 1.Visible = False
Commandl2.Visible = False
Commandl3.Visible = False
150
Picturel. Visible = False
List2(0). Visible = False
List2(l). Visible = False
Texto = "Y = "
F o r i = l Tofil(col+l)
Ifn<5Then
Timer 1 = Timer
Do
DoEvents
Loop While Timer - Timer 1 <= Tiempo
Else
DoEvents
Endlf
For j = 1 To Len(c(i, col + 1))
If Mid(c(i, col + 1), j, 1) = "O" Then
If j = 2 Then Texto = Texto & "A1"
If j = 4 Then Texto = Texto & "B'M
If j = 6 Then Texto = Texto & "C"
If j = 8 Then Texto = Texto & "D"1
If j = 10 Then Texto = Texto & "E1"
If j = 12 Then Texto = Texto & "F"
If j = 14 Then Texto = Texto & "Gm
If j = 16 Then Texto = Texto & "H"'
If j - 18 Then Texto = Texto & "I"'
If j = 20 Then Texto = Texto & "J"'
Endlf
If Mid(c(i, col + 1), j, 1) = "1" Then
If j = 2 Then Texto = Texto & "A11
If j = 4 Then Texto = Texto & "B"
If j = 6 Then Texto = Texto & "C"
If j = 8 Then Texto = Texto & "D"
If j = 10 Then Texto = Texto & "E"
If j = 12 Then Texto = Texto & "F"
If j = 14 Then Texto = Texto & "G"
If j = 16 Then Texto - Text6 & "H"
If j = 18 Then Texto = Texto & T'
If j = 20 Then Text6 = Texto & "J"
Endlf
Nextj
If i o fil(col + 1) And Mid(c(i, col + 1), j, 1) o "X" Then Texto = Text6 + " +
If Len(Text6) < 50 Then
Texto,Width - 130 * Len(Text6.Caption) + 130 / Len(Textó.Caption) + 200
Text6.Height *= 500
Else
Text6.Height = 4*330
Textó.Width = 130 * 50 + 130 / 50 + 200
Endlf
Textó.Left = ((Forml .Width / 2) - (Textó.Width / 2)) + 200
Textó.Top = (Forml.Height / 2) - Textó.Height
151
Textó.Visible = True
DoEvents
Next i
If fil(col + 2) > O Then Texto = Texto & " + "
For i - 1 Tofil(col+ 2)
If n < 5 Then
Timerl = Timer
Do
DoEvents
Loop While Timer - Timerl <= Tiempo
Else
DoEvents
Endlf
For j = 1 To Len(c(i, col + 2))
If Mid(c(i, col + 2), j, 1) = "O" Then
If j = 2 Then Texto = Texto & "A"'
If j = 4 Then Texto = Texto & "B"1
If j = 6 Then Texto = Texto & "C1"
If j = 8 Then Texto = Texto & "D"'
If j - 10 Then Texto = Texto & "E"'
If j = 12 Then Texto = Texto & "F"'
If j = 14 Then Texto - Texto & "G"'
If j = 16 Then Texto = Texto & "H"'
If j - 18 Then Texto = Texto & "I"1
If j = 20 Then Texto = Texto & "J"1
Endlf
If Mid(c(i, col + 2), j, 1) - "1" Then
If j - 2 Then Texto = Texto & "A"
If j - 4 Then Texto = Texto & "B"
If j = 6 Then Texto = Texto & "C"
If j = 8 Then Texto - Texto & "D"
If j - 10 Then Texto = Texto & "E"
If j = 12 Then Texto - Texto & "F"
If j = 14 Then Texto = Texto & "G"
If j = 16 Then Texto - Texto & "H"
If j - 18 Then Texto = Texto & "I"
If j = 20 Then Texto = Texto & "J"
Endlf
Nextj
If i o fil(col + 2) And Mid(c(i, col + 2), j, 1) o "X" Then Texto = Texto + " +
IfLen(Text6)<50Then
Texto.Width = 130 * Len(Textó.Caption) + 130 / Len(Textó.Caption) + 200
Textó.Height = 500
Else
Textó.Height - 4 * 330
Texto.Width = 130 * 50 + 130 / 50 + 200
Endlf
Textó.Left = ((Forml .Width / 2) - (Textó.Width / 2)) + 200
Textó.Top = (Forml .Height / 2) - Textó.Height
170
Texto.Width = 130 * Len(Text6.Caption) + 130 / Len(Text6.Caption) + 200
Textó.Height = 500
Else
Textó.Height = 4 * 330
Texto.Width = 130 * 50 + 130 / 50 + 200
Endlf
Textó.Left = ((Forml.Width / 2) - (Texto.Width / 2)) + 200
Textó.Top = (Forml.Height / 2) - Textó.Height
Texto. Visible = Truc
DoEvents
Next i
If fil(col + 2) > O Then Texto = Texto & " + "
For i = 1 To fíl(col + 2)
If n < 5 Then
Timer 1 = Timer
Do
DoEvents
Loop While Timer - Timerl <= Tiempo
Else
DoEvents
Endlf
For j = 1 To Len(c(i, col + 2))
If Mid(c(i, col + 2), j, 1) = "O" Then
If j = 2 Then Texto = Texto & "A"1
If j = 4 Then Texto = Texto & "B"'
If j = 6 Then Texto = Texto & "C"
If j = 8 Then Texto - Texto & "D1"
If j = 10 Then Texto = Texto & "E"1
If j = 12 Then Texto = Texto & "F"
If j = 14 Then Texto = Texto & "G"1
If j = 16 Then Texto = Texto & "H1"
If j = 18 Then Texto = Texto & "I"'
If j = 20 Then Texto = Texto & "J"1
Endlf
If Mid(c(i, col + 2), j, 1) = "1" Then
If j = 2 Then Texto = Texto & "A"
If j = 4 Then Texto = Texto & "B"
If j = 6 Then Texto = Texto & "C"
If j = 8 Then Texto = Texto & "D"
If j = 10 Then Texto = Texto & "E"
If j = 12 Then Texto - Texto & "F"
If j = 14 Then Texto = Texto & "G"
If j - 16 Then Texto - Texto & "H"
If j = 18 Then Texto = Texto & "I"
If j = 20 Then Texto = Texto & "J"
Endlf
Nextj
If i o fil(col + 2) And Mid(c(i, col + 2), j, 1) o "X" Then Texto - Texto + " +
IfLen(Textó)<50Then
171
Texto.Width = 130 * Len(Textó.Caption) + 130 / Len(Text6.Caption) + 200
Textó.Height = 500
Else
Text6.Height = 4 * 330
Texto.Width = 130 * 50 + 130 / 50 + 200
Endlf
Textó.Left = ((Forml.Width / 2) - (Texto.Width / 2)) + 200
Textó.Top = (Forml.Height / 2) - Textó.Height
Textó.Visible = True
DoEvents
Next i
Resultado = True
Endlf
If escenciales = True And lineas = False Then
Mensaje.Caption = "¡BUSCANDO IMPLICANTES PRIMOS SECUNDARIOS!"
Mensaje.Left = (Forml.Width - Mensaje.Width) / 2
fila-O
Do
marcasmax = O
For i = 1 To fil(col)
conth(i) = O
Forj = lTofil(0)
If Tabla(i, j) = "*" And fíIaAnulada(i) = False And columnaAnulada(j) =
False Then
conth(i) = conth(i) + 1
If marcasmax < conth(i) Then marcasmax = conth(i)
Endlf
Nextj
Next i
For j = 1 To fil(col)
If conth(j) = marcasmax And filaAnulada(j) = False And marcasmax > O Then
sihay = False
For i2 = 1 To fil(O)
If Tabla(j, i2) = "*" And columnaAnulada(i2) = False Then
co1umnaAnulada(i2) = True
numeroFila(i2) = j
mostrarmarcas
Ifn<5Then
Timerl = Tímer
Do
DoEvents
Loop Whíle Timer - Timerl <= Tiempo
Else
DoEvents
Endlf
sihay = True
Endlf
Next ¡2
If sihay = True Then
172
fílaAnulada(j) - Truc
fila = fila + 1
c(fila, col + 2) = cG, col)
mostrarmarcas
fd(col + 2) = fila
mostrarsecundarios
If n < 5 Then
Timerl = Timer
Do
DoEvents
Loop While Timer - Timerl <= Tiempo
Else
DoEvents
Endlf
Endlf
Endlf
Next j
Loop Until marcasmax = O
fíl(col + 2) = fila
If MaxCol < col + 2 Then MaxCol = coi + 2
If max < fil(col + 2) Then max = fil(col + 2)
lineas = Truc
If fila = O Then Commandl_CIick
fila = fil(col-l)
Mensaje.Visible = False
Mensaje.Caption =""
Endlf
If marcas = Truc And escenciales = False Then
Mensaje.Caption- "¡BUSCANDO IMPLICANTES PRIMOS ESENCIALES!"
Mensaje.Left = (Forml.Width - Mensaje.Width) / 2
Mensaje.Visible = True
DoEvents
contvmax = O
For i - 1 To fil(O)
contv(i) = O
For j = 1 To fil(col)
If TablaQ, i) = "*" Then contv(i) = contv(i) + 1
Nextj
If contvmax < contv(i) Then contvmax - contv(i)
Next i
fila = O
ColorLinea = RGB(0, 255, 0)
For i = 1 To fíl(O)
If contv(i) = 1 And columnaAnulada(i) = False Then
columnaAnulada(i) = True
mostrarmarcas
Ifn<5Then
Timerl = Timer
Do
173
DoEvents
Loop While Timer - Timerl <— Tiempo
Else
DoEvents
Endlf
Forj = lTofd(col)
If TablaG, i) = "*" And filaAnuladaO) = False Then
fílaAnulada(j) = True
numeroFila(i) = j
mostrarmarcas
fila-fila+1
c(fila, col + 1) = c(j, col)
fil(col + l) = fila
mostraresenciales
Ifn<5Then
Timerl = Timer
Do
DoEvents
Loop While Timer - Timerl <= Tiempo
Else
DoEvents
Endlf
For i2 = 1 To fil(O)
If Tabla(j, i2) = "*" And columnaAnulada(i2) = False Then
colurnnaAnulada(i2) = True
numeroFila(i2) = j
mostrarmarcas
Ifn<5Then
Timerl = Timer
Do
DoEvents
Loop While Timer - Timerl <= Tiempo
Else
DoEvents
Endlf
Endlf
Next i2
EndTf
Nextj
Endlf
Next i
fíl(col+l) = fila
fila = fil(col-l)
If MaxCol < col + 1 Then MaxCol = col + 1
If max < fil(col + 1) Then max = fíl(col +1)
escenciales = True
Endlf
If Implicantes = True And Tablalmplicantes = False Then Tara construir la tabla de
simplificación
174
Mensaje.Caption = "¡Construyendo la tabla de simplificación!"
Mensaje.Left = (Forml.Width - Mensaje.Width) / 2
DoEvents
If Aux2 o col Then
For i = 1 To fil(O)
s(i) = O(i, 0)
Next i
For i - 1 Tofil(O)- 1
Forj = i + l T o f i l ( 0 )
If Val(s(i)) > Val(sG)) Then
aux = s(i)
s(j) = aux
Endlf
Nextj
Next i
For i = 1 To fíl(col)
pl =0
For pos - 1 To Len(O(i, col))
If Mid(O(i, col), pos, 1) = " " Or Mid(O(i, col), pos, 1) = ",M Then
pl=p2
p2 = pos
I f p 2 - p l > l Then
subindice = Mid(O(i, col), pl, p2 - pl)
For j = 1 To fil(O)
If Val(subindice) = Val(s(j)) Then Tabla(iJ) - "*"
Nextj
Endlf
Endlf
If pos = Len(O(i, col)) Then
pl=P2
p2 = pos
Ifp2-pl>OThen
subindice = Mid(O(i, col), pl, p2 - pl + 1)
Forj = lTofil(0)
If Val(subindice) = Val(sQ)) Then Tabla(i, j) = "*"
Nextj
Endlf
Endlf
Next pos
DoEvents
Next i
Aux2 = col
Endlf
Titulo(O). Visible = False
Listl(O).Visible-False
Titulo(l).Visible = False
Listl(l). Visible = False
Commandó.Enabled = False
Commandó. Visible = False
175
Command7.Enabled = False
CommandT.Visible = False
CommandS.Enabled = False
CommandS. Visible = False
Command9.Enabled = False
Command9.Visible = False
Label3(0).Visible = False
Label3(l). Visible = False
DoEvents
PaginaHorizontal = O
PaginaVertical = O
mostrarTabla
Tablalmplicantes = True
marcas = True
Endlf
If col >= 1 And ultima = False Then Tara construir la tabla de Cubos r
Mensaje.Caption = "¡Calculando los cubos " & Str(col) & "!"
Mensaje.Left = (Forml.Width - Mensaje.Width) / 2
DoEvents
auxiliar = fil(col + 1)
If MaxColCubos < col Then
fila-O
NumeroGrupo = 1
sihay = False
For i = 1 To fil(col) - 1
IfO(i,col)o"-"Then
ray = O
F o r j - i + 1 Tofil(col)
If Grupo(j, col) = Grupo(i, col) + 1 And O(j, col) o "-" Then
cont = O
For pos = 1 To 2 * n 'busca en cuales bits esta diferente
If Mid(c(i, col), pos, 1) o Mid(c(j, col), pos, 1) Then
cont = cont + 1 'cuenta el numero de cambios
spos = j 'rescata la combinación con la que hay el cambio
cpos = pos 'rescata la posición del bit que cambia
Endlf
DoEvents
Next pos
If cont - 1 Then
fila = fila+1
c(fíla, col + 1) = c(i, col) 'crea la nueva columna con los cubos ceros
Marca(i, col) = "*"
MarcaOí col) = "*"
Mid(c(fila, col + 1), cpos) = "X" 'inserta una X en el bit que cambia
cont2 = O
Fork=lTofila-l
If c(fila, col + 1) = c(k, col + 1) Then cont2 - cont2 + 1
Nextk
If cont2 = O Then
176
O(fíla, col + 1) = O(i, col) & "," & O(spos, col) 'Almacena las
combinaciones que cambiaron
Gmpo(fila, col + 1) = NumeroGrupo
sihay = Truc
Else
fila = fila - 1
Endlf
Endlf
Endlf
IfO(j, col) = "-" Then
ray = ray + 1
Endlf
If ray = 2 Then
Exit For
End If
Nextj
Else
If sihay = Truc Then
fila = fila + 1
c(fila, col + 1) = raya
O(fila, col+ !) = "-"
Marca(i, col) ="-"
Marca(fila, col + 1) = "-"
Grupo(fila, col + 1) = NumeroGrupo
NumeroGrupo = NumeroGrupo + 1
Endlf
Endlf
Next i
If fila > O Then fila = fila - 1
fil(col + 1) = fila
Endlf
If MaxColCubos < col Then MaxColCubos = col
If MaxCol < col + 1 Then MaxCol = col + 1
If max < fil(col + 1) Then max = fil(col + 1)
col = col + 1
If (fila = 0) Or (col = Auxl) Then
ultima = True
fíl(col) = auxiliar
Else
Commandó.Enabled = False
Commandó.Visible = False
Command7.Enabled - False
Command7.Visible - False
CommandS.Enabled = False
CommandS.Visible = False
Command9.Enabled = False
Command9.Visible = False
Label3(0). Visible = False
Label3(l).Visible - False
177
Titulo(0).Caption = "CUBOS " & col - 2
Listl(0).ToolTipText = "Tabla de cubos " & Str(col - 2)
mostrarlistlO
Listl(l).ToolTipText = "Tabla de cubos " & Str(col - 1)
Titulo(l).Caption = "CUBOS " & col - 1
mostrarlistl 1
DoEvents
Endlf
Endlf
If ultima = True And Implicantes = False Then Tara hallar los implicantes primos
Mensaje.Caption = "¡Calculando los implicantes primos!"
Mensaje.Leñ - (Forml .Width - Mensaje.Width) / 2
DoEvents
If Auxl o col Then
Auxl =col
fila = O
Forj = 1 To col -1
Fori=lTofíl(j)
If Marca(i, j) o "*" And O(is j) o "-" Then
fila = fila + 1
0(fila,col) = 0(i,j)
c(fila,col) = c(i,j)
Marca(fila, col) - ""
Endlf
DoEvents
Next i
Nextj
fil(col) = fila
Endlf
Commandó.Enabled = False
Commandó.Visible = False
CommandT.Enabled = False
Command7.Visible = False
CommandS.Enabled = False
CommandS. Visible = False
Command9.Enabled = False
Comrnand9.Visible = False
Label3(0). Visible = False
Label3(l). Visible = False
Titulo(0).Caption = Titulo(l).Caption
Titulo(0).ToolTipText = "Tabla de cubos " & Str(col - 2)
mostrarlistlO
Titulo(l).Captíon= "IMPLICANTES PRIMOS"
Listl(l).ToolTipText = "Tabla de Implicantes primos "
mostrarlistll
If MaxCol < col + 1 Then MaxCol = col + 1
If max < fíl(col) Then max = fil(col)
178
Implicantes = True
Endlf
If col = O Then 'Para Construir la tabla de los cubos O
Command4.Enabled = False
Command4. Visible = False
CommandS.Enabled = False
Command5. Visible = False
CommandS.Enabled = False
Mensaje.Caption = "¡Calculando los cubos O!"
Mensaje.Leñ = (Forml.Width - Mensaje.Width) / 2
DoEvents
For i = O To Text2.UBound
Text3(i).Visible = False
Text2(i).Visible = False
Next í
DoEvents
col = col + 1
IfMaxCol = OThen
fila = O
For i = O To 2 A n - 1
Ifr(i)=lThen
fila = fila+1
c(fila, 0) = f(i)
O(fila, 0) - i
Endlf
Next i
fil(O) = fila
fila = O
Forj = OTon
sihay = False
For i = O To 2 A n - 1
Ifr(i)=lThen
cont = O
For pos = 1 To 2 * n
Bit = Val(Mid(f(i), pos, 1))
If Bit = 1 Then cont = cont + 1
Next pos
If cont = j Then
fila = fila + 1
c(fila, col) = f(i)
O(fíla, col) = Str(i)
Grupo(fila, col) = j
sihay = True
Endlf
Endlf
Next i
If sihay = True Then
fila = fila + 1
c(fila, col) = raya
179
O(fíla, col) ="-"
Grupo(fíla, col) = j
Endlf
Nextj
fíl(col) = fila
Endlf
Label3(0). Visible - False
Label3(l). Visible = False
Titulo(0).Caption = "MTNTERMINOS"
Titulo(0).ToolTipText = "Tabla de MINTERMINOS"
mostrarlistlO
Titulo(l).Captíon = "CUBOS O"
TituLo(l).ToolTipText = "Tabla de cubos O"
mostrarlistll
If MaxCol < col Then MaxCol = col
If max < fíl(col) Then max = fíl(col)
Endlf
If Resultado = False Then
Commandl .Enabled = True
Simplificar.Enabled = True
CommandH.Enabled = True
Simppaso.Enabled = True
Endlf
Command2.Enabled = True
Simplificaranterior = True
Command3.Enabled = True
Menu.Enabled = True
Text4.Locked = False
Mensaje.Caption = ""
Mensaje. Visible = False
MousePointer = vbDefault
End Sub
Prívate Sub Commandl_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
Commandl.BackColor = ColorEnfoque
Command2.BackColor = ColorlnicialBotones
CommandS.BackColor = ColorlnicialBotones
Commandl 4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Commandl0_Click()
PaginaVertical = PaginaVertical + 1
mostrarTabla
mostrarmarcas
If fil(col + 1) > O Then mostraresenciales
If fil(col + 2) > O Then mostrarsecundarios
End Sub
180
Prívate Sub Commandl l_Click()
PaginaVertical = PaginaVertical - 1
mostrarTabla
mostrarmarcas
If fil(col + 1) > O Then mostraresenciales
If fil(col + 2) > O Then mostrarsecundarios
End Sub
Prívate Sub Commandl2_Click()
PaginaHorizontal = PaginaHorízontal + 1
mostrarTabla
mostrarmarcas
If fíl(col + 1) > O Then mostraresenciales
If fíl(col + 2) > O Then mostrarsecundarios
End Sub
Prívate Sub Commandl3_Click()
PaginaHorizontal = PaginaHorizontal - 1
mostrarTabla
mostrarmarcas
If fíl(col + 1) > O Then mostraresenciales
If fil(col + 2) > O Then mostrarsecundarios
End Sub
Prívate Sub Commandl4_Click()
Tiempo = O
Do
Cali simplifique
Loop Until Resultado = True
Tiempo = 1
End Sub
Prívate Sub Commandl4_MouseMove(Button As Integer, Shiñ As Integer, X As
Single, Y As Single)
Commandl 4.BackColor = ColorEnfoque
Commandl.BackColor = ColorInicialBotones
Command2.BackColor = ColorInicialBotones
CommandS.BackColor = ColorInicialBotones
End Sub
Prívate Sub Command2_Click()
If col > O Then
Commandl.Enabled = False
Simplificar.Enabled = False
Commandl 4.Enabled = False
Simppaso.Enabled = False
Command2. Enabled = False
Simplificaranterior = False
Command3. Enabled = Fiase
Menu.Enabled = False
Text4.Locked = True
181
Commandó.Enabled = False
Commandó, Visible = False
CommandT.Enabled = False
Command? .Visible = False
CommandS.Enabled = False
CommandS. Visible == False
Command9.Enabled = False
Command9.Visible = False
Label3(0).Visible = False
Label3(l).Visible - False
If Resultado = True Then
Texto = ""
Textó.Visible = False
Titulo(0).Visible = True
mostrarTabla
mostrarmarcas
mostraresenciales
If fil(col + 2) > O Then mostrarsecundarios
Simppaso.Enabled = True
Simplifícar.Enabled = True
Commandl4.Enabled = True
Resultado = False
El se
If lineas = True Or escenciales = True Then
Picturel. Visible = True
Titulo(2). Visible = False
List2(l). Visible = False
Titulo(l).Visible = False
List2(0).Visible = False
Textó.Visible = False
For i = 1 To UBound(numeroFila)
numeroFila(i) = O
Nexti
For i = 1 To UBound(fllaAnulada)
filaAnulada(i) = False
Nexti
For i = 1 To UBound(columnaAnulada)
columnaAnulada(i) = False
Nexti
mostrarTabla
fil(col + 2) = O
escenciales = False
fil(col + l) = 0
lineas = False
Else
If marcas = True Then
marcas = False
Command2_Click
Else
If Tablalmplicantes = True Then
182
Picturel. Visible = False
CommandlO. Visible = False
Commandl 1.Visible = False
Commandl2.Visible = False
Commandl 3. Visible = False
Titulo(0).Visible = False
Titulo(l).Caption= "IMPLICANTES PRIMOS"
DoEvents
Listl(l).ToolTipText = "Tabla de implicantes primos"
Listl(0).ToolTipText = "Tabla de cubos " & Str(col - 2)
Listl(0).Left = 3000
mostrarlistl 1
Titulo(0).Caption - "CUBOS " & col - 2
mostrarlistl O
Tablalmplicantes = False
Else
If ultima = True Then
col = col -1
Titulo(l).Caption = Titulo(0).Caption
Listl(l).ToolTipText = Listl(0).ToolTipText
Listl(0).ToolTipText - Listl(0).ToolTipText
mostrarlistl 1
Titulo(0).Caption = "CUBOS " & col - 2
mostrarlistl O
Implicantes = False
ultima = False
Else
col = col - 1
Ifcol> 1 Then
Titulo(l).Caption = Titulo(0).Caption
Listl(l).ToolTipText = Listl(0).ToolTipText
Listl(0).ToolTipText = "Tabla de cubos " & Str(col - 2)
mostrarlistll
Titulo(0).Caption = "CUBOS " & col - 2
mostrarlistl O
Else
If col= 1 Then
Listl(l).Visible = False
CommandS.Visible = False
Command9.Visible = False
Titulo(l).Caption = "CUBOS O"
Listl(l).ToolTipText = "Tabla de CUBOS O"
mostrarlistl 1
Titulo(0).Caption = "MINTERMINOS"
Listl(0).ToolTipText = "Tabla de MINTERMINOS"
mostrarlistl O
Else
Titulo(0).Visible = False
List 1(0). Visible = False
183
Titulo(l),Visible = False
Listl(l).Visible = False
Commandó.Visible = False
Command7.Visible = False
DoEvents
If2 A n<=64Then
For i = O To 2 A n -1
Text3 (i). Visible = True
Text2(i).Visible = True
DoEvents
Next i
Else
For i - O To Text3.UBound
Text3 (i). Visible = True
Text2(i).Visible = True
DoEvents
Next i
If pagina > O Then
Command4.Enabled = True
Command4.Visible - True
Endlf
If pagina < (2 A n) / 64 - 1 Then
CommandS.Enabled = True
CommandS.Visible = True
Endlf
Endlf
Endlf
Endlf
ultima = False
Endlf
Endlf
Endlf
Endlf
Endlf
Commandl.Enabled = True
Simplificar.Enabled = True
CommandH.Enabled = True
Simppaso.Enabled = True
If col > 0 Then
Command2.Enabled = True
Simplificaranterior = True
Endlf
CommandS.Enabled = True
Menu.Enabled - True
Text4.Locked = False
Endlf
End Sub
Private Sub Command2_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
184
Commandl .BackColor = ColorlnicialBotones
Command2.BackColor = ColorEnfoque
Command3.BackColor = ColorlnicialBotones
Commandl 4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Command3_Click()
Unload Me
End Sub
Prívate Sub Command3_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
Commandl.BackColor = ColorlnicialBotones
Command2. BackColor = ColorlnicialBotones
Command3.BackColor = ColorEnfoque
Commandl 4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Command4_Click()
Command5.Left = Text2(63).Left + Text2(63).Width - CommandS.Width
Command5.Top — Command4.Top
CommandS.Enabled = True
CommandS. Visible = True
pagina = pagina - 1
For i = O To 63
Text3(i).Text = f(i + pagina * 64)
Text2(i).ToolTipText - "f(" & i + pagina * 64 & ")"
If r(i + pagina * 64) = O Or r(i + pagina * 64) = 1 Then
Text2(i).Text = r(i + pagina * 64)
Else
Text2(i).Text=""
Endlf
Nexti
If pagina = O Then
Command4.Enabled = False
Command4. Visible = False
Endlf
End Sub
Prívate Sub Conunand5_Click()
Command4.Left = Text3(15).Left
Command4.Top = CommandS.Top
Command4.Enabled = True
Command4. Visible = True
pagina = pagina + 1
For i = O To 63
Text3(i).Text = f(i + pagina * 64)
Text2(i).ToolTipText = nf(" & i + pagina * 64 & ")"
If r(i + pagina * 64) = O Or r(i + pagina * 64) = 1 Then
Text2(i).Text = r(i + pagina * 64)
185
Else
Text2(i).Text=n"
Endlf
Nexti
Text2(0).SetFocus
If 2 A n - 1 = 63 + pagina * 64 Then
CommandS.Enabled = False
CommandS. Visible = False
Endlf
End Sub
Prívate Sub Command6_Click()
paginaO = paginaO -1
Commandó.Left = CommandT.Left
Commandó.Top = Listl(0).Top
Command6.Enabled = False
Command6.Visible = False
Command7.Enabled = True
CommandT.Visible = True
Listl(0).Clear
If col = 1 Then
For i = paginaO * 16 + 1 To fil(O)
If i <= paginaO * 16 + 16 Then
IfVal(O(i,0))<=9Then
Listl(0).AddItem (" " & O(i, 0) + "
" & c(i, 0))
Else
IfVal(O(i,0))<=99Then
Listl(0).AddItem (" " & O(i, 0) + " " & c(i, 0))
Else
Listl(0).AddItem ( IIM & O(i, 0) + " " & c(i, 0))
Endlf
Endlf
Endlf
If paginaO > O Then
Commandó.Left = Commandó.Left
Commandó.Top = Listl(0),Top
Commandó.Enabled = True
Commandó. Visible = True
Endlf
DoEvents
Nexti
Else
For i = paginaO * 16 + 1 To paginaO * 16+16
If i <= paginaO * 16 + 16 Then
If Marca(i, col - 1) = "*" Then
Listl(0).AddItem (Marca(i, col - 1) & " " & c(i, col - 1))
Else
Listl(0).AddItem (" " & c(i, col - 1))
Endlf
Endlf
186
If paginaO > O Then
Commandó.Left = Commandó.Left
Commandó.Top = Listl(0).Top
Commandó.Enabled = Truc
Commandó.Visible = True
Endlf
DoEvents
Nexti
Endlf
End Sub
Prívate Sub Command7_Click()
paginaO = paginaO + 1
Commandó.Left = Command7.Left
Commandó.Top = Listl(0).Top
Commandó.Enabled = True
Commandó.Visible = True
Command7.Enabled = False
Command7.Visibie = False
Listl(0).Clear
If col = 1 Then
For i = paginaO * 16 + 1 To fil(O)
If i <= paginaO * 16 + 16 Then
IfVal(O(i,0))<=9Then
Listl(0).AddItem (" " & O(i, 0) + "
(t & c(i, 0))
Else
IfVal(O(i,0))<=99Then
Listl(0).AddItem (" n & O(i, 0) + "
" & c(i, 0))
Else
Listl(0).AddItem ("" & O(i, 0) + " " & c(i, 0))
Endlf
Endlf
Else
Command7.Left = Listl(0).Left + Listl(0).Width
Command7.Top = Listl(0).Top + Listl(0).Height - Command7.Height
Command7.Enabled = True
Command7.Visible = True
Endlf
DoEvents
Nexti
Else
For i = paginaO * 16 + 1 To fil(col - 1)
If i <= paginaO * 16 + 16 Then
If Marca(i, col - 1) = "*" Then
Listl(0).AddItem (Marca(i, col - ! ) & " " & c(i, col - 1))
Else
Listl(0).AddItem (" " & c(i, col - 1))
Endlf
Else
Command7.Left = Listl(0).Left + Listl(0).Width
Command7.Top = Listl(0).Top + Listl(0).Height - Command7.Height
187
CommandT.Enabled = True
CommandT.Visible = True
Endlf
DoEvents
Next i
Endlf
End Sub
Prívate Sub Cornmand8_Click()
pagina 1 = pagina 1 - 1
CommandS.Left = CommandS.Left
CommandS.Top = Listl(l).Top
CommandS.Enabled = False
CommandS.Visible = False
Command9.Enabled - True
Command9.Visible = True
Listl(l).Clear
For i = paginal * 16 + 1 To fil(col)
If i <= paginal * 16 + 16 Then
Listl(l).AddItem (c(i, col))
Endlf
If paginal > O Then
CommandS.Left = CommandS.Left
CommandS.Top = Listl(l).Top
CommandS.Enabled = True
CommandS.Visible = True
Endlf
DoEvents
Next i
End Sub
Prívate Sub Command9_Click()
paginal = paginal + 1
CommandS.Left = Command9.Left
CommandS.Top = Listl(l).Top
CommandS.Enabled = True
CommandS.Visible = True
Command9.Enabled = False
Command9.Visible = False
Listl(l).Clear
For i = paginal * 16 + 1 To fil(col)
If i <= paginal * 16 + 16 Then
Listl(l).AddItem (c(i, col))
Else
Command9.Left - Listl(l).Left + Listl(l).Width
Command9.Top = Listl(l).Top + Listl(l).Height - Command9.Height
Command9.Enabled = True
Command9. Visible - True
Endlf
DoEvents
Next i
End Sub
188
Prívate Sub CuatroEntradas_Click()
n=4
Forml.Caption = "Simplificación"
Cali Empezar
End Sub
Prívate Sub DiezEntradas_Click()
n=10
Forml.Caption = "Simplificación"
Cali Empezar
End Sub
Prívate Sub DosEntradas_Click()
n =2
Forml.Caption = "Simplificación"
Cali Empezar
End Sub
Prívate Sub FormJLoad()
Tiempo = 1
Commandl.BackColor = ColorInicialBotones
CommandH.BackColor = ColorInicialBotones
Command2.BackColor = ColorInicialBotones
Command3.BackColor = ColorInicialBotones
End Sub
Prívate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As
Single)
Commandl.BackColor - ColorlmcialBotones
Command2.BackCoior = ColorInicialBotones
CommandH.BackColor = ColorInicialBotones
Command3.BackColor = ColorInicialBotones
End Sub
Prívate Sub Guardar_Click()
FormS.Drível.Dríve = Mid(App.Path, 1, 3)
Form2.Dirl .Path = App.Path
Form2.Textl.Text=""
Form2.Show
End Sub
Prívate Sub IngresarMinterminos_Click()
Limpiar
Forml.Caption = "Simplificación"
Label2.Visible = Truc
Text4. Visible = True
Labell. Visible = True
Textl.Text= Ilfl
Textl.Visible = True
Text4.Text = "("
189
Text4.SetFocus
Text4.SelStart = Len(Text4.Text)
m=0
End Sub
Prívate Sub Listl_CIick(Index As Integer)
If Index = O And col > 1 Then Listl(Index).ToolTipText = "(" & O(paginaO * 16 +
Listl(0).ListIndex + 1, col - 1) & ")"
If Index = O And col = 1 Then Listl(Index).ToolTipText = "(" & O(paginaO * 16 +
Listl(0).ListIndex + 1, 0) & ")"
If índex = 1 Then Listl(Index).ToolTipText = "(" & O(paginal * 16 +
Listl(l).ListIndex + 1, col) & ")"
DoEvents
End Sub
Prívate Sub List2_Click(Index As Integer)
Label3(Index).Left = List2(Index).Left
Label3(Index).Top = List2(Index).Top + List2(Index).Height
Label3(Index).Caption = O(List2(Index).ListIndex + 1, col + índex + 1)
Label3(Index).Visible = True
End Sub
Prívate Sub Menu_Click()
Command3_Click
End Sub
Prívate Sub NueveEntradas_ClickQ
n=9
Forml.Caption = "Simplificación"
Cali Empezar
End Sub
Prívate Sub OchoEntradas_Click()
n =8
Forml.Caption = "Simplificación"
Cali Empezar
End Sub
Prívate Sub SeisEntradas_Click()
n=6
Forml.Caption= "Simplificación"
Cali Empezar
End Sub
Prívate Sub SieteEntradas_Click()
n=7
Forml.Caption = "Simplificación"
Cali Empezar
End Sub
Prívate Sub Simplificar_Click()
Do
Commandl Click
190
Loop Until Resultado = True
End Sub
Prívate Sub Simplificaranterior_Click()
Cali Command2_Click
End Sub
Prívate Sub Simppaso_Click()
Cali Commandl_Click
End Sub
Prívate Sub Teoria_Click()
Texto. Show
End Sub
Prívate Sub Textl_Change()
DosEntradas.Checked = False
TresEntradas.Checked = False
CuatroEntradas.checked = False
CincoEntradas.Checked = False
SeisEntradas.Checked = False
SieteEntradas.Checked = False
OchoEntradas.Checked = False
NueveEntradas.Checked = False
DiezEntradas.Checked = False
If n = 2 Then DosEntradas.Checked = True
If n = 3 Then TresEntradas.Checked = True
If n = 4 Then CuatroEntradas.checked = True
If n = 5 Then CincoEntradas.Checked = True
If n = 6 Then SeisEntradas.Checked = True
If n = 7 Then SieteEntradas.Checked = True
If n = 8 Then OchoEntradas.Checked = True
If n = 9 Then NueveEntradas.Checked = True
If n = 10 Then DiezEntradas.Checked = True
End Sub
Prívate Sub Text2_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)
DoEvents
If Text2(Index).Text= "1" Then
r(Index + pagina * 64) = 1
Else
If Text2(Index).Text = "O" Then
r(Index + pagina * 64) = O
Else
r(Index + pagina * 64) = 2
Endlf
Endlf
a = Text2(Index).Text
If a o "O" And a o "1" And a o "" Then
mensage = MsgBox("Ingrese solamente O o 1", vbOKOnly, "Peligro")
Text2(Index).Text=""
191
r(Index + pagina * 64) = 2
Endlf
Cali Limpiar
Cali Contar
Cali ActualizarT4
End Sub
Prívate Sub Text2_KeyPress(Index As Integer, KeyAscii As Integer)
If KeyAscü = vbKeyRetnrn Then
KeyAscii = O
Endlf
DoEvents
If Text2(lndex).Text = "1" Then
r(Index + pagina * 64) = 1
Else
If Text2(Index).Text= "O" Then
r(Index + pagina * 64) = O
Else
r(Index + pagina * 64) = 2
Endlf
Endlf
a = Text2(Index).Text
If a o "O" And a o " 1" And a o "" Then
mensage = MsgBox("Ingrese solamente O o 1", vbOKOnly, "Peligro")
Text2(Index).Text =""
r(Index + pagina * 64) = 2
Endlf
Cali Limpiar
Cali Contar
Cali ActualizarT4
End Sub
Public Sub Text2_KeyUp(Index As Integer, KeyCode As Integer, Shift As Integer)
If KeyCode = 38 And Index > O Then Text2(Index - l).SetFocus
If (KeyCode = 40 Or KeyCode = 13) And índex < (2 A n - 1) - pagina * 64 Then
If Index < 63 Then
Text3(Index + l).Height = 150
Text2(Index + l).Height = 150
Text3(Index + l).Width = Text3(Index).Width
Text2(Index + l).Width = Text2(Index).Width
Text3(Index + l).Left - Text3(Index).Left
Text2(Index + l).Left = Text2(Index).Left
Text3(Index + l).Top = Text3(Index).Top + Text3(Index).Height
Text2(Index + l),Top = Text3(Index + l).Top
Text3(Index + l).Text = f(Index + 1 + pagina * 64)
Text2(Index + 1 ).ToolTipText = n f( M & Index + 1 + pagina * 64 & ")"
Endlf
If Index = 15 Or Index = 31 Or Index = 47 Then
If Text3(Index + 1).Visible = False Then
For il = O To índex
Text3(il).Left = Text3(il).Left - (Text3(il).Width + Text2(il).Width) / 2
Text2(il).Left = Text3(il).Left + Text3(il).Width
192
Nextil
Endlf
Text3(Index + l).Top = 2880
Text3(Index + l).Left = Text2(Index).Left + Text2(Index).Width + 40
Text2(Index + l).Top = 2880
Text2(Index + l).Left = Text3(Index + l).Left + Text3(Index + l).Width
Endlf
If Index < 63 Then
Text3(Index + 1). Visible = True
Text2(Index + 1). Visible = True
Text2(Index + l).SetFocus
Endlf
If Index - 63 And (2 A n) - 1 > 63 + pagina * 64 Then
If CommandS.Visible = False Then
pagina = pagina + 1
For i2 = O To Text2.UBound
Text2(i2).Text=""
Text3(i2).Text =""
Next i2
Text3(0).Text = f(pagina * 64)
Text3(0).Visible = True
Text2(0). Visible = True
Text2(0).SetFocus
Text2(0).ToolTipText = "f(" & pagina * 64 & ")"
Command4.Leñ = Text3(15).Left
Command4.Top = Text3(15).Top + Text3(15).Height + 20
Command4.Enabled = True
Command4.Visible = True
Else
Cali Command5_Click
Endlf
Endlf
Endlf
End Sub
Prívate Sub Text4_KeyPress(KeyAscii As Integer)
KeyAscii = valida_Numero(KeyAscii)
End Sub
Prívate Sub Text4_KeyUp(KeyCode As Integer, Shiñ As Integer)
If KeyCode = 32 Or KeyCode = 13 Then
Text4.Enabled = False
'Esta sección ubica la posición donde inicia y donde termina el numero dentr
'dentro del Text4
p2 = 2
For i = 3 To Len(Text4.Text)
193
If Mid(Text4.Text, i, 1) = " " Or Asc(Mid(Text4.Text, i, 1)) = 10 Or
Asc(Mid(Text4.Text, i, 1)) = 13 Or Mid(Text4.Text, i, 1) = ")" Then
Ifp2-pl>lThen
subíndice = Mid(Text4.Text, pl, p2 - pl)
Endlf
Endlf
Next i
If Val(subindice) < 1024 And Val(subindice) >= O Then
Limpiar
Desactivar
For i = O To UBound(r)
f(i) = ""
r(i) = 2
Next i
p2 = 2
For i = 3 To Len(Text4.Text)
If Mid(Text4.Text, i, 1) = "" Or Asc(Mid(Text4.Text, i, 1)) = 10 Or
Asc(Mid(Text4.Text, i, 1)) = 13 Or Mid(Text4.Text, i, 1) = ")" Then
pl=p2
p2 = i
I f p 2 - p 1 > 1 Then
subindice = Mid(Text4.Text, pl, p2 - pl)
r(Val(subindice)) = 1
pagina = Int(Val(subindice) / 64)
Endlf
Endlf
Next i
If n o Val(Int(Abs(Log(Val(subindice) + 0.6) / Log(2)) + 1)) Then
n = Val(Int(Abs(Log(Val(subindice) + 0.6) / Log(2)) + 1))
Endlf
If n o m Then
For i - O To Text2.UBound
Text3 (i). Visible = False
Text3(i).FontSize - 8
Text3(i),Locked = False
Text2(i).Visible = False
Text2(i).FontSize - 8
Next i
Text3(0).Height=150
Text2(0).Height=150
Text3(0).Width - n * 150 + 150 / n
Text2(0).Width = 200
Text3(0).Top = 2880
Text2(0).Top = 2880
Text3(0).Left = Forml.Width / 2 - (Forml.Text3(0).Width +
Forml .Text2(0).Width) - 400
Text2(0).Leñ = Forml .Text3(0).Left + Forml .Text3(0).Width
Text3(0).Visible = Truc
194
Text2(0). Visible = True
CommandS.Enabled = False
Command5. Visible = False
Command4.Enabled = False
Command4.Visible = False
m=n
Endlf
IfKeyCode = 32Then
For i = O To Val(subindice)
Ifr(i) = 2Thenr(i) = 0
Nexti
Endlf
IfKeyCode=13Then
For i = O To (2 A n) - 1
Ifr(i) = 2Thenr(i) = 0
Nexti
Endlf
Textl.Text = n
Actualizarf
ActualizarT4
DoEvents
If(2 A n)<=64Then
For i = O To (2 A n) -1
Text3(i).Text=f(i)
Ifr(i)-OOrr(i)-lThen
Text2(i).Text = r(i)
Else
Text2(i).Text=""
Endlf
Cali Text2_KeyUp((i), (40), (0))
DoEvents
Nexti
Else
For i - O To 63
Text3(i).Text - f(i + pagina * 64)
If r(i + pagina * 64) = O Or r(i + pagina * 64) = 1 Then
Text2(i).Text = r(i + pagina * 64)
Else
Text2(i).Text=""
Endlf
Cali Text2_KeyUp((i), (40), (0))
DoEvents
Next i
Command4.Leñ = Text3(15).Left
Command4.Top = Text3(15).Top + Text3(15).Height + 20
Command4,Enabled = True
Command4.Visible = True
Endlf
Text4.Width - Text4.Width + 200
Contar
195
Else
ActualizarT4
EndTf
Text4.Enabled = True
Guardar. Enabled = True
Text4.SelStart = Len(Text4.Text) Text4.SetFocus
Endlf
End Sub
Sub LimpiarQ
Fori = OToListl.UBound
Listl(i).Clear
List 1 (i). Visible = False
Next i
Commandó.Enabled = False
Command7.Enabled = False
Commandó.Visible = False
Command7.Visible = False
CommandS.Enabled = False
Command9.Enabled = False
CommandS.Visible = False
Command9.Visible = False
CommandlO. Visible — False
Commandl 1 .Visible = False
Commandl 2.Visible = False
Commandl 3. Visible = False
For i = O To max
For j = O To MaxCol
Marca(i,j)=""
Grupo(i,j) = 0
Nextj
Next i
For i = O To max
Forj-OTofíl(O)
Tabla(iJ)=""
Nextj
Next i
For i = O To max
filaAnulada(i) = False
Next i
For i - O To fíl(O)
numeroFila(Í) = O
columnaAnulada(i) = False
Next i
For i = O To Titulo.UBound
Titulo(i). Visible = False
Titulo(i).Caption - ""
Next i
For i = O To MaxCol
fíl(i) - O
196
Nexti
Textó.Visible = False
List2(0).Visible = Faise
List2(l).Visible = False
Picturel. Visible = False
Picturel.Cls
valizcom = Forml .Width - Commandl .Width - 360
m =0
col = 0
Resultado = False
lineas = False
escenciales = False
ultima = False
marcas = False
Tablalmplicantes = False
Implicantes = False
max = O
MaxCol = O
MaxColCubos = O
Auxl = O
Aux2 = 0
End Sub
Prívate Sub TresEntradas_Click()
n=3
Forml.Caption^ "Simplificación"
Cali Empezar
End Sub
Prívate Sub Tutoria_Click()
Tutorial.Show
End Sub
FORM2.
Prívate Type Registro
combinación As String * 20
respuesta As String * 1
End Type
Prívate dato As Registro
Prívate Sub Cancelar_Click()
Unload Me
Forml.Enabled = True
Forml. Show
End Sub
Prívate Sub Commandl_Click()
nombrecarpeta = InputBox("Nombre de la Carpeta")
MkDir (Dirl.Path & "\ & nombrecarpeta)
Dirl.Path = Dirl.Path & "\ & nombrecarpeta
197
End Sub
Prívate Sub Dirl_Change()
Filel.Path = Dirl.Path
End Sub
Prívate Sub Drivel_Change()
Dirl .Path = Drivel .Orive
End Sub
Prívate Sub Filel_Click()
lonar = Len(Filel.FileName)
extensión = Mid(Filel.FileName, lonar - 3, 4)
If extensión = ".boo" Then
Textl.Text = Mid(Filel.FileName, 1, lonar - 4)
Else
Textl.Text = Filel.FileName
Endlf
Textl.SetFocus
End Sub
Prívate Sub Form_Unload(Cancel As Integer)
Cancelar_Click
End Sub
Prívate Sub Guardar_Click()
If Textl.Text o ""Then
encuentra = vbNo
For i = O To Filel .ListCount - 1
If Textl.Text & ".boo" = Filel.List(i) Then
resp = MsgBox("El archivo ya existe desea sobreescribir", vbYesNo)
encuentra = vbYes
Exit For
Endlf
Nexti
If resp = vbYes Or encuentra = vbNo Then
archivo = Dirl.Path + "\ + Textl.Text + ".boo"
Forml.Caption = Textl.Text & ".boo"
Forml.Enabled = True
Open archivo For Random As 1 Len = Len(dato)
For i = 1 To 2 A n
dato.combinacion - f(i - 1)
dato.respuesta = r(i - 1)
Put 1, i, dato
Nexti
Cióse 1
Cancelar_Click
Endlf
Else
resp = MsgBox("Ingrese un nombre", vblnformation, "Información")
Endlf
End Sub
198
Prívate Sub Textl_KeyPress(KeyAscii As Integer)
If KeyAscii =13 Then
Cali Guardar_Click
Endlf
End Sub
FORM3
Prívate Type Registro
combinación As String * 20
respuesta As String * 1
End Type
Prívate dato As Registro
Prívate Sub Commandl_Click()
IfTextl.Texto ""Then
Forml.Textl.Enabled = False
Forml.Text4.Enabled = False
Forml.Mensaje.Caption = "Abriendo el archivo"
Forml.Mensaje. Visible = True
DoEvents
Cali Forml.Limpiar
Cali Forml.Desactivar
Forml.Enabled = True
archivo - Dirl.Path + "\ + Textl.Text
Forml.Caption = Textl.Text
Open archivo For Random As 1 Len = Len(dato)
nreg = LOF(l) / Len(dato)
n = (Log(nreg))/(Log(2))
For i = O To UBound(r)
f(i) = ""
r(i) = 2
Next i
Cali Forml.ActualizarT4
For i = 1 To nreg
Get 1, i, dato
f(i - 1) = dato.combinacion
r(i - 1) = Val(dato.respuesta)
Next i
Form3. Visible = False
Forml .Visible = True
DoEvents
For i = O To Forml .Text2.UBound
Forml. Text3 (i). Visible = False
Forml.Text3(i).FontSize = 8
Forml.Text3(i).Locked = False
Forml .Text2(i).Visible = False
Forml.Text2(i).FontSize = 8
Next i
Forml. Text3(0).Height = 150
Forml.Text2(0).Height = 150
199
FormLText3(0).Width - n * 150 + 150 / n
Forml.Text2(0).Width = 200
Forml.Text3(0).Top = 2880
Forml.Text2(0).Top = 2880
Forml .Text3(0).Left = Forml .Width / 2 - (Forml .Text3(0).Width +
Forml.Text2(0).Width) - 400
Forml .Text2(0).Left = Forml.Text3(0).Left + Forml.Text3(0). Width
FormLText3(0).Visible = True
Forml.Text2(0). Visible = True
Forml.Command5.Enabled = False
Forml. Command5. Visible = False
Forml.Command4.Enabled = False
Forml .Command4.Visible - False
pagina = Int(((2 A n)-l)/64)
Forml.Text2(0).ToolTipText = "f(" & pagina * 84 & ")"
If2 A n<-64Then
For i - O To (2 A n) - 1
Forml.Text3(i).Text = f(i)
Ifr(i) = OOrr(i)=lThen
Forml.Text2(i).Text = r(i)
Else
Forml .Text2(i).Text=""
Endlf
Cali Forml.Text2_KeyUp((i), (40), (0))
DoEvents
Next i
Else
For i = O To 63
Forml.Text3(i).Text = f(i + pagina * 64)
If r(i + pagina * 64) = O Or r(i + pagina * 64) = 1 Then
Forml.Text2(i).Text - r(i + pagina * 64)
Else
Forml. Text2(i).Text=""
Endlf
Cali Forml.Text2_KeyUp((i), (40), (0))
DoEvents
Next i
Forml. Command4.Left = Forml. Text3(15).Left
Forml.Command4.Top = Forml.Text3(15).Top + Forml.Text3(15).Height + 20
Forml.Command4.Enabled = True
Forml.Command4.Visible = True
Endlf
Glose 1
Forml.Guardar.Enabled — True
col = 0
m=n
Forml .Cls
Forml.Labell. Visible = True
Forml.Textl.Visible = True
Forml .Textl .Text = n
200
Forml.Mensaje.Caption = "Actualizando los registros"
DoEvents
Cali Forml.ActualizarT4
Cali Forml.Contar
Command2_Click
Forml.Mensaje.Visible = False
Forml.Text4.Enabled = True
Else
MsgBox ("Ingrese un nombre de archivo")
Endlf
End Sub
Prívate Sub Command2_ClickQ
Unload Me
Forml .Enabled = True
Forml. Show
End Sub
Prívate Sub Dirl_Change()
Filel.Path = Dirl.Path
End Sub
Prívate Sub Drivel_Change()
Dir 1 .Path = Drive 1 .Drive
End Sub
Prívate Sub Filel_Click()
Textl .Text = Filel .FileName
Textl .SetFocus
End Sub
Prívate Sub Filel_DblClick()
Textl .Text = Filel .FileName
Cali Commandl_Click
End Sub
Prívate Sub Form_Unload(Cancel As Integer)
Command2_Click
End Sub
Prívate Sub Textl_KeyPress(KeyAscü As Integer)
If KeyAscii = 13 Then
Commandl_Click
Endlf
End Sub
FORMULARIO INICIAL
Prívate Sub Commandl_Click()
Texto.Show 'Abre el formulario del Texto
End Sub
201
Prívate Sub Commandl_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
'Actualiza los colores de los comandos.
Commandl .BackColor = ColorEnfoque
Conunand2.BackColor = ColorlnicialBotones
Command3.BackColor = ColorlnicialBotones
Command4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Command2_Click()
Forml.Show 'Abre el formulario de la simplificación
End Sub
Prívate Sub Command2_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
'Actualiza los colores de los comandos.
Commandl .BackColor = ColorlnicialBotones
Command2.BackColor = ColorEnfoque
CommandS.BackColor = ColorlnicialBotones
Command4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Command3_Click()
End Termina la ejecución del programna.
End Sub
Prívate Sub Command3_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
'Actualiza los colores de los comandos.
Commandl.BackColor = ColorlnicialBotones
Command2.BackColor = ColorlnicialBotones
CommandS.BackColor = ColorEnfoque
Command4.BackColor - ColorlnicialBotones
End Sub
Prívate Sub Command4_Click()
Tutorial.Show 'Indica el formualario del tutorial de uso del programa.
End Sub
Prívate Sub Command4_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
'Actualiza los colores de los comandos.
Commandl.BackColor = ColorlnicialBotones
Command2.BackColor = ColorlnicialBotones
CommandS.BackColor = ColorlnicialBotones
Command4.BackColor = ColorEnfoque
End Sub
Prívate Sub Forrn_Load()
'Actualiza los colores de los comandos.
ColorlnicialBotones = &HFF8080
ColorEnfoque = &HCOFFFF
Commandl .BackColor = ColorlnicialBotones
Commandl.BackColor = ColorlnicialBotones
Command3.BackColor = ColorlnicialBotones
202
Command4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Form_MouseMove(Button As Integer, Shiñ As Integer, X As Single, Y As
Single)
'Actualiza los colores de los comandos,
Commandl.BackColor = ColorlnicialBotones
Command2.BackColor = ColorlnicialBotones
CommandS.BackColor = ColorlnicialBotones
Command4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Framel_MouseMove(Button As Integer, Shift As Integer, X As Single, Y
As Single)
'Actualiza los colores de los comandos.
Commandl.BackColor = ColorlnicialBotones
Command2.BackColor - ColorlnicialBotones
CommandS.BackColor = ColorlnicialBotones
Command4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Labell_MouseMove(Button As Integer, Shift As Integer, X As Single, Y
As Single)
'Actualiza los colores de los comandos.
Commandl .BackColor = ColorlnicialBotones
Commandl.BackColor = ColorlnicialBotones
CommandS.BackColor = ColorlnicialBotones
Command4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Picturel_MouseMove(Button As Integer, Shift As Integer, X As Single, Y
As Single)
'Actualiza los colores de los comandos.
Commandl.BackColor = ColorlnicialBotones
Command2.BackColor = ColorlnicialBotones
Command3.BackColor = ColorlnicialBotones
Command4.BackColor = ColorlnicialBotones
End Sub
FORMULARIO SPLASH
Option Explicit
Prívate Sub Form_KeyPress(KeyAscii As Integer)
Unload Me
Formulariolnicial. Show
End Sub
Prívate Sub Form_Load()
IblVersion.Caption = "Electrónica y Telecomunicaciones"
IblProductName.Caption = "Simplificación de Funciones Booleanas"
End Sub
Prívate Sub Timerl_Timer()
Unload Me
203
Formulariolnicial. Show
End Sub
FORMULARIO TEXTO
Prívate Sub Commandl ClickQ
Unload Me
FormularioInicial.Show
End Sub
Prívate Sub Commandl JVÍouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
Commandl .BackColor = ColorEnfoque
Command2.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Conimand2_Click()
n = Printers.Count - 1
Combo l.Clear
For i = O To n
Combo 1 .Addltem (Prínters(i).DeviceName)
Next i
Combo 1 .Text = Printer.DeviceName
Frame2.Visible = Truc
End Sub
Prívate Sub Command2_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
Command2.BackColor = ColorEnfoque
Commandl.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Command3_Click()
Dim X As Printer
For Each X In Printers
If X.DeviceName = Combo 1.Text Then
' La define como predeterminada del sistema.
Set Printer = X
' Sale del bucle.
Exit For
Endlf
Next
Printer. DrawMode = 1
RichTextBoxl.SelPrint (Printer.hDC)
Printer.EndDoc
Frame2.Visible = False
End Sub
Prívate Sub Command4_Click()
Frame2.Visible = False
End Sub
Prívate Sub Forrn_Load()
RichTextBoxl.LoadFile (App.Path & "\Texto.rtf')
204
End Sub
Prívate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As
Single)
Commandl .BackColor — ColorlnicialBotones
Command2.BackCoIor = ColorlnicialBotones
End Sub
Prívate Sub Programa_Click()
Me.Hide
Forml .Show
End Sub
Prívate Sub Tutoria_Click()
Me.Hide
Tutorial.Show
End Sub
FORMULARIO TUTORIAL
Dim re(16) As String
Dim ce(12, 6) As String
Dim mo(12, 6) As String
Dim TablaT(4, 9) As String
Dim so(9) As Integer
Dim Ultimo As Boolean
Const Tiempo = 0.5
Prívate Sub MostrarTutorialQ 'esta sección consta todo el código para mostrar el tutorial
Ultimo = False 'Sirve para controlar y saber si ya se ha llegado a la ultima pantalla de la
simplificación
Me.Cls 'Borra todo el formulario
If Tutor <= 22 And Commandl4.Enabled = True Then
Comrnandl4.Enabled = False
Endlf
If Tutor <= 18 Then
Labell. Visible = False
Textl. Visible = False
Else
Labell. Visible = True
Textl .Visible = True
Endlf
Select Case Tutor
Case O
Función. Visible — True
Programa. Visible = True
Teoria. Visible = True
Tutorial.Picture = LoadPicture(App.Path & "\fondoTutorial.bmp")
LabeB.Caption = "Para iniciar el Tutorial presione SIGUIENTE"' & vbCrLf & "Para
ir a la simplificación Presione el menú Simplificar" & vbCrLf & "Para ver la teoría
presionar el menú Teoria"
Case 1
205
Tutorial.Picture = LoadPicture(App.Path & "\Tutorl.bmp")
LabeO.Caption = "El programa de Simplificación esta compuesto por: MENÚ,
EDITOR DE MINTERMINOS, INDICADOR DE VARIABLES, TABLA DE
COMBINACIONES, Y COMANDOS"
Case 2
Tutorial.Picture = LoadPicture(App.Path & "\Tutor2.bmp")
LabeO.Caption = "El Menú tiene 3 opciones principales:" & vbCrLf & " FUNCIÓN,
TUTORIAL y TEORÍA"
Case 3
Tutorial.Picture = LoadPicture(App.Path & "\Tutor3.bmp")
LabeO.Caption = "El menú FUNCIÓN contiene: Nuevo, Abrir, Guardar, Simplificar,
Simplificar Siguiente Paso, Simplificar Paso Anterior y Pantalla Inicial"
Case 4
Tutorial.Picture = LoadPicture(App.Path & "\Tutor4.bmp")
LabeO.Caption = "El menú TUTORIAL le permite pasar de la simplificación a este
tutorial"
Case 5
Tutorial.Picture = LoadPicture(App.Path & "\Tutor5.bmp")
LabeO.Caption = "El menú Teoría sirve para pasar del proceso de simplificación a la
teoría sobre el método Quine McCluskey"
Case 6
Tutorial.Picture = LoadPicture(App.Path & "\Tutor6.bmp")
LabeO.Caption = "La opción FUNCIÓN / NUEVO permite ingresar una función
nueva ya sea como ECUACIÓN DE MINTERMINOS, o como TABLA DE
COMBINACIONES"
Case 7
Tutorial.Picture = LoadPicrure(App.Path & "\Tutor7.bmp")
LabeO.Caption = "La Opción ABRIR permite leer una tabla grabada previamente en
disco con extensión .boo por ejemplo: 'funcionSb.boo'"
Case 8
Tutorial.Picture = LoadPicture(App.Path & "\Tutor8.bmp")
LabeO.Caption - "La opción GUARDAR graba en disco una tabla de combinaciones
o función con extensión .boo (el programa la pone automáticamente)"
Case 9
Tutorial.Picture = LoadPicture(App.Path & "\Tutor9.bmp")
LabeO.Caption = "La opción SIMPLIFICAR Simplifica completamente la función
booleana hasta el final en forma automática"
Case 10
Tutorial.Picture = LoadPicture(App.Path & "\Tutorl0.bmp")
LabeO.Caption = "Simplifica paso por paso la función y es equivalente a presionar el
comando SIGUIENTE"
Case 11
Tutorial.Picture = LoadPicture(App.Path & "\Tutorl l.bmp")
LabeO.Caption = "Regresa al paso anterior del proceso de simplificación de la
función"
Case 12
Tutorial.Picture = LoadPicture(App.Path & "\Tutorl2.bmp")
LabeO .Caption = "Regresa al menú principal"
Case 13
TutoriaLPicture = LoadPicture(App.Path & "\Tutorl3.bmp")
206
Label3.Caption = "Esta opción permite INGRESAR LOS MTNTERMINOS de una
nueva función booleana"
Case 14
Label2.Visible = False
Text4.Visible = False
Fori = O T o l 5
Text3(i).Visible = False
Text2(i).Visible = False
Next i
Funcion.Enabled = False
Función. Visible = False
Programa. Visible = False
Teoria.Visible = False
Tutorial.Picture = LoadPicture(App.Path & "\Tutorl4.bmp")
LabeO.Caption = "Esta opción sirve para ingresar la TABLA DE
COMBINACIONES de una función nueva (Máximo 10 variables de entrada)"
Case 15
Tutorial.Picture = LoadPicture(App.Path & "\fondoTutorial.bmp")
Label2.Visible = False
Text4.Visible = False
Fori = OTo 15
TextS (i). Visible - False
Text2(i). Visible = False
Next i
Funcion.Enabled = True
Funcion.Visible = True
Programa. Enabled = False
Programa. Visible = True
Teoria.Enabled = False
Teoría. Visible = True
Abrir.Enabled = False
IngresarTabla.Enabled — False
Label3.Caption = "A continuación se hará un ejemplo de simplificación con 4
variables de entradas Para eso haga clic en:" & vbCrLf & " FUNCIÓN / NUEVO /
INGRESARMINTÉRMINOS "
IngresarMinterminos. Enabled = True
Ultimo = True
Case 16
Tutoría!. Cls
Text3 (i). Visible = False
Text2(i).Visible = False
Next i
IngresarMmterminos_Click
Me.Cls
Commandl .Enabled = False
LabeB.Top = Text4.Top + Text4.Height
Label3.Caption - "Mientras escribe los mintérminos, en la tabla de combinaciones
aparecerá el valor ingresado"
Label3.Left = Tutorial.Width / 2 - Label3.Width / 4
207
For i = 1 To 16
cont = O
Text3(i-l) = n"
Do
cont = cont + 1
res = Q Mod 2
Q = Q\
Text3(i - 1) = Str(res) + Text3(i - 1)
Loop Until (cont = 4)
Next i
Text4.Text="("
DoEvents
For i = O To Text3.UBound
Text3(i).Height=150
Text2(i).Height=150
Text3(i).Width = 4 * 150 + 150 / 4
Text2(i).Width = 200
Text3(i).Left - Tutorial.Width / 2 - (Text3(i).Width + Text2(i).Width) - 400
Text2(i).Leñ = Text3(i).Left + Text3(i).Width
Text3(i).Top = 2880 + (i) * Text3(i).Height
Text2(i).Top = Text3(i).Top
If re(i) = "1" And ¡ o 9 Then
Text4.Text = Text4.Text & Str(i) & 1( "
Beep
Me.Cls
Me.DrawWidth = 2
Me.Line (Label3.Left + 0.75 * Label3.Width, Label3.Top + Label3.Height)(Text2(i).Left + Text2(i).Width> Text2(i).Top)
DoEvents
If Len(Text4.Text) < 50 Then
Text4.Width = 75 * Len(Text4.Text) + 75 / Len(Text4.Text) + 200
Text4.Height =
Else
Text4.Height =
Text4.Width = 75 * 50 + 75 / 50 + 200
Endlf
Text4.SelStart = Len(Text4.Text)
Text4.SetFocus
Endlf
Ifi<=13Then
Text3(i).Visible = True
Text2(i).Visible - True
Ifio9Then
Text2(i).Text - re(i)
Else
Text2(i).Text - "O"
Endlf
Else
Text2(i).Text - re(i)
208
Endlf
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Next i
Text4.Text = Text4.Text & ")"
Label3.Caption = "Cuando se termina de ingresar todos los mintérminos, se presiona
<ENTER> para completar la tabla"
Label3.Left = Tutorial.Width / 2 - LabeB.Width / 4
DoEvents
Case 17
Text4.Visible = True
Funcion.Enabled = False
Programa.Enabled = True
Teoría. Enabled = True
Me.Line (LabelS.Left + LabeB.Width / 2, LabelS.Top + Label3.Height>
(Text2(0).Leñ + Text2(0).Width / 2, Text2(0).Top)
Fori = O T o l 3
Text3 (i). Visible = True
Text2(i). Visible = True
Next i
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Text3(14).Visible = True
Text2(14).Visible = True
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Text3(15).Visible = True
Text2(15).Visible = True
If Len(Text4.Text) < 50 Then
Text4.Width = 75 * Len(Text4.Text) + 75 / Len(Text4.Text) + 200
Text4.Height = 215
Else
Text4.Height - 2 * 237
Text4.Width = 75 * 50 + 75 / 50 + 200
Endlf
Label3.Caption = "Otra forma de ingresar la función es ingresando en la TABLA DE
COMBINACIONES"
CaselS
Fori = OTo 15
Text3(i).Visible = False
Text2(i).Visible = False
Next i
Label2.Visible = False
Text4.Visible = False
209
LabeO.Caption = "Para ingresar los valores en la tabla de combinaciones se "
LabeO.Caption = LabeB.Caption & "presiona: FUNCIÓN / NUEVO / INGRESAR
TABLA / n ENTRADAS (en este ejemplo n=4)"
Funcion.Enabled = Truc
Programa.Enabled = False
Teoria.Enabled = False
IngresarTabla.Enabled = True
IngresarMinterminos.Enabled = False
Ultimo = True
Case 19
Titulo(0).Visible = False
List 1(0). Visible = False
Fori = O T o l 5
Text3(i).Visible = False
Text2(i). Visible = False
Next i
Text4.Text=""
CuatroEntradas_Click
Commandl .Enabled = False
F o r i - O T o 15
Text3(i).Visible = True
Text2(i).Text = ""
Text2(i).Visible = True
LabeO.Caption = "Mientras se van poniendo las salidas, automáticamente se irán
ecribiendo los mintérminos en el editor de mintérminos"
Text2(i).SetFocus
Me.Line (Text4.Left + 200, Text4.Top + Text4.Height)-(Label3.Lefís LabeB.Top
+ Label3.Height/2)
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl > Tiempo
Ifio9Then
Text2(i).Text = re(i)
Else
Text2(i).Text = "O"
Endlf
If re(i) = " 1" And i o 9 Then
Text4.Text = Text4.Text & " " & Str(i)
Beep
Endlf
Text2(i).SeIStart = Len(Text2(i).Text)
Text2(i).SetFocus
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl > Tiempo
If Len(Text4.Text) < 50 Then
Text4.Width = 75 * Len(Text4.Text) + 200
Text4.Height =
210
Else
Text4.Height - 2 * 237
Text4.Width = 75 * 50 + 75 / 50 + 200
Endlf
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl > Tiempo / 2
Next i
Text4.Text = Text4.Text & " )"
Me.Cls
LabelS.Caption = "Una vez que se ha ingresado toda la función sea con los
mintérminos o en la tabla de combinaciones, se debe revisar que no tenga errores, en
cuyo caso se debe corregirlo "
Case 20
Text4.Text = " ( "
Fori = O T o l 5
If re(i) = "1" And i o 9 Then Text4.Text = Text4.Text & ?1 " & Str(i)
Next i
Text4.Text = Text4.Text & ")"
Text2(9).Text = "O"
Label3.Caption = "La corrección se puede hacer ya sea en la tabla de combinaciones,
como en el editor de mintérminos, como se indica a continuación. Haga clic en el botón
Siguiente"
Me.Line (Text4.Left + 400, Text4.Top + Text4.Height)-(Label3.Left, Label3.Top +
Label3.Height/2)
Me.Line (Text2(0).Leñ + Text2(0).Width, Text2(0).Top)-(Label3.Left +
LabeB.Width / 2, LabelS.Top + Label3.Height)
Case 21
Text4.Text="("
Fori = OTo 15
If re(i) = "1" And i o 9 Then Text4.Text = Text4.Text & " n & Str(i)
Next i
Text4.Text = Text4.Text & ")"
Text2(9).Text=H0H
LabeD.Caption = "Si se corrige en el editor de mintérminos la tabla de
combinaciones se actualizará automáticamente como vemos en este ejemplo"
For i = 1 To 22
Text4.SelStart = i
Text4.SetFocus
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo / 2
Next i
cadena = Text4.Text &" "
Mid(cadena,23)="910 13)"
Text4.Text = cadena
Text4.SelStart - 23
Text4.SetFocus
211
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo / 2
cadena = Text4.Text
Mid(cadena, 23) = "9 10 13)"
Text4.Text = cadena
Text4.SelStart = 24
Text4.SetFocus
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo / 2
cadena = Text4.Text
Mid(cadena, 23) = "9 10 13)"
Text4.Text = cadena
Text4.SelStart - 25
Text4.SetFocus
Timerl = Timer
Do
DoEvents
Loop Until Tirner - Timerl >= Tiempo / 2
Text2(9).Text = ""
Beep
Me.Line (LabeB.Left + LabeD.Width / 2, LabeO.Top + Label3.Height)(Text2(9).Left + Text2(9).Width, Text2(9).Top)
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Text2(9).Text = "l"
Label3.Caption = "La corrección también se lo puede hacer en la tabla de
combinaciones como se muestra a continuación."
Case 22
Text4.Text = " ( "
Fori = O T o l 5
If re(i) = n 1" And i o 9 Then Text4.Text - Text4,Text & "" & Str(i)
Next i
Text4.Text = Text4.Text & ")"
Text2(9).Text = "O"
DoEvents
LabeB.Caption = "Si la corrección se hace en la tabla de combinaciones entonces el
editor de mintérminos se actualizará automáticamente"
F o r i ^ O T o 12
Text2(i).SelStart=l
Text2(i).SetFocus
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
212
Next i
Fori=12To9Step-l
Text2(i).SelStart = 1
Text2(i).SetFocus
Timerl = Timer
Do
DoEvents
Loop Untíl Timer - Timerl >= Tiempo
Next i
Text2(9).Text=""
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Text2(9).Text=fT'
DoEvents
Beep
Me.Lme (Text4.Left + 1000, Text4.Top + Text4.Height)-(Label3.Left, LabeB.Top +
Label3.Height/2)
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
cadena = Text4.Text & " "
Mid(cadena, 23) = "9 10 13)"
Text4.Text = cadena
Case 23
Titulo(0).Visible = False
Listl(0).Visible = False
Titulo(l). Visible = False
Listl(l).Visible = False
Fori = OTo 15
Text3(i).Visible = True
Text2(i).Visible = True
Next i
Label3.Caption = "Una vez que se ha ingresado y corregido los datos, se procede a
simplificar. La simplificación se puede realizar paso a paso presionando el botón
Siguiente, ó, puede ir directamente a la solución haciendo clic en el botón Terminar "
Me.Line (Label3.Left + Label3.Width / 2, Label3.Top + LabeB.Height)(Framel.Leñ, Framel.Top + Commandl.Top + Commandl.Height/2)
Me.Line (LabeB.Left + Label3.Width / 2, LabeB.Top + LabeB.Height)(Framel.Left, Framel.Top + CommandH.Top + CommandH.Height/ 2)
Commandl4.Enabled = True
Case 24
For i = O To Text3.UBound
Text3(i). Visible = False
Text2(i). Visible = False
Next i
Titulo(0).Top = LabeB.Top + LabeB.Height
Titulo(0).Caption = "MINTERMINOS"
213
Listl(0).Top = Titulo(0).Top + Titulo(0).Height
Listl(0).Left = 3000
Listl(0).Width = 2.75 * TextWidth("0 0000")
Titulo(0).Left = 3000
Listl(0).Height = 21 * TextHeight("0")
Listl(0).Clear
Titulo(0).Visible = True
Listl(O). Visible = True
For i = 1 To 9
IfVal(mo(i,0))<10Then
Listl(0).AddItem (mo(i, 0) & " " & ce(i, 0))
Else
Listl(0).AddItem (mo(i, 0) & " " & ce(i, 0))
Endlf
DoEvents
Next i
LabeB.Caption = "Esta es la tabla de MINTERMINOS y de CUBOS 0. Como se
ve, esta tabla está ordenada de acuerdo al número de UNOS en cada combinación que
tiene salida 1"
Titulo(l).Top = LabeO.Top + LabelS.Height
Titulo(l).Captíon= "CUBOS O"
Listl(l).Top = Titulo(l).Top + Titulo(l).Height
Listl(l).Left = Listl(0).Left + Listl(0).Width + 1000
Listl(l).Width = 3 * TextWidth("0000")
Titulo(l).Left = Listl(0).Left + Listl(0).Width + 1000
Listl(l).Height = 28 * TextHeight("0")
Listl(l).Clear
Titulo(l). Visible = True
List 1(1). Visible = True
Fori=lTol2
Listl(l).AddItem(ce(i 9 l))
DoEvents
Next i
Case 25
Titulo(0).Top = LabeB.Top + Label3.Height
Titulo(0).Caption = "CUBOS O"
Listl(0).Top = Titulo(0).Top + Titulo(0).Height
List l(0).Left = 3000
Listl (O).Width = 2.75 * TextWidth("0 0000")
Titulo(0).Left = Listl(0).Left + Listl(O).Width / 2 - Titulo(0).Width / 2
Listl(0).Height = 28 * TextHeight("0")
Listl(0).Clear
Titulo(0).Visible = True
Listl(0).Visible = True
F o r i = l Tol2
If i o 2 And i o 5 And i o 10 Then
Listl(0).AddItem ("* " & ce(i, 1))
Else
Listl(0).AddItem (" " & ce(i, 1))
Endlf
214
DoEvents
Nexti
Titulo(l).Top = LabeB.Top + LabeB.Height
Titulo(l).Caption= "CUBOS 1"
Listl(l).Top = Listl(0).Top
Listl(l).Left = Listl(0).Left + Listl(0).Width + 300
Listl(l).Width = 2.75 * TextWidth("0000")
Titulo(l).Left = Listl(l).Left + Listl(l).Width / 2 - Titulo(l).Width / 2
Listl(l).Height = 28 * TextHeight("0")
Listl(l).Clear
Titulo(l). Visible = Truc
Listl(l).Visible = True
For i = 1 To 12
Listl(l).AddItem (ce(i, 2))
DoEvents
Nexti
LabeB.Caption - "Aquí están las tablas de los CUBOS O y CUBOS 1." & vbCrLf
& "En los CUBOS O se pone una marca (*) para indicar las combinaciones que han
sido usadas para formar los CUBOS 1"
Case 26
Titulo(0).Top - LabeB.Top + LabeB.Height
Titulo(0).Caption = "CUBOS 1"
Listl(0).Top = Titulo(0).Top + Titulo(0).Height
Listl(0).Left = 3000
Listl(0).Width = 2.75 * TextWidthf 0000")
Titulo(0).Left = Listl(0).Left + Listl(0).Width / 2 - Titulo(0).Width / 2
Listl(0).Height = 28 * TextHeight("0")
Listl(0).Clear
Titulo(0).Visible = True
Listl(0).Visible = True
Fori=lTol2
If i o 3 And i o 7 And i o 9 And i o 12 Then
Listl(0).AddItem("* " & ce(i, 2))
Else
Listl(0).AddItem (" " & ce(i, 2))
Endlf
DoEvents
Nexti
Tituio(l).Top - LabeB.Top + Label3.Height
Titulo(l).Caption = "CUBOS 2"
Listl(l).Top = Listl(0).Top
Listl(l).Left = Listl(0).Left + Listl(0).Width + 300
Listl(l).Width = 2.75 * TextWidth("0000")
Titulo(l).Left - Listl(l).Left + Listl(l).Width / 2 - Titulo(l).Width / 2
Listl(l).Height = 8 * TextHeight(M0")
Listl(l).Clear
Titulo(l).Visible = True
Listl(l).Visible = True
For i = Í To 3
Listl(l).AddItem (ce(i, 3))
215
DoEvents
Next i
LabelS.Caption = "Aquí se presentan las tablas de los CUBOS 1 y CUBOS 2." &
vbCrLf & "En los CUBOS 1 existen 2 combinaciones que no se han agrupado, estas
forman parte de los implicantes primos"
Case 27
Picturel. Visible = False
Titulo(0).Top = LabeB.Top + Label3.Height
Titulo(0).Caption = "CUBOS 2"
Listl(0).Top = Titulo(0).Top + Titulo(0).Height
Listl(0).Left = 3000
Listl(0).WÍdth = 2.75 * TextWidth(" 0000")
Titulo(0).Left = Listl(0).Left + Listl(0).Width / 2 - Titulo(0).Width / 2
Listl(0).Height = 8 * TextHeightfO")
Listl(0).Clear
Titulo(0).Visible = True
List 1(0). Visible = True
For i = 1 To 3
List 1 (0).Addltem (" " & ce(i, 3))
DoEvents
Next i
Titulo(l).Top = Label3.Top + LabeB.Height
Titulo(l).Captíon= "IMPLICANTES PRIMOS"
Listl(l).Top = Listl(0).Top
Listl(l).Left = Listl(0).Left + 2 * Listl(0).Width + 300
Listl(l).Width = 2.75 * TextWidthfOOOO")
Titulo(l).Left = Listl(l).Left + Listl(l).Width/ 2 - Titulo(l).Width / 2
Listl(l).Height = 10 * TextHeightfO")
Listl(l).Clear
Titulo(l). Visible = True
Listl(l).Visible = True
For i = 1 To 4
Listl(l).AddItem(ce(i,4))
DoEvents
Next i
LabeB.Caption = "Aqui están las tablas de CUBOS 2 y los IMPLICANTES
PRIMOS. En los CUBOS 2 todas las combinaciones forman parte de los implicantes
primos, ya que no se pueden hacer combinaciones para formar CUBOS 3"
Case 28 'Construcción de la tabla de simplificación
so(l) = 0
so(2) = 2
so(3) = 3
so(4) = 6
so(5) = 7
so(6) = 8
so(7) = 9
so(8)=10
so(9)=13
For i = 1 To 4
Forj = l To9
216
TablaT(í,j) =
Nextj
Next i
TablaT(l,6) = "*"
TablaT(l, ?) = "*"
TablaT(2,7)-"*"
TablaT(2>9) = 11*11
TablaT(3, 1) = "*"
TablaT(3, 2) = "*"
TablaT(3, 6) = "*"
TablaT(3, 8) = "*"
TablaT(4, 2) = "*"
TablaT(4, 3) = "*"
TablaT(4,4) = "*"
TablaT(4, 5) = "*"
Label3.Caption = "La tabla de simplificación se forma con los implicantes primos y
con los mintérminos; la marca se pone en todas las celdas que coinciden con los
implicantes y los mintérminos utilizados"
Titulo(l). Visible = False
Titulo(0).Visible = False
Listl(0).Visible = False
Listl(l). Visible = False
List2(0). Visible = Faise
Titulo(0).Top - LabeB.Height + LabeO.Height + 100
Titulo(0).Caption = "TABLA DE SIMPLIFICACIÓN"
Titulo(0).Left = Forml.Width / 2 - TituIo(O).Width / 2
Picturel.Top = Titulo(0).Top + Titulo(0).Height
Titulo(0).Visible = True
DoEvents
espacio = TextWidth("00000000")
ancho = TextWidth("OOOOOOn)
alto = 1.25 * TextHeight("0")
Picturel.Width = ancho + espacio + 9 * ancho
Picturel.Left = Forml.Width / 2 - Picturel.Width / 2
Picturel.Height = 6 * alto
Picturel.Cls
Picturel.Visible = True
Picturel.CurrentX = ancho
Picturel.Line (Picturel.CurrentX - ancho / 50, 0)-(Picturel.CurrentX,
Picturel.Height), ,BF
DoEvents
For i = 1 To 9
Picturel .CurrentX = ancho + espacio + ancho * (i - 1)
Picturel.Line (Picturel.CurrentX - ancho / 50, 0)-(Picturel.CurrentX,
Picture 1.Height), ,BF
Picturel.CurrentX = ancho + espacio + ancho * (i - 1) + ancho 12TextWidth(Str(so(i)))
Picture l.Current Y = O
Picturel.Print so(i)
DoEvents
217
Nexti
For i = 1 To 4
Picturel.CurrentY = i * alto
Picturel.Line (O, Picturel.CurrentY - alto / 20)-(Picturel.Width,
Picturel.CurrentY),, BF
Picturel.CurrentX = 1.25 * ancho
Picturel.CurrentY = i * alto
Picturel.Print ce(i, 4);
DoEvents
Forj = l To9
IfTablaT(iJ) = "*"Then
Picturel.CurrentX = ancho + espacio + ancho * (j - 1) + ancho / 2 TextWidth("*")
Picturel .CurrentY = i * alto + TextHeight(M*") / 8
Picturel .Print TablaT(i, j);
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo / 4
Endlf
Nextj
Picturel.Print
DoEvents
Nexti
Picturel.CurrentY = 5 * alto
Picturel.Line (O, Picturel.CurrentY - alto / 20)-(Picturel.Width, Picturel.CurrentY),
>BF
Case 29
'Cálculo de los implicantes primos esenciales
espacio = TextWidthfOOOOOOOO")
ancho - TextWidth("000000")
alto = 1.25 * TextHeight("0")
Picturel.Cls
Picturel. Visible = True
Picturel .CurrentX = ancho
Picturel.Line (Picturel.CurrentX - ancho / 50, 0)-(Picturel.CurrentXí
Picturel.Height),, BF
DoEvents
For i = 1 To 9
Picturel.CurrentX = ancho + espacio + ancho * (i - 1)
Picturel.Line (Picturel.CurrentX - ancho / 50, 0)-(Picturel.CurrentX,
Picturel.Height),, BF
Picturel.CurrentX = ancho + espacio + ancho * (i - 1) + ancho 12TextWidth(Str(so(i)))
Picturel.CurrentY = O
Picturel,Print so(i)
DoEvents
Nexti
For i = 1 To 4
Picturel.CurrentY = i * alto
218
Picturel.Line (O, Picturel.CurrentY - alto / 20)-(Picturel.Width,
Picturel.CurrentY),, BF
Picturel.CurrentX = 1.25 * ancho
Picturel.CurrentY = i * alto
Picturel .Print ce(i, 4);
DoEvents
Forj = l T o 9
IfTablaT(iJ)="*"Then
Picturel.CurrentX = ancho + espacio + ancho * (j - 1) + ancho / 2 TextWidth("*")
Picturel.CurrentY = i * alto + TextHeight("*") / 8
Picturel .Print TablaT(i, j);
DoEvents
Endlf
Nextj
Picturel.Print
DoEvents
Next i
Picturel.CurrentY = 5 * alto
Picturel.Line (O, Picturel.CurrentY - alto / 20)-(Picturel.Width, Picturel.CurrentY),
,BF
Label3.Caption = "Los implicantes primos esenciales formarán parte de la solución"
Titulo(l).Left = Picturel.Leñ
Titulo(l).Top = Picturel.Top + Picturel. Height
Titulo(l).Captíon= "ESENCIALES"
Titulo(l). Visible = True
List2(0).Left = Titulo(l).Left
List2(0).Top = Titulo(l).Top + Titulo(l).Height
List2(0).Clear
List2(0).Visible = True
ColorLinea = RGB(255, O, 0)
Picturel.CurrentX = ancho + espacio + ancho * (1 - 1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLinea
Picturel.CurrentX = ancho + espacio + ancho *(!-!) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX5 alto / 2),
ColorLinea
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Picturel .CurrentX = ancho / 2
Picturel.CurrentY = 3.5 * alto
Picturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLinea
Picturel.CurrentX = ancho + 0.85 * espacio
Picturel.CurrentY = 3.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.Width,
Picturel.CurrentY), ColorLinea
Picturel.CurrentX = ancho + espacio + ancho * ( ! - ! ) + ancho / 2
219
Picturel.CurrentY = 3.5 * alto
Picturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 1.5 * TextWidth("*"),
ColorLinea
List2(0).AddItem ("XOXO")
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Picturel.CurrentX = ancho + espacio + ancho * (2 - 1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLinea
Picturel .CurrentX = ancho + espacio + ancho * (2 - 1) + ancho / 2
Picturel .CurrentY = 5.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Pictiirel.CurrentX, alto / 2),
ColorLinea
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Picturel .CurrentX = ancho + espacio + ancho * (6 -1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLinea
Picturel .CurrentX = ancho + espacio + ancho * (6 - 1) + ancho / 2
Picturel .CurrentY = 5.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX, alto / 2),
ColorLinea
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Picturel.CurrentX = ancho + espacio + ancho * (8 - 1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLinea
Picturel .CurrentX = ancho + espacio + ancho * (8 - 1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.Curren:Y)-(Picturel.CurrentX, alto / 2),
ColorLinea
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
ColorLinea = RGB(0, 255, 0)
Picturel.CurrentX = ancho + espacio + ancho * (3 - 1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Circle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLinea
Picturel .CurrentX = ancho + espacio + ancho * (3 - 1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX, alto / 2),
ColorLinea
220
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Picturel.CurrentX = ancho / 2
Picturel .CurrentY = 4.5 * alto
Picturel.Gírele (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLinea
Picturel.CurrentX = ancho + 0.85 * espacio
Picturel.CurrentY = 4.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.Width,
Picturel.CurrentY), ColorLinea
Picturel.CurrentX = ancho + espacio + ancho * (3 - 1) + ancho / 2
Picturel.CurrentY = 4.5 * alto
Picturel.Circle(PictureLCurrentX,Picturel.CurrentY), 1.5 * TextWidth("*"),
ColorLinea
List2(0).AddItem ("OX1X")
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Picturel .CurrentX = ancho + espacio + ancho * (4 - 1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Circle (Picturel.CurrentX, PictureLCurrentY), 25, ColorLinea
Picturel.CurrentX = ancho + espacio + ancho * (4 - 1) + ancho / 2
PictureLCurrentY = 5.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX, alto / 2),
ColorLinea
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Picturel .CurrentX = ancho + espacio + ancho * (5 - 1) + ancho / 2
PictureLCurrentY = 5.5 * alto
Picturel.Circle (Picturel.CurrentX, PictureLCurrentY), 25, ColorLinea
Picturel.CurrentX = ancho + espacio + ancho * (5 - 1) + ancho / 2
Picturel .CurrentY = 5.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX, alto / 2),
ColorLinea
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
ColorLinea = RGB(0, O, 255)
Picturel .CurrentX = ancho + espacio + ancho * (9 - 1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Circle (Picturel.CurrentX, PictureLCurrentY), 25, ColorLinea
Picturel .CurrentX = ancho + espacio + ancho * (9 - 1) + ancho / 2
PictureLCurrentY = 5.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX, alto / 2),
ColorLinea
221
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Picturel.CurrentX = 0.5 * ancho
Picturel.CurrentY = 2.5 * alto
Picturel.Gírele (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLinea
Picturel.CurrentX = ancho -f- 0.85 * espacio
Picturel.CurrentY = 2.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.Width,
Picturel.CurrentY), ColorLinea
Picturel.CurrentX = ancho + espacio + ancho * (9 - 1) + ancho / 2
Picturel.CurrentY = 2.5 * alto
Picturel.Circie (Picturel.CurrentX, Picturel.CurrentY), 1.5 * TextWidth("*fl),
ColorLinea
List2(0).AddItem ("1X01")
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Picturel.CurrentX = ancho + espacio + ancho * (7 - 1) + ancho / 2
Picturel.CurrentY = 5.5 * alto
PictureLCircle (Picturel.CurrentX, Picturel.CurrentY), 25, ColorLinea
Picturel .CurrentX = ancho + espacio + ancho * (7 - 1)+ ancho / 2
Picturel.CurrentY = 5.5 * alto
Picturel.Line (Picturel.CurrentX, Picturel.CurrentY)-(Picturel.CurrentX, alto / 2),
ColorLinea
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Case 30
Labeló.Visible = False
Tituio(0).Visible = True
Titulo(l). Visible = True
Picturel.Visible = True
List2(0).Visible = True
LabeB.Caption = "Puesto que se han cubierto todas las columnas, no se forman
implicantes secundarios, entonces de cada implicante escencial saldrá un término de la
solución y de cada implicante primo esencial sale un término de la solución final"
DoEvents
CurrentX = List2(0).Left + List2(0).Width
CurrentY = List2(0).Top + 0.75 * TextHeight("X")
Me.Line (CurrentX, CurrentY)-(CurrentX + 1000, CurrentY), RGB(255, O, 0)
CurrentY = CurrentY - TextHeight("X") / 2
Print "B'D"'
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
222
CurrentX = List2(0).Left + List2(0).Width
CurrentY = List2(0).Top + 2 * TextHeight("X")
Me.Line (CurrentX, CurrentY)-(CurrentX + 1000, CurrentY), RGB(0, 255, 0)
CurrentY = CurrentY - TextHeight("X") / 2
Print "A'C"
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
CurrentX = List2(0).Left + List2(0).Width
CurrentY = List2(0).Top + 3.25 * TextHeightfX")
Me.Line (CurrentX, CurrentY)-(CurrentX + 1000, CurrentY), RGB(0, O, 255)
CurrentY = CurrentY - TextHeight(nX") / 2
Print "AC'D"
Case 31 'Construcción de la función Resultante
Titulo(O). Visible = False
Titulo(l). Visible = False
Picturel. Visible = False
List2(0).Visible = False
Label3.Caption = "La solución tiene tres términos"
Labeló.Visible = True
DoEvents
Labeló.Caption = "Y = B'D'"
Labeló.Left = Tutorial.Width / 2 - Labelo,Width / 2
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Labeló.Caption = "Y = B'D' + A'C"
Labeló.Left = Tutorial.Width / 2 - Labelo.Width / 2
Timerl = Timer
Do
DoEvents
Loop Until Timer - Timerl >= Tiempo
Labeló.Caption = "Y = B'D' + A'C + AC'D"
Labeló.Left = Tutorial.Width / 2 - Labelo.Width / 2
Ultimo = True
Case El se
End Select
End Sub
Prívate Sub CincoEntradas_Click()
Beep
End Sub
Prívate Sub Commandl_Click()
Commandl.Enabled = False
CommandH.Enabled = False
Command2.Enabled = False
Command3.Enabled = False
223
Tutor = Tutor + 1
t
MostrarTutorial
Command2.Enabled - Truc
Command3.Enabled = Truc
If Tutor o 21 Then Command2.SetFocus
If Ultimo = False Then
Commandl. Enabled = True
If Tutor >= 23 Then Commandl4.Enabled = True
If Tutor o 21 Then Commandl.SetFocus
Endlf
End Sub
Prívate Sub Commandl _MouseMove(Button As Integer, Shiñ As Integer, X As Single,
Y As Single)
Commandl .BackColor = ColorEnfoque
Command2.BackColor = ColorlnicialBotones
Command3.BackColor = ColorlnicialBotones
End Sub
Private Sub Commandl4_Click()
CommandH.Enabled = False
Do
Command 1 _C1 ick
Loop Until Ultimo = True
End Sub
Private Sub Command2_Click()
Commandl .Enabled = False
Command 14.Enabíed = False
Command2.Enabled = False
CommandB. Enabled = False
Tutor = Tutor - 1
MostrarTutorial
If Tutor o 21 Then CommandS.Enabled = True
If Ultimo - False Then
Commandl .Enabled = True
Commandl .SetFocus
Endlf
If Tutor > O Then
Command2.Enabled = True
If Tutor o 21 Then Command2. SetFocus
Endlf
End Sub
Private Sub Command2_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
Commandl.BackColor = ColorlnicialBotones
224
Command2.BackColor = ColorEnfoque
CommandS.BackColor = ColorlnicialBotones
Commandl4.BackColor = ColorTnicialBotones
End Sub
Prívate Sub Command3_Click()
Unload Me
End Sub
Prívate Sub Command3_MouseMove(Button As Tnteger, Shift As Integer, X As Single,
Y As Single)
Commandl.BackColor = ColorlnicialBotones
Command2.BackColor = ColorlnicialBotones
Commandl4.BackColor = ColorlnicialBotones
Command3.BackColor = ColorEnfoque
End Sub
Prívate Sub CuatroEntradas_Click()
Label2.Visible = True
Text4.Text="("
If Len(Text4.Text) < 50 Then
Text4.Width = 75 * Len(Text4.Text) + 200
Text4.Height = 215
Else
Text4.Height = 2 * 2 3 7
Text4.Width - 75 * 50 + 75 / 50 + 200
Endlf
Text4.Visible = True
Text3(0).Visible = True
Text2(0).Text = ""
Text2(0).Visible = True
LabelS.Caption = "Para cada combinación de las variables de entrada se ingresa el
valor correspondiente a la función de salida como se ve a continuación. Haga clic en
Siguiente."
Text2(0).SetFocus
Funcion.Enabled = False
Programa.Enabled = True
Teoria.Enabled = True
Commandl.Enabled = True
End Sub
Prívate Sub DiezEntradas_Click()
Beep
End Sub
Prívate Sub DosEntradas_Click()
Beep
End Sub
Prívate Sub Form_Load()
225
Commandl.BackColor = ColorlnicialBotones
Cornmandl4.BackColor = ColorlnicialBotones
Command2.BackColor = ColorlnicialBotones
CommandS.BackColor = ColorlnicialBotones
re(0) = "l"
re(l) = "0"
re(2) = "l"
re(3) = 'T'
re(4) = "O"
re(5) = "O"
re(6) = "l"
re(7) = "l"
re(8) = "l"
re(9) = "l"
re(10) = 'T'
re(12) = "0"
re(13) = "l"
re(14) = "0"
ce( 1,0) -"0000"
ce(2,0) = lt0010"
ce(4 í O)- M 0110"
ce(5, 0) = I10111"
ce(6,0) = fl 1000"
ce(7,0) = "1001"
ce(8,0) = lf1010n
ce(9,0) = "1101"
ce(l, 1) = "0000H
06(2,1) = " --------
ce(3, l) = "0010n
ce(4, 1) = "1000"
ce(5, 1) = " -------ce(7s l) = M0110n
ce(8, 1) = "1001H
ce(9, l) = "1010n
06(10,1) = " --------
ce(ll, l) = lf 01H 11
ce(12, 1)-"1101 M
ce( 1,2) = "00X0"
ce(2, 2) - "XOOO"
ce(3, 2) - "--------"
ce(5,2) = MOX10M
ce(6,2)-"X010"
ce(7s2) = M100X"
ce(8,2) = n10XO"
ce(9, 2) = " --------
'9 *£ tu = (17
'9 *£ t« = (£
..-u - (e
«•i, = (Z
OT í 8,, = (ü
«6 S8,, = fe
orr., = (r
,,9 ti, - te
,,e6ü., = fe
U-H^íü
,,8 40,, = (2
.,£l,. = (066)oui
no,, = (O 4
,,8,i = (O 4
i,¿,. = (O £
,.9,, = (O
«£,. = (O c£)oin
US,, = (O *
uOXOX» -
„ = (£ '
227
Tutor = O
MostrarTutorial
Commandl.Enabled - True
End Sub
Prívate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As
Single)
Commandl .BackColor = ColorlnicialBotones
Command2.BackColor = ColorlnicialBotones
CommandS.BackColor = ColorlnicialBotones
Commandl4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub Framel_MouseMove(Button As Integer., Shift As Integer, X As Single, Y
As Single)
Commandl. BackColor = ColorlnicialBotones
Command2.BackCoÍor = ColorlnicialBotones
Command3. BackColor = ColorlnicialBotones
Comrnandl4.BackColor = ColorlnicialBotones
End Sub
Prívate Sub lngresarMinterminos_Click()
Label2.Visible = True
Text4.Visible = True
Text4.Text = "( "
LabelS.Top = Text4,Top + Text4.Height
Label3.Caption = "En la parte superior de la pantalla de simplificación se encuentra
el Editor de Mintérminos; aquí se pueden ingresar los mintérminos separados por un
espacio. Haga clic en Siguiente"
LabeO.Left = Tutorial.Width / 2 - LabeO.Width / 2
DoEvents
Me.DrawWidth = 3
Tutorial.Line (Text4.Left + 100, Text4.Top + Text4.Height)-(Label3.Left,
LabelS.Top + Label3.Height / 2), LabeD.ForeColor
Funcion.Enabled = False
Programa. Enabled = True
Teoria.Enabled - True
Commandl.Enabled = True
End Sub
Prívate Sub NueveEntradas_Click()
Beep
End Sub
Prívate Sub OchoEntradas_Click()
Beep
End Sub
Prívate Sub Programa_Click()
Forml.Show
End Sub
Prívate Sub SeisEntradas_Click()
Beep
End Sub
Prívate Sub SieteEntradas_Click()
229
ANEXO B
MÉTODO DE SIMPLIFICACIÓN QUINE-MCCLUSKEY
Una función BOOLEANA se expresa en forma de tabla de combinaciones, como suma
de mintérminos y como producto de maxtérminos.
A B C lyiintértnirio Ma/t armiño
O O O
O O 1
O 1 O
1 1 O
A+B+C = Mo
A+B+C1 -M1
A+B'+C =M2
A+B'+C =M3
A+B+C =M4
A'+B+C1 =M5
A'+B'+C=M6
A'+B'+C'=M7
F<AJB,C>=2m(0,2,3,5,6)
MINTÉRMINOS.- Son los productos de las variables que se forma de la siguiente
manera:
Si la combinación tiene un cero se pone la variable complementada, si la combinación
tiene un uno se pone la variable directamente.
Por ejemplo.
La combinación Olí tiene como mintérmino al producto A'BC ya que A=O, B=l y
Oí.
La función booleana expresada como suma de mintérminos^ se expresa como una suma
230
de todos los mintérminos que tiene una salida igual a I. así en el caso de la tabla será.
F<A, B, 0=2X0,2, 3,5,6)
MAXTERMINOS.- Son las sumas las variables que se forman de la siguiente manera:
Si la combinación tiene un cero se pone la variable directamente mientras que si la
combinación tiene un 1, se pone la variable complementada.
Por ejemplo.
La combinación 011 tiene como maxtérmino a la suma de A+B*+C' ya que A=O, B=l
y 01.
La función booleana expresada como producto de maxtérminos, se expresa como un
producto de todos los maxtérminos que tiene una salida igual a 0. Así en el caso de la tabla
será.
F<A f B,0-IlM(U4,7)
231
LISTA DE MINTERMINOS
El punto de partida del método Quine-McCluskey es la lista de Mintérminos de una
función. Si la función no está en esta fonna se debe convertirla. Para explicar se toma la
función siguiente:
A B C D
0 0 0 0
0 0 0 1
i Un
U 1,
0 0
F
1
__
0
0 0 1 1
0
0
0
1
1 0 0
101
111
010
I O D O
I 0 0 1
ó
0
^
1 0 1 1
o
í
1 0 0
0
í
1
Jl 1 1 0
* • * * A• *1
1 I
TF
w
• 1'
1:
i
-frf>
¡..-i
í 0 1 1
A
mu
l-.-j
,
—.
i'l'i —
IT'
III U ;
'
m »:
'
mío!
•W"W»««»«"f~i««»»ni»««ífflp-
?B'Í
^""41
0
0
F < A,B*C,D > = Z m(0,2,3,6J,8,9JO,13)
La lista de mintérminos consiste en una tabla de combinaciones cuya salida tiene 1, en
el ejemplo los mintérminos que formarán parte de la tabla son /wft m2, m& m^ m7, /w& m^ mío,
m¡3.
232
minlirrtninu
A B i. n
mO
m2
m3
m6
m7
0000
0010
0011
0110
0111
mB
m9
mío
m!3
1000
1001
1010
1101
F
1
1
1
1
1
1
1
1
1
CUBOS O
En una tabla se agrupa todos los mintcrminos de acuerdo a la cantidad de unos que
contienen.
Por ejemplo.
Los mintérminos que tienen O unos es mintérmino mO.
Los que tienen / uno son los mintérminos m2 y tn8.
Los que tienen 2 unos son los mintérminos mB, m6t m9 y m/0.
Los que tienen 3 unos son los mintérminos m? y mi3.
No existen mintérminos con 4 unos.
Esta tabla se denomina tabla de CUBOS O
233
N" unos
minlrrmino
0
mO
0000
1
ni 2
m8
0010
1000
0011
0110
1001
1010
2
3
m3
m6
m9
mlO
m7
m!3
A B <: D
0111
1101
¥
1
1
1
1
1
1
1
1
1
CUBOS 1
Los CUBOS I se forman de la siguiente manera:
•
Se agrupa CUBOS O del primer grupo con CUBOS O del segundo grupo.
•
Se agrupa CUBOS O del segundo grupo con CUBOS O del tercer grupo.
•
Se agrupa CUBOS O del tercer grupo con CUBOS O del cuarto grupo.
•
Así sucesivamente hasta terminar de agrupar todos los CUBOS 0.
Se compara si ios dos CUBOS O que están siendo agrupados difieren en tina sola
posición, en cuyo caso el CUBO I será similar a los CUBOS O agrupados, pero en la posición
que cambia se pone una X.
A los CUBOS O que han sido agrupados y formaron un CUBO 1 se pone una señal
para especificar que si ha sido tomado en cuenta.
Por ejemplo.
234
Al comparar los cubos O m0 con m¡ forman el CUBO 1 00X0, ya que difieren
únicamente en la tercera posición, este nuevo CUBO 1 se denomina CUBO 1 (O, 2).
En los CUBOS O m0 y m2 se ponen las marcas para indicar que si han sido tomados en
cuenta.
Al comparar los CUBOS Om^y m¡3, forman el CUBO 1 (9,13) = 1X01 ya que difieren
únicamente en la segunda posición.
La siguiente tabla indica todo el proceso para el cálculo de los CUBOS /.
mintérmino
Min término Resultante
A B C D
mO
0000
m2
m8
0010
1 000
m3
m6
m9
rn 10
001 1
0110
1 00 1
1010
m7
m 13
0111
1101
mO, m2
00X0
mO, m8
xooo
ooox
m2,
m2,
m2,
m8,
m8,
m3
m6
m10
m9
m10
m3, m7
m6, m7
m9, m13
CUBOS 2
Los CUBOS 2 se forman de la siguiente manera:
0X1 O
X01 O
1 OOX
1 0X0
0X1 1
01 1 X
1 X01
235
- Agrupando dos CUBOS 1 de un grupo con los CUBOS I del siguiente grupo. En esta
caso el CUBO 1 (O, 2) se agrupa con el CUBO 1 (8, 10) para formar el CUBO 2 (O, 2, 8, 10) =
XOXO ya que cambia únicamente en la primera posición. En el siguiente gráfico se indica todo
el proceso para encontrar los CUBOS 2.
Mintérmino
CUBOS 1
mO, m2
00X0
mO, m8
000
m2, m3
m2, m6
m2, m10
m8, m9
m8, m10
•^
CUBOS 2
"5(0,2,8,10) X O X O
^^^^
ooox
~^^ ( 2, 3, 6, 7 )
0X10
X01 0
1OOX
1 0X0
0 X 1X
t."í
//
í í'
m3, m7
m6, m7
m9, m13
0X1 1
01 1 X
1 X01
w
/
/
^
Como se puede ver existen dos CUBOS 1 100X y 1X01 que no se combinaron para
formar CUBOS 2 por esta razón estas combinaciones formarán parte de los implicantes
primos.
236
IMPLICANTES PRIMOS
Los implicantes primos se forman con todos los cubos que no se agruparon con ningún
otro cubo para formar un cubo de mayor grado.
Por ejemplo:
Los implicantes primos son los ClIBOS 1 100X y 1X01, mientras que, como no se han
agrupado los CUBOS 2 para formar CUBOS 3 también todos los CUBOS 2 formarán parte de
los implicantes primos.
En el gráfico se indican todos los implicantes primos.
IMPLICANTES PRIMOS
(8,9)
(9,13)
(0,2,810)
(2,3,6,7)
100X
1X01
XOXO
OX1X
TABLA DE SIMPLIFICACIÓN
La tabla de simplificación sirve para simplificar mas los implicantes primos, ya que
algunos implicantes primos están contenidos en otros, para eso se construye una tabla, en la
que se pone una marca en cada celda que coincide con el implicante primo y el minténnino
que contiene. Por ejemplo el implicante primo OX1X contiene a los mintérminos m2, m3, mó,
m?. La tabla se indica en el siguiente gráfico.
237
TABLA DE SIMPLIFICACIÓN
0
2
3
6
7
1 OOX
1 XO 1
xoxo
0X1 X
8
9
*
*
1O 13
*
*
*
*
*
*
*
*
*
*
Basándose en esta tabla se calcula los implicantes primos esenciales de la siguiente
manera:
•
Buscamos la columna que tenga una sola marca.
•
El implicante primo que contiene esta marca es ya un implicante primo
esencial.
•
Se anulan todas las columnas que contienen marca en la fila correspondiente
de la marca encontrada en el primer paso.
•
Se repite este proceso hasta que ya no existan columnas con una sola marca
es decir hasta que ya no existan mas implicantes primos esenciales.
238
o
8
1O 13
1 OOX
1 XO 1
xoxo
0X1 X
ESCENCIALES
Como ya fueron tomados en cuenta todos los mintérminos, ya no existen implicantes
primos secundarios y la solución simplificada se formaran únicamente con los implicantes
primos esenciales.
XOXO ^B'D 5
OX1X -> A'C
1X01 -> BC'D
Entonces la solución será:
Y-B'D' + A'C + BC'D
Una vez encontrados todos los implicantes primos esenciales y si sobran columnas que no
han sido tomadas en cuenta se procede a calcular los implicantes primos secundarios de menor
239
costo para esto se sigue el siguiente procedimiento:
•
De los implicantes primos que no se han tomado como esenciales se cuenta
cual de estos tiene mayor cantidad de marcas que están en columnas no eliminadas.
•
Este implicante primo es un implicante primo secundario.
•
Se anulan todas las columnas que tienen una marca en la fila del implicante
primo tomado.
•
Se vuelve a repetir el proceso hasta que ya estén eliminadas todas las
columnas.
Esta es la tabla de simplificación para una función de 5 entradas que tiene implicantes
primos secundarios ya que el ejemplo anterior no tiene implicantes primos secundarios
TABLA DE SIMPLIFICACIÓN
•>,'
V
^J
%•
2j
3
nr
00X0 tX0101
1010X- ^
10X11101X1
0X0X1
X10X1
XX01X-
•u
1
|
3
|
í
5
|
f ""
"-j—
9
-—-
|
|
!
¡
jf
—^?>~ ~<5^~ —
i,/ •v/
i,
10
I
r)
r
*•
ii
!
l
í
j
e
J
"V
11
í
18
|
j
— f— • "~H
20 21 ?3 25 26 27
19
í
í
i
!
e
^j^fV
í>
í
—±—
~f— -f- ~t"
j
j
1
j
í
í
i
j
)
T
__ái
~^— -4-~
f ' "'fí ' %
\L
ES ENCIALES
XX0 1 X
i
-<r
í
i
j
¡
i
t
•
í
^1
*
i
i
f "i
V
i
í
I
!
i
t $• —
/
1
i
t
l<
~4
i
1:
SECUNDARIOS
.¿ /-í 4 ."v, •• y
* i í i | í A
f 'O1 S W V \1
10X11
Los implicantes primos esenciales y secundarios formaran la ecuación simplificada.
De los esenciales:
Quine HcCIuskey
MANUAL DE USUARIO.
Luis Eduardo López.
ESCUELA POLITÉCNICA NACIONAL.
CARRERA DE INGENIERÍA ELECTRÓNICA Y
TELECOMUNICACIONES.
2003
CONTENIDO.
Instalación del programa
3
Requerimientos Mínimos
3
Método de Instalación
3
Menú Principal
4
Fundamento Teórico
4
Tutorial
5
Iniciar Simplificación
5
Menú
5
Nuevo
6
Abrir
6
Guardar Como
7
Simplificar
7
Simplificación paso a paso
8
Simplificación paso anterior
8
Ingreso de datos en la tabla
8
Ingreso de mintérminos
9
Tabla de Mintérminos
9
Cubos O
9
Cubos n
10
Implicantes Primos
10
Tabla de Simplificación
10
Implicantes Primarios
10
Instalación del programa.
Requerimientos Mínimos.
Para instalar este programa se necesita los siguientes requerimientos mínimos:
-
Procesador PI.
-
24 MB de memoria RAM.
15MB de espacio disponible en el disco Duro.
-
Unidad de CD-Rom.
Método de Instalación.
Una vez comprobado que cumple con los requerimientos mínimos siga los
siguientes pasos:
1. Inserte el CD en la unidad de CD-ROM.
2. Ejecutar Setup.
3. Siga las instrucciones.
Menú Principal.
Cuando se ingresa al programa aparece el menú principal en el cual se puede
escoger entre FUNDAMENTO TEÓRICO, TUTORIAL, INICIAR SIMPLIFICACIÓN, Y
SALIR como se indica en la figura MI.
Fig. MI: Menú principal
Fundamento Teórico.
Explica el proceso de simplificación de una función booleana utilizando el método
de Quine-McCluskey como se indica en la figura M2.
Fig. M2: Comando para iniciar el fundamento Teórico.
Tutorial.
Hace una breve explicación de cómo utilizar el programa de simplificación de
funciones como se indica en la figura M3.
Fig. M3: Comando para ingresar al Tutorial
Iniciar simplificación.
Simplifica una función ingresando los datos ya sea en forma de tabla o en forma de
mintérminos, para luego simplificarla paso a paso o en forma directa.
Fig. M3: Comando para ingresar a la simplificación
Menú.
Permite Ingresar una función nueva, Abrir una función guardada, Guardar una
función, Simplificar, y salir como se indica en la figura M6.
M«.;Clusk(;y. Simplificación
Fig. M6: Menú de simplificación.
Nuevo.
Sirve para ingresar una función nueva ya sea como mintérminos o como una tabla
de salida.
Abrir.
Abre una función almacenada en disco esta función tiene extensión *.boo, esta
función contiene las salidas de todas las combinaciones como se indica en la figura M7.
unctón2.boo
unctón3,boo
unctón3b.boo
uncion4.boo
uncton4b.boo
uncjon5,boo
uncionSb.boo
Fig. M7: Ventana para escoger un archivo.
Guardar Como.
Guarda los datos de las salidas de cada combinación de una función en un archivo
con extensión *.boo como se Índica en la figura M8.
funcjon1Qb.boo
Íunción2boo
funcjon3.boQ
función3b.boo
func»n4.boo
funcion4b.boo
funcion5.boo
funcion5fa.boo
Fig. M8: Ventana para ingresar el nombre del archivo a ser guardado
Simplificar.
Esta opción sirve para obtener directamente la respuesta simplificada de la función
sin necesidad de hacer pausa en cada paso.
Esta opción es equivalente al comando finalizar de la pantalla de simplificación
como se indica en la figura M9.
Fig. M9: Comando para finalizar la simplificación.
Simplificación paso a paso.
Esta opción avanza al siguiente paso de la simplificación.
Esta opción es similar al comando siguiente en la ventana de la simplificación
como se indica en la figura MÍO.
Fig. MÍO: Comando para simplificar el siguiente paso.
Simplificar paso anterior.
Esta opción avanza al paso anterior de la simplificación.
Esta opción es similar al comando anterior en la ventana de la simplificación como
se indica en la figura Mil.
Anterior
Fig. Mil: Comando para simplificar el paso anterior.
Ingreso de datos en la tabla.
Despliega un submenu con el número de entradas que puede aceptar la
simplificación y luego despliega una tabla con todas las combinaciones
ingresar las salidas que corresponde a cada combinación.
permitiendo
Cuando se ha terminado de ingresar todas las salidas existentes presionamos enter
para que la tabla se complete automáticamente con ceros.
Mientras se ingresa cada salida de la función
el editor de los mintérminos se
actualiza automáticamente.
Ingreso de mintérminos.
Aquí nos permite ingresar directamente los mintérminos en el editor de
mintérminos.
Los mintérminos se ingresan separados por espacios y cuando ya se han ingresado
todos los mintérminos de la función se presiona enter para que se termine de actualizar
toda la tabla de salidas de la función.
Mientras se va escribiendo los mintérminos actualiza automáticamente la tabla de
salidas de la función y calcula automáticamente el número de variables de entrada según
los mintérminos ingresados.
Tabla de mintérminos.
Es la tabla de todas las combinaciones cuya salida son unos.
Cubos 0.
Es la tabla de cubos ceros es decir son todas las combinaciones que tienen coma
salida igual a 1 y además están ordenadas de acuerdo al numero de unos que tienen cada
una de las combinaciones.
10
Cubos n,
Son las tablas de combinaciones que se van formando en el proceso de
simplificación estas combinaciones tienen ceros unos y condiciones no importa que
corresponden a las variaciones entre una combinación y otra.
Implicantes Primos.
Es la tabla que contiene todos y cada uno de los cubos n que no se utilizaron para
formar cubos de mayor orden.
Tabla de Simplificación.
Es la tabla conformada por los mintérminos y los implicantes primos para poder
simplificar.
Implicantes Primarios.
Los implicantes primarios son los términos que necesariamente deben estar dentro
de la solución.
Implicantes Secundarios.
Los implicantes secundarios son términos adicionales con menor costo, que
también deben estar dentro de la solución.
Solución.
Es la expresión mas simplificada posible de la función booleana.
Descargar