Computadoras no compatibles con IBM PC. Computadoras compatibles con IBM PC

En este ensayo intentaremos explicar brevemente algunas de las características de las computadoras compatibles con IBM PC, y también introduciremos algunos conceptos básicos, a los que luego nos referiremos más de una vez.

Arquitectura abierta (principio de construcción modular en bloques)

El atractivo de las computadoras compatibles con IBM PC reside en su arquitectura abierta. Esto, en particular, significa que dichos ordenadores tienen un principio de construcción modular, es decir, sus componentes y bloques principales están fabricados en forma de módulos separados. Por lo tanto, instalar dispositivos nuevos o reemplazar los viejos incluidos en la computadora no es particularmente difícil. La mejora de dichos ordenadores está totalmente dentro de las capacidades de los propios usuarios.

Hay tres componentes principales en una computadora personal compatible con IBM PC: la unidad del sistema, el monitor y el teclado. La unidad del sistema contiene todos los componentes electrónicos principales de la computadora: fuente de alimentación, placa base (sistema) y unidades de almacenamiento (unidades de disco) con medios extraíbles o no extraíbles. El teclado es un dispositivo de entrada estándar que permite enviar ciertos caracteres o caracteres a la computadora.

señales de control. Un monitor (o pantalla) está diseñado para mostrar información monocromática o en color, simbólica o gráfica en su pantalla. Todos los componentes principales enumerados anteriormente están conectados entre sí mediante cables especiales con conectores.

El tipo de caja de la unidad del sistema depende, en particular, de las dimensiones y la ubicación de la placa base utilizada, la potencia mínima de la fuente de alimentación (es decir, la cantidad posible de dispositivos conectados) y la cantidad máxima de unidades instaladas. Las carcasas para computadoras vienen en versiones de torre y de escritorio. La principal diferencia entre estos tipos de casos puede considerarse el diferente número de espacios de instalación para los variadores y, en consecuencia, la potencia de la fuente de alimentación. Por cierto, los espacios de instalación (bahías de montaje) para unidades pueden ser de dos tipos: con acceso externo y con acceso interno. Así, por definición, el acceso a las unidades instaladas en compartimentos de montaje de este último tipo sólo se puede lograr con la cubierta de la caja de la unidad del sistema abierta. Estas ubicaciones de instalación solo se pueden utilizar para unidades con medios no extraíbles, como discos duros.

La placa base es la base de la computadora y es una lámina plana de laminado de fibra de vidrio sobre la que se ubican los principales elementos electrónicos: un microprocesador básico, RAM, un resonador de cuarzo y otros microcircuitos auxiliares.

De acuerdo con el principio de arquitectura abierta, la mayoría

Las computadoras compatibles con IBM PC tienen placas base que contienen solo los componentes principales y no hay elementos de comunicación, por ejemplo, con unidades, un monitor y otros dispositivos periféricos. en esto

En este caso, estos elementos faltantes se encuentran en placas de circuito impreso separadas, que se insertan en ranuras de expansión especiales previstas para este fin en la placa del sistema. Estas placas adicionales se denominan placas secundarias y la placa base se denomina placa base. Los dispositivos funcionales fabricados en placas secundarias a menudo se denominan controladores o adaptadores, y las propias placas secundarias se denominan tarjetas de expansión.

Microprocesadores y buses de sistema.

Las computadoras compatibles con IBM PC utilizan únicamente microprocesadores Intel o sus clones con una arquitectura similar.

El microprocesador está conectado a los dispositivos principales de la computadora a través del llamado bus del sistema. Este bus no sólo transmite información, sino que también se dirige a dispositivos e intercambia señales de servicios especiales. Como regla general, los dispositivos adicionales se conectan al bus del sistema a través de conectores de expansión.

Para conectar tarjetas de expansión en el bus del sistema de computadoras basadas en el microprocesador i8088 (IBM PC e IBM PC/XT), se utilizan conectores de 62 pines. En particular, este bus del sistema incluye 8 líneas de datos y 20 líneas de direcciones, que limitan el espacio de direcciones de la computadora a un límite de

1MB. Por primera vez, las computadoras PC/AT286 comenzaron a utilizar el nuevo bus de sistema ISA (Industry Standard Architecture), a través del cual era posible transmitir 16 bits de datos en paralelo y, gracias a 24 líneas de dirección, acceder directamente a 16 MB de sistema. memoria. Este bus del sistema se diferencia del anterior por la presencia de un conector adicional de 36 pines para las tarjetas de expansión correspondientes. Las computadoras basadas en microprocesadores i80386/486 comenzaron a utilizar buses especiales para la memoria, lo que permitió aprovechar al máximo su velocidad. Sin embargo, algunos dispositivos conectados a través de los conectores de expansión del bus del sistema no pueden alcanzar una velocidad de transferencia comparable a la de un microprocesador. Se trata principalmente de trabajar con controladores de almacenamiento y adaptadores de vídeo. Para solucionar este problema se empezaron a utilizar los llamados buses locales, que conectan directamente el microprocesador con los controladores de estos dispositivos periféricos. Actualmente, se conocen dos buses locales estándar: VL-bus (VESA Local-bus) y PCI (Peripheral Component Interconnect). Para conectar dispositivos a dichos buses, existen conectores especiales en la placa base de la computadora.

Puertos, interrupciones, acceso directo a memoria.

El microprocesador considera todos los dispositivos en el bus del sistema como memoria direccionable o como puertos de E/S. En términos generales, un puerto se refiere a un determinado circuito de interfaz, que normalmente incluye uno o más registros de entrada/salida (celdas de memoria especiales).

El microprocesador puede aprender sobre la ocurrencia de un determinado evento mediante una señal llamada interrupción. En este caso, la ejecución de la secuencia actual de comandos se suspende (interrumpe) y en su lugar comienza a ejecutarse otra secuencia correspondiente a esta interrupción. Las interrupciones generalmente se dividen en hardware, lógicas y software.

Las interrupciones de hardware (IRQ) se transmiten a través de líneas especiales en el bus del sistema y están asociadas con solicitudes de dispositivos externos (por ejemplo, presionar una tecla en un teclado). Las interrupciones lógicas ocurren durante el funcionamiento del microprocesador (por ejemplo, división por cero), y las interrupciones de software son iniciadas por el programa en ejecución y generalmente se usan para llamar a subrutinas especiales.

Las primeras PC de IBM utilizaron el chip Controlador de interrupciones i8259, que tiene ocho entradas de interrupción (IRQ0-IRQ7). Como es sabido, al mismo tiempo el microprocesador sólo puede atender un evento y en la selección de este evento le ayuda el controlador de interrupciones, que establece un cierto nivel de importancia para cada una de sus entradas: prioridad. La prioridad más alta es la línea de solicitud de interrupción IRQ0 y la más baja es IRQ7, es decir, la prioridad disminuye en orden ascendente del número de línea. En IBM PC/AT, ocho líneas de interrupción ya no eran suficientes y su número se aumentó a 15. En los primeros modelos se utilizaba para ello la conexión en cascada de dos chips i8259. Se realizó conectando la salida del segundo controlador a la entrada IRQ2 del primero.

Es importante comprender lo siguiente aquí. Las líneas de interrupción IRQ8 - IRQ15 (es decir, las entradas del segundo controlador) tienen una prioridad menor que IRQ1, pero mayor que IRQ3.

En el modo de acceso directo (DMA, Direct Memory Access), el dispositivo periférico se comunica con la RAM directamente y no a través de los registros internos del microprocesador. Esta transferencia de datos es más eficaz en situaciones en las que se requiere un tipo de cambio elevado para una gran cantidad de información. Para iniciar el proceso de acceso directo se utilizan señales adecuadas en el bus del sistema.

En ordenadores compatibles con IBM PC y PC/XT, se utiliza un chip DMA i8237 de 4 canales para organizar el acceso directo a la memoria, cuyo canal 0 está destinado a la regeneración dinámica de la memoria. Los canales 2 y 3 se utilizan para controlar la transferencia de datos de alta velocidad entre unidades de disquete, disco duro y RAM, respectivamente.

