Coincido ampliamente con Daniel Meza. Revisa los datasheets de estos circuitos además del 74LS181:
74LS373, te servirá para la pila, el stack pointer y el banco de registros, incluido el registro de instrucciones
74LS138, si optas por la UCD microprogramada, éste te servirá mucho para seleccionar las instrucciones. Con éste harás un decodificador tan grande como necesites, limitado por la cantidad de bytes de la instrucción. Típicamente son 8 bits, así que te alcanza para 256 instrucciones, o una cantidad menor, pero con instrucciones con varias microinstrucciones.
74LS193, es el que pretendo usar para el Program Counter de 24 bits, lo puedes programar fácilmente para saltos, retornos y llamadas a subrutinas.
Veré si me acuerdo de más para que te vayas familiarizando más. Y no lo abandones así "nomás", este es un proyecto que todo aficionado a los TTL quisiera hacer!
Para la UCD podrías usar una matriz de diodos, porque una EEPROM para esto deberá ser grande y será muy lenta porque deberá "reconstruir" la instrucción que puede ser de hasta 60 bits por cada línea a controlar de cada circuito integrado.
Yo tengo por ahí un set de instrucciones que desarrollé para esto, aunque son muy para mi modelo teórico, podrías basarte también en él, sólo dejame encontrarlo.
Para un acceso más rápido a periféricos, no multiplexes los buses de la ROM del programa y de los buses a los periféricos, pues debes hacer una parte de la UCD para que al finalizar la instrucción vaya la ROM del programa a buscar la nueva instrucción, lo cual puede hacerlo más tardado, pues se comparte un bus para programa y periféricos. Mejor un bus especial para la ROM y el otro para periféricos. Optimizas un poco el funcionamiento del procesador.
Y para periféricos deberás emplear instrucciones como:
Lea el dato de la dirección * del periférico ** y almacénelo en el acumulador
Escriba el dato * en la dirección ** del periférico ***
También deberás implementarte un buen control de interrupciones, que sea capaz de respaldar las instrucciones ejecutadas durante la instrucción para ceder el CPU a la interrupción. Si piensas manejar varios periféricos, deberás hacerte un control de interrupciones grande.
Y no te olvides del circuito de reset!
Un sistema operativo lo veo un tanto complicado, pues es el que se encarga de administrar el hardware, además de que deberás hacerlo del tipo Multitarea el CPU. Unos cuantos comandos para ejecutar ciertos programas sería suficiente.