Las computadoras compatibles con IBM PC/AT tienen 7 canales de acceso directo a la memoria. En los primeros ordenadores esto se lograba conectando en cascada dos chips i8237, como en el caso de los controladores de interrupción.

memoria de la computadora

Todas las computadoras personales utilizan tres tipos de memoria: RAM, memoria permanente y memoria externa (varios dispositivos de almacenamiento). La RAM está diseñada para almacenar información variable, ya que permite que su contenido cambie a medida que el microprocesador realiza las operaciones correspondientes. Dado que se puede acceder a una celda seleccionada aleatoriamente en cualquier momento, este tipo de memoria también se llama memoria de acceso aleatorio - RAM (Memoria de acceso aleatorio).

Todos los programas, incluidos los de juegos, se ejecutan en la RAM. La memoria permanente suele contener información que no debería cambiar durante mucho tiempo. La memoria permanente tiene su propio nombre: ROM (Read Only Memory), lo que indica que solo proporciona modos de lectura y almacenamiento.

Organización lógica de la memoria.

Como sabes, el microprocesador i8088 utilizado en el PC IBM, PC/XT, a través de sus 20 buses de direcciones, proporciona acceso a sólo 1 MB de espacio de memoria. Los primeros 640 KB de espacio direccionable en las computadoras compatibles con IBM PC generalmente se denominan memoria convencional. Los 384 KB restantes están reservados para uso del sistema y se denominan memoria en direcciones superiores (UMB, Upper Memory Blocks, High DOS Memory o UM Area - UMA). Esta área de memoria está reservada para la ubicación de la ROM BIOS (Read Only Memory) del sistema. Basic Input Output System), para memoria de vídeo y memoria ROM de adaptadores adicionales.

Memoria adicional (ampliada)

En casi todos los ordenadores personales, el área de memoria UMB rara vez está completamente llena. Como regla general, el área de expansión de la ROM BIOS del sistema o parte de la memoria de video y las áreas para módulos ROM adicionales están vacías. Ésta es la base de la especificación de memoria adicional EMS (Especificación de memoria expandida), desarrollada por primera vez por Lotus Development, Intel y Microsoft (por lo que a veces se la denomina especificación LIM). Esta especificación permite el uso de RAM más allá de los 640 KB estándar para programas de aplicación. El principio de utilizar memoria adicional se basa en cambiar bloques de memoria (páginas). En el área UMB, entre el búfer de video y el BIOS RGM del sistema, se asigna una "ventana" de 64 KB no asignada, que se divide en páginas. El software y el hardware permiten asignar cualquier segmento de memoria adicional a cualquiera de las páginas "window(TM)" asignadas. Aunque el microprocesador siempre accede a los datos almacenados en la "ventana" (dirección inferior a 1 MB), las direcciones de estos datos. se puede compensar en memoria adicional con respecto a "ventanas" de varios megabytes (ver Fig. 1).

La arquitectura de las computadoras IBM PC se basa en el principio de organización del bus de conexiones entre el procesador y otros componentes de la computadora. Aunque desde entonces los tipos de autobuses utilizados y su estructura han cambiado varias veces, la arquitectura, principio básico de la organización interna de la computadora, se ha mantenido sin cambios. La estructura de la computadora se muestra en el siguiente diagrama.

La unidad central de procesamiento (CPU) es el núcleo de un sistema informático. La comunicación con otros componentes se realiza a través del bus del procesador externo. Dentro del procesador hay buses para la interacción entre la ALU, los dispositivos de control y los registros de memoria. El bus externo del procesador consta de líneas que transportan datos, direcciones (que indican de dónde provienen los datos y adónde se envían) y comandos de control. Por tanto, el bus común se divide en un bus de datos, un bus de direcciones y un bus de control. Cada línea puede transportar un bit de datos, dirección o comando de control.

El número de líneas del autobús se llama ancho del autobús. El ancho del bus determina el número máximo de bits transmitidos simultáneamente, lo que a su vez determina el rendimiento general de la computadora. Es decir, cuanto mayor sea el ancho del bus, más datos se podrán transmitir simultáneamente y mayor será el rendimiento. El segundo parámetro que afecta el rendimiento es la velocidad de transferencia de datos del bus, que está determinada por la velocidad del reloj del bus.

La frecuencia del bus es una característica bastante importante, pero aún no determina el rendimiento de la computadora. Los parámetros más importantes para el rendimiento general de una computadora son la velocidad del reloj y la profundidad de bits del procesador central. Y esto es natural por muchas razones. Es el procesador el que realiza las principales tareas de procesamiento de datos y, a menudo, inicia y gestiona el intercambio de datos. La frecuencia del reloj determina la velocidad de las operaciones y la profundidad de bits determina la cantidad de datos procesados ​​durante una operación.

Pregunta 20: Sistema de elementos estructurales de una computadora personal. Factores de forma. Computadora ter

(Computadora en inglés, - "calculadora"): un dispositivo o sistema capaz de realizar una secuencia de operaciones variable, claramente definida y determinada. En la mayoría de los casos se trata de operaciones de cálculos numéricos y manipulación de datos, aunque esto también incluye operaciones de entrada y salida.Una descripción de una secuencia de operaciones se llama programa. computadora electrónica,

computadora- un conjunto de medios técnicos, donde los principales elementos funcionales (lógicos, almacenamiento, visualización, etc.) se realizan sobre elementos electrónicos destinados al procesamiento automático de información en el proceso de resolución de problemas computacionales y de información. , Personal computadora ordenador personal(computadora electrónica personal) es una microcomputadora de escritorio que tiene las características operativas de un electrodoméstico y funcionalidad universal.

Factor de forma( del ingles factor de forma) es un estándar que especifica las dimensiones generales de un producto técnico, además de describir conjuntos adicionales de sus parámetros técnicos, por ejemplo, forma, tipos de elementos adicionales colocados dentro/sobre el dispositivo, su posición y orientación.

El factor de forma (como cualquier otro estándar) es de naturaleza consultiva.

La especificación del factor de forma define los componentes requeridos y opcionales. Sin embargo, la gran mayoría de fabricantes prefieren cumplir con la especificación, ya que el precio del cumplimiento de los estándares existentes es la compatibilidad de la placa base y los equipos estandarizados (periféricos, tarjetas de expansión) de otros fabricantes en el futuro.

Una computadora electrónica implica el uso de componentes electrónicos como unidades funcionales, sin embargo, una computadora puede diseñarse según otros principios: puede ser mecánica, biológica, óptica, cuántica, etc. (más detalles: Clases de computadoras Por tipo de entorno de trabajo ), trabajando debido al movimiento de piezas mecánicas, el movimiento de electrones, fotones o los efectos de otros fenómenos físicos.

Además, según el tipo de funcionamiento, una computadora puede ser digital (DVM) y analógica (ABM).

Por otro lado, el término “computadora” implica la posibilidad de cambiar el programa que se está ejecutando (reprogramación). Muchas computadoras electrónicas pueden realizar una secuencia de operaciones estrictamente definida, contener dispositivos de entrada y salida o constar de elementos estructurales similares a los utilizados en una computadora electrónica (por ejemplo, registros), pero no son reprogramables.*

Características de diseño

Las computadoras modernas utilizan toda la gama de soluciones de diseño desarrolladas durante todo el período de desarrollo de la tecnología informática. Estas soluciones, por regla general, no dependen de la implementación física de las computadoras, sino que son en sí mismas la base en la que se basan los desarrolladores. A continuación se detallan los problemas más importantes que enfrentan los creadores de computadoras:

Una decisión fundamental a la hora de diseñar un ordenador es la elección de si será un sistema digital o analógico. Si las computadoras digitales funcionan con variables numéricas o simbólicas discretas, las analógicas están diseñadas para procesar flujos continuos de datos entrantes.

Hoy en día, los ordenadores digitales tienen una gama mucho más amplia de aplicaciones, aunque sus homólogos analógicos todavía se utilizan para algunos fines especiales. También cabe mencionar que aquí son posibles otros enfoques, utilizados, por ejemplo, en computación pulsada y cuántica, pero por ahora se trata de soluciones altamente especializadas o experimentales.

Ejemplos de computadoras analógicas, desde simples hasta complejas, son: nomograma, regla de cálculo, astrolabio, osciloscopio, televisión, procesador de sonido analógico, piloto automático, cerebro.

Entre las calculadoras discretas más simples se conoce el ábaco o ábaco ordinario;

El más complejo de este tipo de sistemas es una supercomputadora.

sistema numérico

Un ejemplo de computadora basada en el sistema numérico decimal es la primera computadora estadounidense, la Mark I.

El paso más importante en el desarrollo de la tecnología informática fue la transición a la representación interna de números en forma binaria. Esto ha simplificado enormemente el diseño de dispositivos informáticos y equipos periféricos. Tomar como base el sistema numérico binario hizo posible implementar de manera más simple funciones aritméticas y operaciones lógicas.

Sin embargo, la transición a la lógica binaria no fue un proceso instantáneo e incondicional. Muchos diseñadores intentaron desarrollar computadoras basadas en el sistema numérico decimal, que es más familiar para los humanos. También se utilizaron otras soluciones de diseño. Así, una de las primeras máquinas soviéticas trabajaba sobre la base del sistema numérico ternario, cuyo uso es, en muchos aspectos, más rentable y conveniente en comparación con el sistema binario (el proyecto de computadora ternaria Setun fue desarrollado e implementado por el talentoso ingeniero soviético N.P.Brusentsov).

Bajo la dirección del académico Ya. A. Khetagurov, se desarrolló un “microprocesador altamente confiable y seguro de un sistema de codificación no binario para dispositivos en tiempo real”, utilizando un sistema de codificación 1 de 4 con un cero activo.

Al realizar cálculos, a menudo es necesario guardar datos intermedios para su uso posterior.

El rendimiento de muchas computadoras está determinado en gran medida por la velocidad con la que pueden leer y escribir valores en (desde) la memoria de su capacidad total. Inicialmente, la memoria de la computadora se usaba solo para almacenar valores intermedios, pero pronto se propuso que el código del programa se almacenara en la misma memoria (arquitectura von Neumann, también conocida como arquitectura "Princeton") que los datos. Esta solución se utiliza en la mayoría de los sistemas informáticos actuales. Sin embargo, para los controladores de control (microcomputadoras) y procesadores de señales, resultó más conveniente un esquema en el que los datos y programas se almacenan en diferentes secciones de la memoria (arquitectura Harvard).

    La parte principal de la PC, que incluye:

    dispositivos electrónicos que controlan el funcionamiento de la PC (incluido el “procesador central”, “coprocesador”, “RAM”, “controladores” (“adaptadores”), “bus”);

    una fuente de alimentación que convierte la tensión de red alterna en tensión continua del valor bajo requerido y la suministra a circuitos electrónicos y otros componentes de PC;

Dispositivos de memoria externa diseñados para escribir y leer programas y datos y que constan de una unidad de disco magnético duro (HDD) y una o dos unidades de disquete (FMD).

El diseño de la unidad del sistema de PC consta de una carcasa, varias placas electrónicas (principalmente el "sistema" o "placa base"), conectores estandarizados (ranuras), cables de conexión flexibles de varios núcleos, un interruptor de encendido y una pequeña cantidad de interruptores ( botones) para controlar los modos de funcionamiento del PC.

    La caja de la unidad del sistema de PC está disponible en las siguientes variantes:

    Horizontal (escritorio), incl. en su versión reducida (Mini-footprint, Slimline) y de pequeño tamaño (Ultra-slimline);

    Vertical (“torre”), incl. en su forma ampliada, adecuada para instalación en el suelo - "Big Tower", de tamaño pequeño - "Small Tower" y en versión mediana - "Medium Tower";

“Todo en uno”: escritorio con unidad de sistema y monitor combinados en un solo estuche;

    Portátil o portátil, que incluye varias opciones diferentes, incluidas "rodillera" y "bloc de notas" (ver - Computadora portátil o de bolsillo). En estos casos, la caja de la unidad del sistema también incluye un monitor, teclado, trackball y, en algunos modelos, una unidad de CD-ROM.

    error de memoria al escribir resultados

Hoy en día, casi no existen procesadores con ejecución secuencial de instrucciones; han sido reemplazados por procesadores con ejecución paralela de instrucciones que, en igualdad de condiciones, proporcionan un mayor rendimiento.

El procesador más simple con ejecución paralela de instrucciones es un procesador con una canalización de instrucciones. Un procesador de canalización de instrucciones se puede derivar de un procesador secuencial haciendo que cada etapa del ciclo de instrucción sea independiente de las etapas anteriores y posteriores.

Para ello, los resultados de cada etapa, excepto la última, se almacenan en elementos auxiliares de memoria (registros) ubicados entre las etapas:

El resultado de la búsqueda (el comando codificado) se almacena en un registro ubicado entre las etapas de búsqueda y decodificación.

El resultado de la decodificación (el tipo de operación, los valores de los operandos, la dirección del resultado) se almacenan en registros entre las etapas de decodificación y ejecución.

Los resultados de la ejecución (el nuevo valor del contador del programa para un salto condicional, el resultado de una operación aritmética calculada en la ALU, etc.) se almacenan en registros entre las etapas de ejecución y la escritura de los resultados.

En la última etapa, los resultados ya están escritos en los registros y/o en la memoria, por lo que no se necesitan registros auxiliares.

interrupción vectorial

El primer paso es determinar exactamente para qué tareas se utilizará su futura unidad del sistema. Si planea comprar equipos de juego, se debe prestar especial atención a la tarjeta de video, y para una estación de trabajo gráfica, la potencia del procesador y la cantidad de RAM juegan un papel fundamental. Los menos exigentes en cuanto a rendimiento son los sistemas de oficina. Ni siquiera necesitas agregar una tarjeta de video externa, porque la incorporada será suficiente.

Primero necesitas seleccionar un procesador. Este elemento afecta al rendimiento general de todo el sistema, y ​​cuantos más núcleos haya (y mayor sea su frecuencia de funcionamiento), más rápido se realizarán las operaciones.

A continuación, el configurador de PC le ayudará a seleccionar una placa base. Debe ser compatible con la CPU y admitir RAM de la frecuencia requerida. Preste atención a la presencia de todas las ranuras y conectores necesarios, así como al tamaño de la propia placa base (ATX, micro ATX, mini ATX, etc.). Por lo general, cualquiera de ellos ya tiene una tarjeta de red y de sonido integrada. El creador del sitio web de la tienda en línea seleccionará automáticamente las opciones adecuadas después de seleccionar un procesador y excluirá aquellas que no sean adecuadas.

La configuración de una potente computadora para juegos incluye un sistema de enfriamiento adicional, que se selecciona automáticamente, según el procesador seleccionado.

Todo lo que queda es montar todo en el estuche. Puede ser muy simple y directo si planeas instalar la unidad del sistema debajo de la mesa, donde nadie la verá, o puede tener iluminación de neón y una ventana en el costado que te permita observar el funcionamiento del sistema (juegos). opciones). Esto es una cuestión de gustos, pero tenga en cuenta que la carcasa de una PC para juegos debe ser espaciosa y tener buena ventilación para que los componentes no se sobrecalienten durante las cargas máximas.

¿Tiene dificultades?
Para comodidad de los clientes, es posible enviar la configuración resultante para su impresión. Y si surgen dificultades, entonces conviene contar con la ayuda de nuestro ingeniero, quien le indicará qué componentes es mejor utilizar para obtener las características técnicas óptimas.

Al decidir construir una computadora con nosotros, obtienes los mejores precios y servicio. Garantizamos una entrega rápida pero cuidadosa de su unidad de sistema.

Con el soporte para el funcionamiento de una tarjeta SD, surgieron dos grandes preguntas a la vez: el soporte de hardware para el bus SPI y el protocolo para interactuar con la tarjeta misma.

En principio, SPI se puede implementar completamente en software, pero quería divertirme también con el hardware, así que heroicamente me propuse dibujar un transceptor de bytes en el diseño del circuito. Para mi sorpresa, no tenía nada de complicado y muy pronto ya estaba observando en la pantalla del osciloscopio paquetes de 8 bits que se ejecutaban rápidamente y que contenían exactamente lo que quería. Por cierto, aquí aprecié por primera vez la capacidad del nuevo osciloscopio no sólo de mostrar un montón de señales, sino también de combinarlas lógicamente en el bus correspondiente. Es mucho más agradable ver que el osciloscopio entiende que se está transmitiendo el byte A5, en lugar de comprobar manualmente si las transiciones de 0 a 1 y viceversa están en los lugares correctos.

Dado que en ese momento solo se leía durante la lectura solo el sector 0, el cargador de arranque (ubicado exactamente en este sector) no encontró el sistema operativo para arrancar, lo cual informó. Pero esto son nimiedades: lo principal es que mi circuito poco a poco comenzó a convertirse en una computadora real e incluso estaba intentando arrancar.

Luego vino la lucha por convertir sectores físicos en bloques lógicos. Aquí también estaba aprovechando y en lugar de definir los parámetros (imagen) del disco, simplemente codifiqué los números para una instancia específica de la imagen. Tuve que retocar esta parte; por alguna razón, los cálculos arrojaron resultados completamente inesperados (en general, nunca me gustó la aritmética en lenguaje ensamblador). Sin embargo, después de un poco de tormento, los sectores físicos/cilindros/cabezas comenzaron a traducirse regularmente en bloques lógicos, y llegó el momento de intentar arrancar en serio.

Naturalmente, la descarga no se realizó de inmediato y no me lo esperaba. Sabiendo de antemano que muchas funciones no estaban implementadas en mi BIOS, puse resguardos en todas las interrupciones, y cuando accedí a una función no implementada, se mostró toda la información necesaria en la pantalla: qué interrupción se estaba llamando y qué argumentos se estaban usando. usado. Luego vino el proceso de escribir un controlador para la función correspondiente (y aún más a menudo, solo un código auxiliar temporal), y el proceso continuó. De repente, todo se detuvo en una función que estaba completamente ausente en la PC original: una de las funciones INT 2F relacionadas con el procesamiento de eventos. Vi que DOS determina el tipo de PC, y parece que no debería causar interrupciones que no están presentes en este tipo, pero, sin embargo, esto sucedió y el proceso se detuvo. Un simple código auxiliar no ayudó y, en principio, no quería implementar toda la función.

Ahora no recuerdo toda la línea de pensamiento (miré muchas cosas en ese momento en el código fuente de DOS y durante el proceso de arranque), pero una vez más en este "congelamiento" decidí llamar a un montón de interrupciones. (en ese momento tenía el cronómetro desactivado en INT 08h) y presioné la tecla Shift. De repente ocurrió un milagro:

Para ser honesto, me invadieron muchas emociones: pasar de una placa con un par de microcircuitos a cargar DOS en un mes, e incluso en ráfagas cortas (debido a la falta crónica de tiempo) parece bastante bueno (perdón por alardear). )!

Por cierto, con este mensaje todavía me queda un misterio sin resolver. El caso es que después de finalizar la interrupción del temporizador, DOS comenzó a cargarse sin congelarse en este lugar, pero por alguna razón no se muestra el mensaje de copyright de Microsoft. Parece que tampoco aparece en una computadora real (desafortunadamente, no hay nada que probar). Cuál es la causa fundamental aquí es un misterio envuelto en oscuridad. Intenté entender la lógica de los códigos fuente de DOS, pero no la vi de inmediato y no quería perder mucho tiempo. Sin embargo, la pregunta sigue siendo persistente...

Una vez iniciado DOS, llegó el turno de iniciar otros programas. Probablemente puedas adivinar a quién le tocó primero; naturalmente, como dicen, el bueno de Norton Commander. Curiosamente, hubo mucho más revuelo con él que con DOS. NC invocaba una gran cantidad de funciones cuando se iniciaba y, en algunos casos, no era posible arreglárselas con códigos auxiliares simples, era necesario escribir al menos un mínimo de funcionalidad;

Sin embargo, los problemas eran más cuantitativos que cualitativos y pronto fue posible llevar el proceso de carga NC a su conclusión lógica:

Esta “interesante” apariencia se debe a varios motivos:
- el adaptador de video no admitía atributos en ese momento
- No tenía la segunda parte del generador de caracteres, que contiene pseudográficos, por lo que los caracteres de la parte inferior de la tabla de códigos terminaron en los lugares apropiados.
- algunas funciones de INT 10h no fueron implementadas.

En general, periódicamente me sorprendía cómo se implementaban ciertas funciones en varios programas (e incluso en DOS). Por ejemplo, el comando CLS (borrar pantalla) llamó a la función INT 10h, lo que hizo que la ventana se moviera hacia arriba. En este caso, toda el área de pantalla disponible se especificó como ventana y se desplazó una cantidad de líneas igual a la cantidad de líneas en la pantalla. Como no esperaba que nadie usara las funciones de ventana, no tenía prisa por implementarlas. El resultado fue obvio (o mejor dicho, en la pantalla). Sin embargo, volveremos un poco más sobre las rarezas de algunos programas...

Después de lanzar NC, tuve un deseo natural de darle una forma divina. Además, esta parte del trabajo a veces resulta incluso más agradable que intentar poner en marcha un dispositivo completamente muerto. No hubo problemas especiales con los pseudográficos, solo pasé mucho tiempo dibujando caracteres manualmente (tenía un generador de caracteres directamente en forma de código VHDL). Pero con los atributos tuve que esforzarme un poco.

Incluso antes en el proceso, comencé a utilizar algunos elementos de VHDL. Al principio, casi a la fuerza, todavía existía el deseo de intentar dominar este lenguaje nuevamente, y luego porque en ciertos casos resultó ser más conveniente que usar el diseño de circuitos. Incluso en el propio adaptador de video, tuve que profundizar en el código: inicialmente se admitían 43 (o algo así) líneas, pero necesitaba cambiarlo a 25 líneas. Y al principio intenté admitir atributos mediante diseño esquemático, pero de repente comencé a darme cuenta de que podría ser más fácil usar VHDL para esto. Naturalmente, todo se movió con gran dificultad y el uso de las construcciones de lenguaje más simples, pero de repente comencé a comprender la esencia de VHDL, todavía un poco, pero ya lo suficiente como para comenzar a crear conscientemente algo con él, y no solo modificar lo que ya existe. .

Mis retoques con VHDL no fueron en vano, y después de un tiempo pude ver algo muy conocido hace mucho tiempo:

Sí, todavía se podían notar algunas deficiencias (como un atributo desplazado en un carácter), pero en general el modo de texto en color de 80x25 funcionó como debería.

El siguiente en la fila fue el controlador de interrupciones 8259. Al principio surgió la idea de intentar utilizar uno existente de algún proyecto, pero no me gustó ninguno por varias razones (o eran demasiado primitivos o, por el contrario, No entendí cómo funcionan, pero no había documentación). Incluso hubo un intento de comprar una propiedad intelectual comercial (en este caso, la propiedad intelectual no es un protocolo de Internet, sino propiedad intelectual), pero los fabricantes no quisieron molestarse en vender una cosa entera...

Al final, tuve que tomar una hoja de papel y esbozar algo así como un diagrama de controlador (de bloques), que luego comencé a implementar en VHDL. No busqué compatibilidad total: necesitaba (en esta etapa) soporte para un modo de interrupción de prioridad principal, la capacidad de enmascarar interrupciones (también leer la máscara de interrupción) y ejecutar el comando EOI (End Of Interrupt). En mi opinión, esto debería ser suficiente para que la gran mayoría de programas funcionen bien con él. De cara al futuro, diré que hasta el día de hoy no he encontrado un solo programa que intente hacer algo con el controlador de interrupciones más allá de la funcionalidad que había diseñado.

Probablemente, el controlador de interrupciones fue mi primer proyecto VHDL real (aunque pequeño), de principio a fin. Lo escribí con cuidado, no me dio pereza (nuevamente por primera vez en mi vida) hacer un banco de pruebas (no estoy seguro de cómo traducirlo correctamente al ruso; de hecho, una secuencia de señales para verificar el correcto funcionamiento). del dispositivo). La simulación en el simulador ModelSim mostró que el controlador parecía estar en pleno funcionamiento, después de lo cual se generó otro símbolo gráfico y se agregó a mi dispositivo.

Todavía no tenía un temporizador 8254 normal; para generar interrupciones de 18,2 Hz, usé un contador normal, que conecté al controlador de interrupciones. El comportamiento de la computadora mostró que todo parecía estar funcionando: DOS se cargó sin necesidad de presionar una tecla y el reloj finalmente comenzó a funcionar en NC. Parecía que se había superado otra etapa y podíamos seguir adelante con seguridad.

Al final resultó que, me alegré desde el principio; en ese momento, quizás se descubrió el mayor problema de todo el proyecto. Si alguien recuerda, NC tiene un protector de pantalla incorporado: "cielo estrellado". Después de dejar mi computadora por un tiempo, después de regresar a ella, descubrí que las estrellas en el protector de pantalla de alguna manera se habían congelado, en otras palabras, la computadora se había congelado. Aunque entiendo que este tipo de accidentes no ocurren, todavía quería creer en un milagro: que se trataba de un incidente aislado. Desafortunadamente, como siempre, no ocurrió ningún milagro: después de un reinicio y un reinicio completo, la computadora se congeló nuevamente después de aproximadamente una hora de funcionamiento. Quedó inequívocamente claro que había un problema en alguna parte, y uno muy difícil de encontrar.

Para limitar la búsqueda tanto como sea posible, escribí una prueba de memoria simple que se ejecutó inmediatamente después de reiniciar el procesador, sin inicializar todos los dispositivos innecesarios, como un temporizador, etc. En principio, recibí con alivio la indicación de error de memoria; al menos el problema estaba claramente en el hardware. Lo único que queda por hacer es entender exactamente dónde. Y esto resultó no ser nada sencillo.
El hecho es que, en general, el circuito involucrado en el proceso de prueba de la memoria es inherentemente bastante primitivo. Se trata de un mínimo de lógica; aparte del procesador, no existen otros elementos programables complejos. Como resultado, después de pasar algún tiempo analizando los circuitos, me sentí más o menos seguro de que el problema no era un error fundamental en el circuito, sino algo más aleatorio, por ejemplo, una interferencia.

En general, todo estuvo mal en este lado del diseño del circuito. Sabía que necesitaba instalar más condensadores de bloqueo y que los cables largos estaban algo malos. Aquí terminó mi conocimiento. Por lo tanto, volví a acudir a uno de los foros profesionales en busca de consejo. Me dieron muchos consejos, a veces era difícil separar los consejos realmente sensatos de los que aconsejaban según el principio "Te contaré todo lo que sé al menos un poco sobre este tema". No describiré todo esto aquí; se ha discutido demasiado, por lo que este puede ser el tema de un artículo aparte. Como resultado de las discusiones, mi placa se llenó de casi dos docenas de condensadores de bloqueo y perdió por completo su apariencia original, más o menos glamorosa.

Desafortunadamente, la siguiente prueba demostró que el problema no había desaparecido. Quizás comenzó a aparecer con un poco menos de frecuencia, pero es difícil decirlo, y antes, el fallo podía ocurrir después de 20 a 30 minutos o después de unas horas. Ahora, como mínimo, una placa que se dejaba durante la noche tenía garantizado que fallaría a la mañana siguiente. Desesperado, volví nuevamente al análisis del diseño del circuito y a un estudio aún más detenido de los diagramas del bus del procesador. En un momento tuve una idea determinada y volví al mismo foro. Durante la discusión de mi idea, una vez más recibí algunos consejos útiles (y a veces no tan útiles), intenté implementar algunas cosas (principalmente relacionadas con un ligero retraso en algunas señales de control), pero esto no afectó la presencia de fracasos en absoluto.

Al final del camino, claramente se vislumbraba un callejón sin salida de concreto, así que comencé a probar ideas generalmente locas. En particular, ¿está fallando el chip de memoria? Para probarlo, generé un módulo RAM dentro de la FPGA, que usé en lugar de memoria externa. Para ser honesto, no esperaba ningún resultado, simplemente hice todo lo que se me ocurrió. ¡Pero imagina mi sorpresa cuando después de esto los accidentes desaparecieron repentinamente! En general, de alguna manera ni siquiera estaba preparado para esto, por lo que no entendía muy bien cómo utilizar este conocimiento. Incluso en ese momento era difícil creer que el chip de memoria estuviera defectuoso. También estaba casi completamente seguro de que estaba trabajando correctamente con este microcircuito; según las señales de control, todo era tan simple como pelar peras. Pero el hecho es que con el microcircuito se garantizaba que se produciría un fallo a más tardar después de unas horas de pruebas; con la memoria interna todo funcionó sin fallos durante varios días hasta que me cansé.

Para limpiar mi conciencia, decidí probar la memoria con un circuito completamente diferente, sin usar la placa de mi procesador. Mientras pensaba en la mejor manera de hacer esto, de repente se me ocurrió una idea: me di cuenta de la única diferencia significativa entre usar la memoria interna y la externa. El hecho es que la memoria externa era asíncrona y la memoria interna era parcialmente síncrona, y además requería una señal que bloqueara la dirección de la celda a la que se accedía en el búfer interno.
No entendía en absoluto cómo esto podría relacionarse con el problema de las fallas aleatorias; de todos los diagramas estaba absolutamente claro que mi dirección contenía mucho más que el mínimo requerido para la memoria, por lo que, en teoría, esta no podría ser la razón. . Sin embargo, inmediatamente dibujé otro registro en Quartus, le di una dirección y lo cerré con la misma señal que se usó para la memoria interna. La salida del registro, naturalmente, se enviaba a las líneas de direcciones de la memoria externa. Al darme cuenta de que estaba haciendo una completa tontería, realicé la prueba. Y la prueba se realizó correctamente hasta que la apagué al día siguiente. Luego, un par de veces más con y sin registro, quedó absolutamente claro que la presencia de un registro eliminó las fallas por completo.

Esto era completamente inexplicable: incluso en un osciloscopio vi que las señales de dirección ya duraban más de lo que en principio era necesario, pero el hecho siguió siendo un hecho. Después de todo un fin de semana de enfrentamientos, lo dejé y decidí aceptarlo como un hecho...

Entonces, se cargó DOS, se iniciaron muchos programas que no requerían modo gráfico y pudimos seguir adelante. Naturalmente, existía el deseo de lanzar algún tipo de juguete. Pero un juguete normalmente requiere gráficos y yo todavía no tenía ninguno. Y si para el adaptador de vídeo de texto era posible arreglárselas con poco gasto reelaborando el existente, entonces para los gráficos no fue tan fácil.

Ni siquiera se trataba de la falta de soluciones ya preparadas. El problema era que necesitaba una compatibilidad casi completa con un adaptador de video estándar a nivel de hardware; después de todo, todos los juegos funcionan con gráficos directamente desde el hardware, sin usar el BIOS. Me di cuenta de que es más fácil hacer un adaptador de video desde cero que intentar rehacer uno ya hecho. Y, por supuesto, fue mucho más interesante hacerlo usted mismo.

Entonces, estamos escribiendo nuestro propio adaptador CGA; incluso EGA es un par de órdenes de magnitud más complicado, por lo que no lo probaremos por ahora. En principio, para empezar, todavía busqué un poco; de hecho, encontré bocetos de un módulo de generación de escaneo VGA. Pero eran una docena y media de líneas y ni siquiera funcionó del todo. Entonces, en realidad, se utilizaron como modelo para comenzar a escribir; era moralmente más fácil.

Naturalmente, no tengo un monitor CGA y no planeaba tenerlo, así que la idea era usar el modo VGA 640x400, en el que el modo CGA 320x200 encajaba perfectamente simplemente duplicando los puntos tanto horizontal como verticalmente.
En general, el adaptador de gráficos resultó ser inesperadamente fácil para mí: en ese momento mi cerebro de repente aprendió a pensar en categorías VHDL, además tenía un poco de comprensión de lo que se puede exigir de VHDL y lo que no vale la pena. En general, pasé la mayor parte de mi tiempo de depuración buscando un error completamente estúpido relacionado con la profundidad de bits de los números (dos de estos problemas se superpusieron y dieron una variante muy divertida). De lo contrario, comencé a disfrutar cómo las líneas en el editor se convierten en hardware casi real dentro de la FPGA y hacen exactamente lo que quiero.

Al principio, por supuesto, el adaptador resultó estar lejos de ser perfecto y compatible, pero Checkit pudo reconocerlo e incluso mostrar la primera imagen de prueba:

Por cierto, Checkit resultó ser un programa bastante útil: determinó muchas cosas de manera bastante astuta, lo que obligó a que toda la estructura se volviera cada vez más compatible con la PC. Y como Checkit podía comprobar todos los nodos y componentes, también se probó la compatibilidad de todas las partes del sistema.

Después de corregir los errores más obvios (como la duplicación de un punto del byte anterior visible en la foto anterior), logramos, con cierta dificultad, encontrar un juego que parecía incluso funcionar:

Los colores de esta imagen no coinciden con los originales; en este punto, el cambio de paleta aún no se había realizado y los colores en sí no estaban ajustados en absoluto.

Los intentos de encontrar juegos que funcionen han demostrado que los programas de juegos, que en la mayoría de los casos funcionan directamente con el hardware, son mucho más exigentes en términos de compatibilidad que algunos NC o incluso QuickBasic. Afortunadamente, la FPGA proporcionó posibilidades casi ilimitadas para detectar si un programa estaba accediendo a puertos de interés, direcciones de memoria, etc. Especialmente porque también podía cambiar el BIOS a mi propia discreción, esto proporcionó un excelente mecanismo de depuración. Por cierto, en algún momento (no recuerdo exactamente cuándo) también comenzó a funcionar Turbo Debugger, que también amplió el arsenal de herramientas de depuración.

Inmediatamente quedó claro que era necesario hacer al menos el temporizador mínimo 8253. Además, los programas intentaron usar el temporizador no solo para los sonidos (canal 2), sino que también reprogramaron activamente el canal 0, cambiando así la frecuencia de las interrupciones del temporizador, y también utilizó este canal para la determinación de los parámetros de tiempo.

Después de leer la documentación de 8253, me sentí un poco triste. Había mucho que hacer y no era muy interesante. Habiendo decidido hacer esto algún tiempo después, en ese momento simplemente me subí a los mismos núcleos abiertos y robé un par de módulos de temporizador. Uno está en Verilog y es muy simplificado, el segundo tiene una apariencia extremadamente sofisticada e incluso está en VHDL. Desafortunadamente, el temporizador VHDL se conectó a través del bus Wishbone; este es un estándar abierto para el desarrollo de FPGA. Nunca antes me había encontrado con Wishbone, así que decidí comenzar a usar un módulo Verilog, cuya interfaz parecía más simple.

Después de conectar el temporizador a mi sistema sin problemas, realicé algunas pruebas sencillas y me aseguré de que el módulo parecía funcionar. Además, después de otra pequeña modificación del sistema en cuanto a la interfaz con el altavoz, se escucharon los primeros sonidos, pero bastante correctos, de un juguete que funcionaba. Por ahora podríamos terminar con el cronómetro y seguir adelante.

Entonces tuve que tomar una decisión fundamental. Hasta este punto, yo mismo escribí INT 10h. En modo texto, podría vivir con esto, pero la necesidad de admitir estas funciones en modos gráficos me molesta. Teniendo en cuenta que en ese momento mi pasión por la programación en lenguaje ensamblador estaba prácticamente satisfecha (después de todo, esto se debió a que en un momento ya se había hecho a escala industrial), actué según el principio “Si la montaña no ven a Mahoma, entonces lo envía al infierno”. Es decir, decidí hacer que mi adaptador CGA fuera tan compatible con el hardware que el BIOS original pudiera funcionar con él.

En principio, no hubo mucha complejidad: no hay muchos registros, su funcionalidad es extremadamente simple. Entre las cosas implícitas, tuvimos que emular el registro estatal, que contiene los signos del movimiento inverso del haz de escaneo vertical y horizontal. Resultó bastante lógico que muchos programas (incluido BIOS) utilicen activamente este registro para evitar la "nieve" al intentar acceder simultáneamente a la memoria de video desde el procesador y el adaptador.

Por alguna razón, el proceso de poner en orden el adaptador de video me pareció muy emocionante, y al final esta unidad resultó ser la más sofisticada en términos de compatibilidad con el dispositivo original. En el camino, se agregaron cosas que faltaban como paletas intercambiables, modo 640x200, etc. Por cierto, para probar el modo 640x200 resultó bastante difícil encontrar un programa que admita este modo. Lo único que logramos desenterrar fue el ajedrez:

En mi opinión, se ve bastante hermoso...

El procesador INT 10h original era muy amigable con dicho adaptador, y suspiré aliviado al no tener que escribir cosas como reconocer un carácter impreso en un lugar determinado de la pantalla en modo gráfico.

El último obstáculo para una compatibilidad aceptable con el PC fue, curiosamente, el teclado. Aunque esto fue casi lo primero que arruiné en el proyecto, desde el punto de vista de la compatibilidad todavía no había ningún problema. El principal problema fue que todos los programas normales funcionan con el primer conjunto de códigos de escaneo, que se utilizaba en la PC IBM. Pero todos los teclados, empezando por el PC AT, producen al menos un segundo conjunto de códigos de escaneo, muy diferente del primero. Solo el controlador del teclado dentro de la computadora convierte estos códigos al primer conjunto original, y todos los programas comunes funcionan con él (incluso si estos programas parecen acceder al teclado directamente, sin usar el BIOS). Naturalmente, no tenía ningún controlador (por cierto, en PC AT e incluso en PC XT posterior se usó un microcontrolador separado basado en 8051 para esto). Las funciones de INT 09/16 se implementaron en la versión más mínima y el manejo directo de los programas con el teclado estaba fuera de discusión: ellos (los programas) simplemente no entenderían ni un solo código de escaneo.

En ese momento, de repente sentí euforia por tener VHDL; me pareció que ya había comprendido la verdad y que podía hacer cualquier cosa. Por lo tanto, sin demora, se escribió un módulo elegante (como me pareció a mí) en VHDL, que realizaba la transcodificación del código de escaneo. Todo acerca de este módulo fue muy hermoso y bueno, excepto por un pequeño detalle: no funcionó. Además, no podía entender el motivo de la imposibilidad de trabajar, lo cual me resultaba frustrante y desconcertante: sólo había una docena de líneas.

Una vez más, recurriendo a los expertos del foro, recibí una gran cantidad de consejos realmente sensatos. Además, mi comprensión del concepto VHDL en sí ha vuelto a cambiar casi radicalmente (incluida cierta decepción). Lo principal es que no hay milagros. VHDL (y todos los demás HDL) no harán nada que no se pueda hacer de forma convencional con los recursos de hardware disponibles. Si escribo una línea que parece correcta desde el punto de vista de la sintaxis del lenguaje, pero no tengo idea de cómo se puede implementar en el hardware, lo más probable es que no se implemente durante la compilación. Como mínimo, no hará lo que se le exige. Y una cosa más: es muy importante utilizar plantillas. Resulta que muchas construcciones del lenguaje se convierten en nodos de hardware correctos sólo cuando el compilador reconoce el patrón correspondiente. Por supuesto, existe cierta flexibilidad, pero aun así es necesario recordar siempre los estilos recomendados para describir determinados nodos.

Creo que fue después de estos enfrentamientos que realmente, al menos un poco, pero realmente comencé a comprender la esencia de VHDL (y en ese momento Verilog también había dejado de ser completamente incomprensible). Por arte de magia, los libros de texto sobre estos idiomas de repente cobraron sentido y la esencia de lo descrito quedó clara detrás de las palabras.

En resumen, después de haber hecho el módulo convertidor un poco menos hermoso, pero mucho más correcto, recibí códigos en el primer conjunto en su salida. A continuación, todo lo que queda es enviar estos códigos al controlador INT 09h original y verificar con el mismo Checkit que las pulsaciones de teclas se reconozcan correctamente. Así, el teclado también era casi 100% compatible a nivel de hardware.

En este punto, comencé a sentirme cada vez más incómodo con el hecho de que el nivel superior de mi proyecto todavía era el diseño esquemático. El último impulso que nos impulsó a emprender una transición completa a VHDL fue el cambio de ordenador de casa. Tenía un iMac Retina con Windows instalado en mi escritorio. Desafortunadamente, Quartus estaba entre los programas que resultaron no estar preparados para trabajar con esta resolución de pantalla. El diseño del circuito se volvió completamente ilegible y ninguno de mis intentos de modificar nada produjo mejoras reales. No había ningún lugar adonde ir, apreté los dientes y cogí el editor de texto.

Curiosamente, todo salió más que bien. Ahora ni siquiera recuerdo si fue necesario depurar algo o si todo funcionó inmediatamente después de la modificación. En cualquier caso, definitivamente no hubo problemas graves, pero el trabajo se volvió inmediatamente mucho más cómodo y eficiente. Inmediatamente recordé el consejo de varias personas conocedoras que me recomendaron encarecidamente que me olvidara del diseño de circuitos desde el principio y comenzara inmediatamente con VHDL/Verilog. Por cierto, con respecto a VHDL frente a Verilog, no discutan conmigo cuál es mejor o peor y por qué elegí VHDL. Supongamos que simplemente lo quería así, y eso es prácticamente cierto. No hablaré más de este tema...

Al cambiar a VHDL, también se rediseñó por completo el último módulo del diseño del circuito: la interfaz SPI. Si recuerda, proporcionaba recepción/transmisión por hardware de solo un byte, y alrededor de esto fue necesario llevar a cabo toda una serie de pasos preparatorios. Combinado con un procesador lento (y INT 13h escrito de forma perezosa), esto dio sólo alrededor del 35% del rendimiento del disco duro PC XT original (según Checkit). Como prácticamente ya me sentía como un gurú de VHDL y de la electrónica digital en general, inmediatamente decidí escribir no una copia de la interfaz existente, sino un módulo que proporciona transmisión de paquetes.

Es cierto que decidí no molestarme con DMA (o, como decimos en Rusia, DMA): todavía no había un controlador DMA y no quería tomar dos módulos nuevos a la vez, entonces no te darías cuenta. dónde estaba exactamente el problema. La depuración del módulo no fue del todo fácil: tuvimos que retocar un poco, incluido el uso activo de los canales digitales del osciloscopio como analizador de protocolo. Por cierto, por alguna razón durante todo el proceso casi me olvido de que Quartus incluye un analizador digital SignalTap incorporado, lo que probablemente sería aún más conveniente. Quizás en el futuro pueda empezar a usarlo (aún no lo he usado), pero por ahora me gusta mucho usar una pieza de hardware separada para esto.

Probablemente, teniendo en cuenta el nuevo módulo, sería posible reescribir INT 13h más en serio, pero fui vago y solo me salí con la modificación mínima necesaria. El resultado fue un choque no muy bonito y completamente ineficaz, pero aun así la velocidad con el nuevo módulo aumentó casi 5 veces:

Luego vino el proceso, en parte tedioso y en parte emocionante, de iniciar varios programas (principalmente juegos) para descubrir por qué no funcionaban (o más bien, qué no era lo suficientemente compatible en mi computadora). Puede escribir un artículo extenso por separado sobre la búsqueda de motivos, solo daré algunos ejemplos:
- No tengo DMA. Resulta que algunos programas también utilizan el canal cero DMA (utilizado para la regeneración de memoria en las PC originales) como contador para determinar períodos de tiempo cortos. Tuve que emular la parte correspondiente de los contadores del controlador DMA.
- normalmente (pero no siempre) cuando se lee desde un área de memoria o puerto de E/S inexistente, se lee el byte FF. Lo leí al revés: 00. Esto no le gustó al programa, que comprobó de esta manera (y nada más) la presencia de un joystick, luego de lo cual decidió que estaba allí y que todos los botones estaban presionados.
- la forma más original de determinar la presencia de un adaptador CGA era utilizar un programa que escribía un determinado valor en el registro de ubicación del cursor, luego leía el valor y lo comparaba con lo que había escrito (luego restauraba el valor original). Según la documentación que tengo, este registro debería ser de sólo escritura, pero se cambió a lectura/escritura, después de lo cual el programa se calmó.
- no relacionado con mi computadora - pasé mucho tiempo tratando de descubrir por qué el juego antiguo más simple, Paratrooper, se congelaba. Resultó que, aunque el juego era antiguo, el archivo que tenía estaba comprimido con un archivador de archivos com/exe autoextraíble. Entonces, la parte que luego era responsable de descomprimir el programa al inicio contenía un comando que aparecía solo a partir del procesador 286. El problema fue que este comando no afectó mucho el proceso de descompresión y sólo corrompió algunos bytes (menos de uno entre mil). Probablemente pasé la mayor parte del tiempo en estos enfrentamientos.

Así que poco a poco casi todos los juegos que tenía empezaron a ejecutarse y funcionar sin problemas, incluso intenté jugar algunos de ellos:

Mientras ejecutaba numerosos juegos, resultó que el módulo de temporizador que tenía estaba lejos de ser el ideal: en la mayoría de los casos los sonidos no eran del todo correctos. Decidí que todavía quería trabajar con el bus Wishbone y decidí conectar un temporizador a VHDL, que mencioné anteriormente. Para empezar, leí la descripción de Wishbone y construí algo así como un adaptador entre la interfaz de Wishbone y el bus 8088, nada complicado. Desafortunadamente, el cronómetro no funcionó. Tuve que volver a sacar el osciloscopio y ver qué pasaba allí (en primer lugar, si las señales de Wishbone se formaban correctamente).

¿Quién hubiera pensado que en este momento me esperaba un gran descubrimiento... ¿Recuerdas cómo sufrí fallas de memoria y me vi obligado a introducir un registro intermedio, que en principio no veía la necesidad? Entonces, en la pantalla del osciloscopio obtuve la siguiente imagen:

Naturalmente, lo primero que me llamó la atención fue el terrible timbre de la señal 2. Además, este timbre pasó de un parámetro cuantitativo a uno cualitativo. La señal 6 es generada por un contador de un bit, cuya entrada es la señal 2. De hecho, en cada flanco ascendente de la señal 2, la señal 6 se invierte. ¡Pero el oscilograma muestra que la señal 6 conmutó una vez no sólo a lo largo del borde normal de la señal 2, sino también a lo largo del borde del “timbre” más fuerte! Aquellos. en mi circuito, en algunas líneas el timbre era de tal amplitud que podía provocar una conmutación falsa de la lógica. Decir que quedé impresionado es no decir nada. Ni siquiera podía creer que con todo esto logré lograr un funcionamiento estable del circuito...

Además, después de un pequeño análisis del circuito teniendo en cuenta los nuevos datos, me quedó completamente claro exactamente dónde surgían los viejos fallos y por qué ese registro los solucionaba. Sin embargo, había que hacer algo, ya que era la señal 2 la que necesitaba para trabajar con el nuevo módulo de temporizador. Y de nuevo la tradicional apelación a los expertos. De varios consejos del foro se optó por la opción de cortar la pista y soldar allí una resistencia. El resultado estuvo lejos de ser ideal, pero no registré más cambios falsos por timbre durante las pruebas durante varias horas:

Desafortunadamente, esto no afectó el rendimiento del módulo de temporizador VHDL: estaba en silencio. Después de trastear un rato, la causa se descubrió en un lugar bastante inesperado: en el propio módulo. Además, era bastante prosaico (y se encuentra a menudo en programación): el módulo procesó incorrectamente uno de los valores extremos, es decir, con un divisor 0, en lugar de dividir por el valor máximo (65536), no hizo nada. Todo el tiempo verifiqué la inicialización del canal 0, que se inicializa mediante el divisor máximo para obtener una frecuencia de 18,2 Hz. Cuando utilicé el divisor FFFF para el experimento, todo funcionó.

Incluso me comuniqué con el autor del módulo, quien (el autor) ya había olvidado que escribió este módulo. Sin embargo, el autor me ayudó a encontrar el lugar específico donde se cometió el error e incluso de alguna manera intenté corregirlo. Este problema en particular se resolvió, pero se descubrieron otros, así que por ahora me decidí por la primera versión del módulo, Verilog.

En este punto, la preparación de mi diseño era tal que estaba listo para el experimento principal. El hecho es que en 1986 leí un artículo de la revista "In the World of Science", que es una traducción rusa de la revista estadounidense "Scientific American", que hablaba sobre el último producto de Microsoft, concretamente el juego MS. Simulador de vuelo. Teniendo en cuenta que ya en ese momento era un fanático de las computadoras, pero al mismo tiempo planeaba firmemente convertirme en piloto, puedes entender qué emociones bullían en mi cabeza (y en otras partes de mi cuerpo) en ese momento.

Y ahora, casi 30 años después, tengo un deseo insaciable de ejecutar ese histórico Flight Simulator en mi computadora. El interés también se vio avivado por el hecho de que en aquella época, al parecer, se utilizaban casi oficialmente dos programas para probar la compatibilidad: el mismo Flight Simulator y Lotus 1-2-3. Se decía que utilizan las funciones de hardware de la computadora tan estrechamente que si estos programas funcionan, todo lo demás funcionará aún mejor.

En general, tenía algunas dudas: todavía conocía algunos errores de mi diseño, pero aun así decidí arriesgarme (sobre todo teniendo en cuenta que, por supuesto, no arriesgué nada). Resultado en pantalla:

Por cierto, la misteriosa granulosidad de la imagen inicialmente despertó mis sospechas: inmediatamente comencé a pensar en alguna forma muy complicada de trabajar con un adaptador de video que no es compatible con mí. De hecho, resultó que Microsoft estaba intentando obtener colores adicionales combinando puntos de colores existentes. Debo señalar que, dada la resolución de 320x200, el resultado fue, por decirlo suavemente, cuestionable.

Tampoco hubo problemas al iniciar Lotus 1-2-3, por lo que este experimento podría considerarse terminado. Sin embargo, hice una serie de pequeñas mejoras y ajustes, después de lo cual todos los programas que tengo actualmente comenzaron a iniciarse y funcionar con absoluta normalidad. La única característica nueva que agregué después de esto fue EMS. Simplemente me atormentaba el hecho de que se estaba perdiendo más de un megabyte de memoria disponible (para ser honesto, solo quería hacer otra cosa), así que encontré una descripción de la placa EMS con un controlador y escribí un módulo que Emula el funcionamiento de esta placa. El conductor reconoció con éxito la memoria:

El toque final fue el rediseño de la propia placa del procesador. No me gustó en absoluto la pesadilla que estaba sucediendo con las formas de onda y también quería practicar con Eagle nuevamente. Como resultado, se dispuso una placa de circuito impreso de 4 capas, en la que una de las capas internas estaba destinada a tierra y la segunda a ambas tensiones de alimentación. Además, el punto más importante fue la eliminación de los cables: los conectores están instalados de modo que mi placa se conecta directamente a la placa de desarrollo FPGA (para ser más precisos, a la placa de expansión del puerto GPIO de la placa de desarrollo FPGA, como una muñeca ):

También hubo algunos cambios en el circuito: el secuenciador de reloj 8284 se eliminó por completo (decidí que podría eliminarse fácilmente dentro de la FPGA sin causar el menor daño a la compatibilidad con las señales del bus) y el registro de retención en el bus de direcciones/datos (también eliminado). dentro de la FPGA). Una revisión rápida de las formas de onda en la nueva placa mostró que las señales eran casi perfectas:

Así, el camino desde un LED parpadeante en una placa sin soldadura hasta una computadora completamente normal se recorrió en un par de meses y se obtuvo una gran cantidad de placer, así como conocimientos en varias áreas. El resultado fue una computadora con una compatibilidad bastante buena con la PC IBM, en la que todos los programas que no fui demasiado vago para adquirir, incl. y aquellos que se consideran extremadamente exigentes en cuanto a compatibilidad de hardware. La computadora casi por completo (con la excepción del controlador INT 13h) usa BIOS versión 3 de la PC IBM.

Es casi imposible decir algo definitivo sobre el presupuesto del proyecto. Para empezar, qué incluir allí: solo unos pocos microcircuitos (lo que implica que la instalación puede ser realizada por MGTF, la placa FPGA y los dispositivos de configuración ya están allí), o todo, desde la producción urgente de placas, la compra de un ¿Placa de depuración FPGA específicamente para este proyecto y termina con un osciloscopio no tan barato?

Parece que indiqué tipos específicos de microcircuitos y todo lo demás en el artículo, para que cualquiera pueda ver cuánto costará todo esto en su versión. Naturalmente, no es necesario utilizar DE2-115 como referencia; aquí están los recursos FPGA necesarios:

Cabe señalar que todavía se utilizan muchos artefactos para la depuración y el código en sí apenas se ha optimizado.

No está del todo seguro qué hacer con todo esto (o si hacer algo). Durante el proceso volvió a quedar claro que, si bien también se puede lograr algo con entusiasmo y erudición, un conocimiento formal de los conceptos básicos permitiría acelerar todo, evitar muchos rastrillos y, lo más importante, concentrarse más en la creatividad que en inventar una bicicleta con ruedas cuadradas. Por lo tanto, por ahora existe un gran deseo de llenar los vacíos (o más bien, los vacíos) en el conocimiento tanto de los conceptos básicos de la electrónica como del diseño de circuitos en general, y de VHDL en particular, utilizando algún método rápido. Veremos el éxito que tendrá: siempre hay un problema de motivación y de disponibilidad de tiempo libre.

Entonces, ¿por qué las computadoras de escritorio modernas (con la excepción de las computadoras Apple) todavía se consideran compatibles con IBM, aunque la proporción de PC fabricadas directamente por la propia IBM es bastante pequeña? El hecho es que sólo IBM, en los albores de la producción de equipos informáticos personales, declaró el principio de "arquitectura abierta" en su versión de la computadora. Esto significó que IBM, a diferencia de todos los demás fabricantes, no tenía la intención de mantener en secreto lo que había exactamente dentro de su dispositivo personal.
computadoras y, lo más importante, alentó abiertamente a otras empresas a producir componentes para computadoras compatibles con IBM y producir exactamente las mismas computadoras, que a partir de ese momento comenzaron a llamarse compatibles con IBM.

Fue gracias a esta política que las computadoras compatibles con IBM ocuparon firmemente el mercado, desplazando por completo a todos los competidores existentes en ese momento, de los cuales había muchos: muchos
Por casualidad, las empresas lanzaron sus propios ordenadores personales, cuya arquitectura era completamente cerrada: Commodore, Olivetti...

Sin embargo, la paradoja fue que, habiendo regalado al mundo ordenadores compatibles con IBM, la propia empresa perdió rápidamente su posición de liderazgo en su producción. Aprovechando la arquitectura completamente abierta y bien documentada de estas máquinas, varios fabricantes comenzaron a lanzar sus propias modificaciones, que a menudo eran mucho mejores que los modelos de IBM, por lo que empresas tan conocidas como Compaq, Hewlett Packard, Acer, Dell y otros entraron en escena.

Además, la apertura de la arquitectura condujo a la aparición de los llamados ordenadores Noname, que, como un ordenador de juguete, estaban formados por componentes de fabricantes completamente diferentes y no muy conocidos. Sin embargo, cabe señalar que casi todas las denominadas computadoras de marca se ensamblan a partir de componentes de diversas empresas. Y la tarea de una empresa que pone su propia marca es asegurar la selección de estos componentes y un alto control de calidad.

Sin embargo, existe un único tipo de ordenador personal completamente distinto que no es compatible con IBM. Estas son computadoras Apple que solo produce Apple. Las computadoras Apple se utilizan a menudo como máquinas personales, pero su objetivo principal es publicar e imprimir.







Arriba