<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog de Jorge Machín &#187; CPU hecha en casa</title>
	<atom:link href="http://www.machin.com.mx/archives/category/cpu-hecha-en-casa/feed" rel="self" type="application/rss+xml" />
	<link>http://www.machin.com.mx</link>
	<description>Sólo para recordar</description>
	<lastBuildDate>Mon, 06 Sep 2010 07:34:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Proyecto: Construyendo un CPU con circuitos básicos (Conclusiones)</title>
		<link>http://www.machin.com.mx/archives/4305</link>
		<comments>http://www.machin.com.mx/archives/4305#comments</comments>
		<pubDate>Sat, 01 May 2010 05:11:37 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Arqueología Machinesca]]></category>
		<category><![CDATA[CPU hecha en casa]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Proyectos]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=4305</guid>
		<description><![CDATA[<p>Ya hace algún tiempo que se terminó la construcción de mi "microprocesador casero" y la documentación ya esta bastante avanzada por lo que me animo a poner las conclusiones, la lista completa de los componentes con su costo y el tiempo que me llevo realizar este proyecto. </p>
<p align="center">
<a href="http://www.machin.com.mx/wp-content/uploads/2010/04/CPU_Final.jpg"><img src="http://www.machin.com.mx/wp-content/uploads/2010/04/CPU_Final-2.jpg" alt="" title="CPU_Final-2" width="500" height="169" class="aligncenter size-full wp-image-4626" /></a><strong>Aspecto Final</strong>
</p>
<h4>Costo</h4>
<p>Aquí esta la lista completa de materiales con su precio en pesos mexicanos:</p>
<table width="100%">
<tr>
<td><b>Cantidad</b></td>
<td><b>Pieza</b></td>
<td align="right"><b>Precio</b></td>
<td  align="right"><b>Total</b></td>
</tr>
<tr>
<td>2</td>
<td>2114</td>
<td align="right">49.00</td>
<td align="right">98.00</td>
</tr>
<tr>
<td>1</td>
<td>2716</td>
<td align="right">31.00</td>
<td align="right">31.00</td>
</tr>
<tr>
<td>3</td>
<td>2732</td>
<td align="right">37.00</td>
<td align="right">148.00</td>
</tr>
<tr>
<td>1</td>
<td>74LS00</td>
<td align="right">7.00</td>
<td align="right">7.00</td>
</tr>
<tr>
<td>2</td>
<td>74LS04</td>
<td align="right">5.00</td>
<td align="right">20.00</td>
</tr>
<tr>
<td>2</td>
<td>74LS08</td>
<td align="right">6.00</td>
<td align="right">12.00</td>
</tr>
<tr>
<td>1</td>
<td>74LS09</td>
<td align="right">5.00</td>
<td align="right">5.00</td>
</tr>
<tr>
<td>1</td>
<td>74LS14</td>
<td align="right">7.00</td>
<td align="right">28.00</td>
</tr>
<tr>
<td>2</td>
<td>74LS21</td>
<td align="right">5.00</td>
<td align="right">10.00</td>
</tr>
<tr>
<td>1</td>
<td>74LS138</td>
<td align="right">8.00</td>
<td align="right">8.00</td>
</tr>
<tr>
<td>1</td>
<td>74LS154</td>
<td align="right">22.00</td>
<td align="right">22.00</td>
</tr>
<tr>
<td>3</td>
<td>74LS161</td>
<td align="right">6.30</td>
<td align="right">18.90</td>
</tr>
<tr>
<td>4</td>
<td>74LS175</td>
<td align="right">12.00</td>
<td align="right">48.00</td>
</tr>
<tr>
<td>5</td>
<td>74LS240</td>
<td align="right">9.00</td>
<td align="right">45.00</td>
</tr>
<tr>
<td>2</td>
<td>74LS245</td>
<td align="right">7.00</td>
<td align="right">14.00</td>
</tr>
<tr>
<td>4</td>
<td>74LS374</td>
<td align="right">9.00</td>
<td align="right">36.00</td>
</tr>
<tr>
<td>6</td>
<td>Led Rojo</td>
<td align="right">2.00</td>
<td align="right">12.00</td>
</tr>
<tr>
<td>2</td>
<td>Led Verde</td>
<td align="right">2.00</td>
<td align="right">4.00</td>
</tr>
<tr>
<td>1</td>
<td>Barra Dip Switch</td>
<td align="right">9.00</td align="right">
<td align="right">9.00</td>
</tr>
<tr>
<td>7</td>
<td>Barra Leds</td>
<td align="right">17.00</td>
<td align="right">119.00</td>
</tr>
<tr>
<td>10</td>
<td>Protoboards</td>
<td align="right">70.00</td>
<td align="right">700.00</td>
</tr>
<tr>
<td>58</td>
<td>220 Ohms</td>
<td align="right">0.70</td>
<td align="right">40.60</td>
</tr>
<tr>
<td>2</td>
<td>330 Ohms</td>
<td align="right">0.70</td>
<td align="right">1.40</td>
</tr>
<tr>
<td>10</td>
<td>1K Ohms</td>
<td align="right">0.70</td>
<td align="right">7.00</td>
</tr>
<tr>
<td>2</td>
<td>Capacitores electroliticos</td>
<td align="right">6.00</td>
<td align="right">12.00</td>
</tr>
<tr>
<td>3</td>
<td>Push buttons</td>
<td align="right">2.00</td>
<td align="right">6.00</td>
</tr>
<tr>
<td colspan="3" align="right"><strong>Total:</strong></td>
<td align="right">1461.90</td>
</tr>
</table>
<p>Entonces el precio fue alrededor de 120 dólares norteamericanos y se usaron 136 componentes (35 circuitos integrados). Pero claro, se necesito equipo extra como pinzas de varios tipos, fuente de poder, sonda lógica, multímetro, un quemador de memorias, lámpara de UV y componentes de respaldo entre otros.</p>
<h4>Tiempo empleado</h4>
<p>Este proyecto llevó todo mi tiempo libre del mes de octubre de 2009, que no estuvo muy saturado. Para hacer esta cantidad más realista, yo calculo que incluyendo los viajes a Republica Salvador a comprar los materiales llevaría unos 5 días de tiempo completo diseñar y construir este microprocesador desde cero.  </p>
<h4>Planes a futuro</h4>
<p>Sería interesante continuar desarrollando este proyecto agregando módulos como los sistemas de video, almacenamiento masivo y el de red. Sin embargo, ya no sería tan didáctico y a mi forma de pensar sería más útil hacer esos sistemas con circuitos modernos y para microcontroladores. De aquí en adelante, ya no voy a desarrollar más este proyecto, lo voy a guardar en una cápsula del tiempo para recordarlo en 20 años y me voy a divertir un rato con PICs.</p>
<h4>Conclusiones</h4>
<p>El estudio de la arquitectura de los microprocesadores nos puede ayudar a ser mejores programadores debido a que mucho de su diseño ha sido en función de dar facilidades y características a los compiladores de lenguajes y a los sistemas operativos. Por ejemplo, diseñar un microprocesador con codigo reubicable y páginación de memoria es esencial en sistemas operativos concurrentes. El tamaño de la palabra, el número de registros y optimizaciones en los procesos del secuenciador  pueden hacer un procesador más rápido sin tener que aumentar la velocidad de reloj.</p>
<p>Por otro lado construir un procesador con circuitos integrados básicos puede ayudarnos a comprender  el marco histórico en el que vivieron los pioneros de la informática y darnos una idea no sólo de las dificultades técnicas a las que se enfrentaron; sino también los retos comerciales y el porque de los diseños actuales.</p>

]]></description>
			<content:encoded><![CDATA[<p>Ya hace algún tiempo que se terminó la construcción de mi "microprocesador casero" y la documentación ya esta bastante avanzada por lo que me animo a poner las conclusiones, la lista completa de los componentes con su costo y el tiempo que me llevo realizar este proyecto. </p>
<p align="center">
<a href="http://www.machin.com.mx/wp-content/uploads/2010/04/CPU_Final.jpg"><img src="http://www.machin.com.mx/wp-content/uploads/2010/04/CPU_Final-2.jpg" alt="" title="CPU_Final-2" width="500" height="169" class="aligncenter size-full wp-image-4626" /></a><strong>Aspecto Final</strong>
</p>
<h4>Costo</h4>
<p>Aquí esta la lista completa de materiales con su precio en pesos mexicanos:</p>
<table width="100%">
<tr>
<td><b>Cantidad</b></td>
<td><b>Pieza</b></td>
<td align="right"><b>Precio</b></td>
<td  align="right"><b>Total</b></td>
</tr>
<tr>
<td>2</td>
<td>2114</td>
<td align="right">49.00</td>
<td align="right">98.00</td>
</tr>
<tr>
<td>1</td>
<td>2716</td>
<td align="right">31.00</td>
<td align="right">31.00</td>
</tr>
<tr>
<td>3</td>
<td>2732</td>
<td align="right">37.00</td>
<td align="right">148.00</td>
</tr>
<tr>
<td>1</td>
<td>74LS00</td>
<td align="right">7.00</td>
<td align="right">7.00</td>
</tr>
<tr>
<td>2</td>
<td>74LS04</td>
<td align="right">5.00</td>
<td align="right">20.00</td>
</tr>
<tr>
<td>2</td>
<td>74LS08</td>
<td align="right">6.00</td>
<td align="right">12.00</td>
</tr>
<tr>
<td>1</td>
<td>74LS09</td>
<td align="right">5.00</td>
<td align="right">5.00</td>
</tr>
<tr>
<td>1</td>
<td>74LS14</td>
<td align="right">7.00</td>
<td align="right">28.00</td>
</tr>
<tr>
<td>2</td>
<td>74LS21</td>
<td align="right">5.00</td>
<td align="right">10.00</td>
</tr>
<tr>
<td>1</td>
<td>74LS138</td>
<td align="right">8.00</td>
<td align="right">8.00</td>
</tr>
<tr>
<td>1</td>
<td>74LS154</td>
<td align="right">22.00</td>
<td align="right">22.00</td>
</tr>
<tr>
<td>3</td>
<td>74LS161</td>
<td align="right">6.30</td>
<td align="right">18.90</td>
</tr>
<tr>
<td>4</td>
<td>74LS175</td>
<td align="right">12.00</td>
<td align="right">48.00</td>
</tr>
<tr>
<td>5</td>
<td>74LS240</td>
<td align="right">9.00</td>
<td align="right">45.00</td>
</tr>
<tr>
<td>2</td>
<td>74LS245</td>
<td align="right">7.00</td>
<td align="right">14.00</td>
</tr>
<tr>
<td>4</td>
<td>74LS374</td>
<td align="right">9.00</td>
<td align="right">36.00</td>
</tr>
<tr>
<td>6</td>
<td>Led Rojo</td>
<td align="right">2.00</td>
<td align="right">12.00</td>
</tr>
<tr>
<td>2</td>
<td>Led Verde</td>
<td align="right">2.00</td>
<td align="right">4.00</td>
</tr>
<tr>
<td>1</td>
<td>Barra Dip Switch</td>
<td align="right">9.00</td align="right">
<td align="right">9.00</td>
</tr>
<tr>
<td>7</td>
<td>Barra Leds</td>
<td align="right">17.00</td>
<td align="right">119.00</td>
</tr>
<tr>
<td>10</td>
<td>Protoboards</td>
<td align="right">70.00</td>
<td align="right">700.00</td>
</tr>
<tr>
<td>58</td>
<td>220 Ohms</td>
<td align="right">0.70</td>
<td align="right">40.60</td>
</tr>
<tr>
<td>2</td>
<td>330 Ohms</td>
<td align="right">0.70</td>
<td align="right">1.40</td>
</tr>
<tr>
<td>10</td>
<td>1K Ohms</td>
<td align="right">0.70</td>
<td align="right">7.00</td>
</tr>
<tr>
<td>2</td>
<td>Capacitores electroliticos</td>
<td align="right">6.00</td>
<td align="right">12.00</td>
</tr>
<tr>
<td>3</td>
<td>Push buttons</td>
<td align="right">2.00</td>
<td align="right">6.00</td>
</tr>
<tr>
<td colspan="3" align="right"><strong>Total:</strong></td>
<td align="right">1461.90</td>
</tr>
</table>
<p>Entonces el precio fue alrededor de 120 dólares norteamericanos y se usaron 136 componentes (35 circuitos integrados). Pero claro, se necesito equipo extra como pinzas de varios tipos, fuente de poder, sonda lógica, multímetro, un quemador de memorias, lámpara de UV y componentes de respaldo entre otros.</p>
<h4>Tiempo empleado</h4>
<p>Este proyecto llevó todo mi tiempo libre del mes de octubre de 2009, que no estuvo muy saturado. Para hacer esta cantidad más realista, yo calculo que incluyendo los viajes a Republica Salvador a comprar los materiales llevaría unos 5 días de tiempo completo diseñar y construir este microprocesador desde cero.  </p>
<h4>Planes a futuro</h4>
<p>Sería interesante continuar desarrollando este proyecto agregando módulos como los sistemas de video, almacenamiento masivo y el de red. Sin embargo, ya no sería tan didáctico y a mi forma de pensar sería más útil hacer esos sistemas con circuitos modernos y para microcontroladores. De aquí en adelante, ya no voy a desarrollar más este proyecto, lo voy a guardar en una cápsula del tiempo para recordarlo en 20 años y me voy a divertir un rato con PICs.</p>
<h4>Conclusiones</h4>
<p>El estudio de la arquitectura de los microprocesadores nos puede ayudar a ser mejores programadores debido a que mucho de su diseño ha sido en función de dar facilidades y características a los compiladores de lenguajes y a los sistemas operativos. Por ejemplo, diseñar un microprocesador con codigo reubicable y páginación de memoria es esencial en sistemas operativos concurrentes. El tamaño de la palabra, el número de registros y optimizaciones en los procesos del secuenciador  pueden hacer un procesador más rápido sin tener que aumentar la velocidad de reloj.</p>
<p>Por otro lado construir un procesador con circuitos integrados básicos puede ayudarnos a comprender  el marco histórico en el que vivieron los pioneros de la informática y darnos una idea no sólo de las dificultades técnicas a las que se enfrentaron; sino también los retos comerciales y el porque de los diseños actuales.</p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/4305/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asi voy con mi CPU III ( y último )</title>
		<link>http://www.machin.com.mx/archives/3483</link>
		<comments>http://www.machin.com.mx/archives/3483#comments</comments>
		<pubDate>Tue, 20 Oct 2009 07:18:22 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Arqueología Machinesca]]></category>
		<category><![CDATA[CPU hecha en casa]]></category>
		<category><![CDATA[Electrónica]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Proyectos]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/archives/3483</guid>
		<description><![CDATA[<p>Pues este sería el último post de avances porque por fin lo acabé. Sólo falta hacer las conclusiones y poner a punto los posts teóricos que se publicaron. Esta vez un video de YouTube:</p>
<p align="center">
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/QPJlVm5NElo&#038;hl=es&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/QPJlVm5NElo&#038;hl=es&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
</p>
<p>Muchas gracias a mi hermano por musicalizar el video.</p>
<h4>Post relacionados:</h4>
<p>- <a href="/archives/2630">Proyecto: Construyendo un CPU con circuitos básicos (Parte 1)</a></p>
<p>- <a href="/archives/3225">Asi voy con mi CPU</a><br />
- <a href="/archives/3377">Asi voy con mi CPU II</a></p>

]]></description>
			<content:encoded><![CDATA[<p>Pues este sería el último post de avances porque por fin lo acabé. Sólo falta hacer las conclusiones y poner a punto los posts teóricos que se publicaron. Esta vez un video de YouTube:</p>
<p align="center">
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/QPJlVm5NElo&#038;hl=es&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/QPJlVm5NElo&#038;hl=es&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
</p>
<p>Muchas gracias a mi hermano por musicalizar el video.</p>
<h4>Post relacionados:</h4>
<p>- <a href="/archives/2630">Proyecto: Construyendo un CPU con circuitos básicos (Parte 1)</a></p>
<p>- <a href="/archives/3225">Asi voy con mi CPU</a><br />
- <a href="/archives/3377">Asi voy con mi CPU II</a></p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/3483/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Asi voy con mi CPU II</title>
		<link>http://www.machin.com.mx/archives/3377</link>
		<comments>http://www.machin.com.mx/archives/3377#comments</comments>
		<pubDate>Sun, 11 Oct 2009 10:00:26 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Arqueología Machinesca]]></category>
		<category><![CDATA[CPU hecha en casa]]></category>
		<category><![CDATA[Electrónica]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Proyectos]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/archives/3377</guid>
		<description><![CDATA[<p>No sé porque siempre me ha fascinado ver estos aparatitos que tienen leds en la noche y con la luz apagada. ¿Será que el brillo les da un carácter misterioso y frío como el de un viaje en una nave espacial o simplemente me recuerdan esas noches tranquilas junto al arbolito de navidad? Quien sabe, pero podría verlo por horas.</p>
<p align="center">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/10/cpunoche.jpg" alt="cpunoche" title="cpunoche" width="400" height="533"  /><br />
<strong>Para mí, es una vista hermosa</strong>
</p>
<p>Por fin mi "microprocesador" corrió su primer programa que realiza operaciones aritméticas y logicas para incluso sacar datos al puerto de salida. También ya realiza el ciclo sin fin que evita que el programa pierda control y que rota a la derecha los bits del acumulador hasta que desaparecen totalmente después de unos ciclos de reloj. Ya siento que es misión cumplida <img src='http://www.machin.com.mx/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  .</p>
<p>
<h4>Post relacionados:</h4>
</p>
<p>- <a href="/archives/2630">Proyecto: Construyendo un CPU con circuitos básicos (Parte 1)</a><br />
- <a href="/archives/3225">Asi voy con mi CPU</a><br />
- <a href="/archives/3377">Asi voy con mi CPU II</a></p>

]]></description>
			<content:encoded><![CDATA[<p>No sé porque siempre me ha fascinado ver estos aparatitos que tienen leds en la noche y con la luz apagada. ¿Será que el brillo les da un carácter misterioso y frío como el de un viaje en una nave espacial o simplemente me recuerdan esas noches tranquilas junto al arbolito de navidad? Quien sabe, pero podría verlo por horas.</p>
<p align="center">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/10/cpunoche.jpg" alt="cpunoche" title="cpunoche" width="400" height="533"  /><br />
<strong>Para mí, es una vista hermosa</strong>
</p>
<p>Por fin mi "microprocesador" corrió su primer programa que realiza operaciones aritméticas y logicas para incluso sacar datos al puerto de salida. También ya realiza el ciclo sin fin que evita que el programa pierda control y que rota a la derecha los bits del acumulador hasta que desaparecen totalmente después de unos ciclos de reloj. Ya siento que es misión cumplida <img src='http://www.machin.com.mx/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  .</p>
<p>
<h4>Post relacionados:</h4>
</p>
<p>- <a href="/archives/2630">Proyecto: Construyendo un CPU con circuitos básicos (Parte 1)</a><br />
- <a href="/archives/3225">Asi voy con mi CPU</a><br />
- <a href="/archives/3377">Asi voy con mi CPU II</a></p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/3377/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Proyecto: Construyendo un CPU con circuitos básicos (Parte 8)</title>
		<link>http://www.machin.com.mx/archives/3351</link>
		<comments>http://www.machin.com.mx/archives/3351#comments</comments>
		<pubDate>Sat, 10 Oct 2009 21:24:33 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[CPU hecha en casa]]></category>
		<category><![CDATA[Electrónica]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/archives/3351</guid>
		<description><![CDATA[<p>En este post se va a tratar el diseño de la funcionalidad de Entrada y Salida que es lo que conecta nuestro microprocesador con el mundo real y lo hace una máquina útil y no un cerebro vegetal.</p>
<h4>Entrada y Salida</h4>
<p>Las ordenes de entradas de salida están definidas por las ordenes IN y OUT que tienen la siguiente estructura:</p>
<p>Para la salida se va utilizar un registro que mantenga la salida constante por medio del circuito integrado 74LS374. Para la entrada, usamos un buffer con ayuda del circuito 74LS255. El diagrama esquemático es el siguiente:</p>
<p>
<h4>Post relacionados:</h4>
</p>
<p>- <a href="/archives/2630">Proyecto: Construyendo un CPU con circuitos básicos (Parte 1)</a>
</p>
<h4>Nota importante:</h4>
<p>La construcción del CPU se está llevando justo ahorita, por lo que toda la información presentada en este post puede estar incompleta o incorrecta al ser de carácter provisional.</p>

]]></description>
			<content:encoded><![CDATA[<p>En este post se va a tratar el diseño de la funcionalidad de Entrada y Salida que es lo que conecta nuestro microprocesador con el mundo real y lo hace una máquina útil y no un cerebro vegetal.</p>
<h4>Entrada y Salida</h4>
<p>Las ordenes de entradas de salida están definidas por las ordenes IN y OUT que tienen la siguiente estructura:</p>
<p>Para la salida se va utilizar un registro que mantenga la salida constante por medio del circuito integrado 74LS374. Para la entrada, usamos un buffer con ayuda del circuito 74LS255. El diagrama esquemático es el siguiente:</p>
<p>
<h4>Post relacionados:</h4>
</p>
<p>- <a href="/archives/2630">Proyecto: Construyendo un CPU con circuitos básicos (Parte 1)</a>
</p>
<h4>Nota importante:</h4>
<p>La construcción del CPU se está llevando justo ahorita, por lo que toda la información presentada en este post puede estar incompleta o incorrecta al ser de carácter provisional.</p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/3351/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Asi voy con mi CPU</title>
		<link>http://www.machin.com.mx/archives/3225</link>
		<comments>http://www.machin.com.mx/archives/3225#comments</comments>
		<pubDate>Sat, 03 Oct 2009 18:24:37 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Arqueología Machinesca]]></category>
		<category><![CDATA[CPU hecha en casa]]></category>
		<category><![CDATA[Electrónica]]></category>
		<category><![CDATA[Fotografías]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Proyectos]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=3225</guid>
		<description><![CDATA[<p>En esta foto se puede observar que sobre la mesa ya está lista la lógica de control, el contador de programa, la memoria RAM y ROM,  el registro de instrucción y el registro de operando.  Esta en pleno desarrollo el cableando del acumulador pero ya tengo nueva dotación de cables <img src='http://www.machin.com.mx/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  . </p>
<p align="center">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/10/cpu1.jpg" alt="cpu1" title="cpu1" width="600" height="400" /><br />
<strong>Como armar un rompecabezas</strong>
</p>
<p>
<h4>Post relacionados:</h4>
</p>
<p>-  <a href="/archives/2630">Proyecto: Construyendo un CPU con circuitos básicos (Parte 1)</a></p>

]]></description>
			<content:encoded><![CDATA[<p>En esta foto se puede observar que sobre la mesa ya está lista la lógica de control, el contador de programa, la memoria RAM y ROM,  el registro de instrucción y el registro de operando.  Esta en pleno desarrollo el cableando del acumulador pero ya tengo nueva dotación de cables <img src='http://www.machin.com.mx/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  . </p>
<p align="center">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/10/cpu1.jpg" alt="cpu1" title="cpu1" width="600" height="400" /><br />
<strong>Como armar un rompecabezas</strong>
</p>
<p>
<h4>Post relacionados:</h4>
</p>
<p>-  <a href="/archives/2630">Proyecto: Construyendo un CPU con circuitos básicos (Parte 1)</a></p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/3225/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Proyecto: Construyendo un CPU con circuitos básicos (Parte 7)</title>
		<link>http://www.machin.com.mx/archives/3198</link>
		<comments>http://www.machin.com.mx/archives/3198#comments</comments>
		<pubDate>Sat, 03 Oct 2009 09:45:13 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Arqueología Machinesca]]></category>
		<category><![CDATA[CPU hecha en casa]]></category>
		<category><![CDATA[Electrónica]]></category>
		<category><![CDATA[Proyectos]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/archives/3198</guid>
		<description><![CDATA[<p><P><br />
<h4>Diseño del Acumulador</h4>
</p>
<p>Ya nos tocó diseñar las partes más interesantes de un microprocesador. Ahora continúo con una de las más "engorrosas": el acumulador. Es latoso porque interactúa prácticamente con todos los módulos del microprocesador. y por su característica cíclica  en las operaciones con el ALU.</p>
<p align="center">
<a href="http://www.machin.com.mx/wp-content/uploads/2009/10/Acumulador.jpg"><img src="http://www.machin.com.mx/wp-content/uploads/2009/10/Acumulador2.jpg" alt="Acumulador2" title="Acumulador2" width="400" height="515" class="aligncenter size-full wp-image-3207" /></a>
</p>
<p>
<h4>Nota importante:</h4>
</p>
<p>La construcción del CPU se está llevando justo en estos momentos, por lo que toda la información presentada en este  post puede estar incompleta o incorrecta al ser de carácter provisional.</p>

]]></description>
			<content:encoded><![CDATA[<p><P><br />
<h4>Diseño del Acumulador</h4>
</p>
<p>Ya nos tocó diseñar las partes más interesantes de un microprocesador. Ahora continúo con una de las más "engorrosas": el acumulador. Es latoso porque interactúa prácticamente con todos los módulos del microprocesador. y por su característica cíclica  en las operaciones con el ALU.</p>
<p align="center">
<a href="http://www.machin.com.mx/wp-content/uploads/2009/10/Acumulador.jpg"><img src="http://www.machin.com.mx/wp-content/uploads/2009/10/Acumulador2.jpg" alt="Acumulador2" title="Acumulador2" width="400" height="515" class="aligncenter size-full wp-image-3207" /></a>
</p>
<p>
<h4>Nota importante:</h4>
</p>
<p>La construcción del CPU se está llevando justo en estos momentos, por lo que toda la información presentada en este  post puede estar incompleta o incorrecta al ser de carácter provisional.</p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/3198/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Proyecto: Construyendo un CPU con circuitos básicos (Parte 6)</title>
		<link>http://www.machin.com.mx/archives/3150</link>
		<comments>http://www.machin.com.mx/archives/3150#comments</comments>
		<pubDate>Thu, 01 Oct 2009 04:23:04 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Arqueología Machinesca]]></category>
		<category><![CDATA[CPU hecha en casa]]></category>
		<category><![CDATA[Electrónica]]></category>
		<category><![CDATA[Proyectos]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=3150</guid>
		<description><![CDATA[<p>En este post voy a poner el desarrollo sobre la <strong>Unidad Artitmético Lógica</strong> que es una de las secciones más interesantes de un procesador.  De hecho, las veces que me he aproximado a estudiar por dentro los microprocesadores, siempre he empezado por el <strong>ALU</strong>. Tan es así, que lo he implementado en tres formas: la primera fue comprando (hace 20 años) el circuito integrado 74LS181, armándola con compuertas como lo hace <strong>Donn Stewart</strong> en su <a href="http://cpuville.com/ALU.htm" onclick="pageTracker._trackPageview('/outgoing/cpuville.com/ALU.htm?referer=');">página</a> o con la técnica de "micro-código" similar a la que utilicé para hacer la lógica de control para este CPU.</p>
<h4>Diseño de la ALU</h4>
<p>Al igual que en la lógica de control, se van a utilizar memorias EPROM de la familia 27XX. Podemos ver que al proponernos hacer una ALU de 8 bits, las líneas del bus de direcciones son muchas porque se necesitan ocho para el primer dato, ocho para el segundo y tres para el comando de la operación (Total: 19 bits). Para cumplir con el bus de entradas, se necesitaría por lo tanto una memoria de 512 MB.</p>
<p>La solución por lo tanto es dividir el problema en dos y mejor hacer dos ALUs de cuatro bits que estén conectadas en cascada. Para hacer una ALU de cuatro bits se necesitan cuatro bits para el primer dato, cuatro  para el segundo, tres para el comando y uno para la bandera de acarreo (Total: 12 bits). Por lo tanto, es suficiente con dos memorias 2732 para nuestra ALU de 8 bits.</p>
<p align="center">
<a href="http://www.machin.com.mx/wp-content/uploads/2009/09/memoria.gif"><img src="http://www.machin.com.mx/wp-content/uploads/2009/09/memoria-300x249.gif" alt="memoria" title="memoria" width="400" height="333" class="aligncenter size-medium wp-image-3341" /></a><br />
<strong>ALU implementada con dos memorias 2732</strong>
</p>
<p>Al requerir dos memorias EPROM en cascada, se limita enormemente el rendimiento de la CPU. Para fines experimientales, esta bien; pero sin duda se recomienda las otras alternativas si se busca un CPU con mejor rendimiento.</p>
<h4>Programando los EPROMs</h4>
<p>Hacer una tabla a mano para programar las memorias es algo engorroso, por lo que en este caso se hizo un pequeño programa en C que la obtiene por nosotros. El código fuente es el siguiente:</p>
<div class="syntax_hilite">
<div id="cpp-1">
<div class="cpp"><span style="color: #339900;">#include &lt;iostream&gt;</span></p>
<p><span style="color: #339900;">#include &lt;string&gt;</span></p>
<p><span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std;</p>
<p><span style="color: #0000ff;">int</span> main<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>
&nbsp; &nbsp; <span style="color: #0000dd;">cout</span> &lt;&lt;<span style="color: #666666;">"¡Creando ALU EPROM!"</span> &lt;&lt;endl;</p>
<p>&nbsp; &nbsp; <span style="color: #ff0000;">// Abre el archivo</span></p>
<p>&nbsp; &nbsp; <span style="color: #0000ff;">FILE</span> *outstream;</p>
<p>&nbsp; &nbsp; outstream=<span style="color: #0000dd;">fopen</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">"alu.bin"</span>,<span style="color: #666666;">"wb"</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span style="color: #0000ff;">if</span><span style="color: #000000;">&#40;</span> outstream == <span style="color: #0000ff;">NULL</span> <span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000dd;">cout</span> &lt;&lt;<span style="color: #666666;">"No se pudo abrir el archivo"</span> &lt;&lt;endl;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">return</span> -<span style="color: #0000dd;">1</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>
&nbsp; &nbsp; <span style="color: #ff0000;">// Ciclo principal</span></p>
<p>&nbsp; &nbsp; <span style="color: #0000ff;">char</span> alu_command, a, b;<br />
&nbsp; &nbsp; <span style="color: #0000ff;">bool</span> carry_in, carry_out, borrow_out, zero_out;</p>
<p>&nbsp; &nbsp; <span style="color: #0000ff;">int</span> salida;</p>
<p>&nbsp; &nbsp; <span style="color: #0000ff;">for</span><span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">long</span> address = <span style="color: #0000dd;">0</span>; address&lt;0x10000; ++address <span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// Datos de entrada</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; a&nbsp; = address &amp; 0x0f;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; b&nbsp; = <span style="color: #000000;">&#40;</span> address&gt;&gt;<span style="color: #0000dd;">4</span> <span style="color: #000000;">&#41;</span> &amp; 0x0f;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; alu_command= <span style="color: #000000;">&#40;</span> address&gt;&gt; <span style="color: #0000dd;">8</span> <span style="color: #000000;">&#41;</span> &amp; 0x07;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; carry_in = <span style="color: #000000;">&#40;</span> <span style="color: #000000;">&#40;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&#41;</span> address &amp; 0x800 <span style="color: #000000;">&#41;</span> ? <span style="color: #0000ff;">true</span> : <span style="color: #0000ff;">false</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; salida = <span style="color: #0000dd;">0</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; carry_out = <span style="color: #0000ff;">false</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; borrow_out = <span style="color: #0000ff;">false</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; zero_out = <span style="color: #0000ff;">false</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">switch</span><span style="color: #000000;">&#40;</span> alu_command <span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">0</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// NOT</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida = ~a &amp; 0x0f;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">break</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">1</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// LROT</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> carry_in <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;salida = 0x01;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida |= <span style="color: #000000;">&#40;</span> a&lt;&lt;<span style="color: #0000dd;">1</span> <span style="color: #000000;">&#41;</span> &amp; 0x0e;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> <span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">char</span> <span style="color: #000000;">&#41;</span> a &amp; 0x08 <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;carry_out = <span style="color: #0000ff;">true</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">break</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">2</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// RROT</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> carry_in <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;salida = 0x08;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida |= a&gt;&gt;<span style="color: #0000dd;">1</span> &amp; 0x07;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> <span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">char</span> <span style="color: #000000;">&#41;</span> a &amp; 0x01 <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;borrow_out = <span style="color: #0000ff;">true</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">break</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">3</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// ADD</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> carry_in <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;salida = 0x01;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida += <span style="color: #000000;">&#40;</span> a + b <span style="color: #000000;">&#41;</span> &amp; 0x0f;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> a + b&gt; 0x0f <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;carry_out = <span style="color: #0000ff;">true</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">break</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">4</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// SUB</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> carry_in <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;salida = 0x10;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida += <span style="color: #000000;">&#40;</span> a - b <span style="color: #000000;">&#41;</span> &amp; 0x0f;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">break</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">5</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// AND</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida = a &amp; b;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">break</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">6</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// OR</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida = a | b;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">break</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">7</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// XOR</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida = a ^ b;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">break</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// Checa condición de cero</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> salida == <span style="color: #0000dd;">0</span> <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; zero_out = <span style="color: #0000ff;">true</span>;</p>
<p>
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">//&nbsp; Ajusta las banderas</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> carry_out <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida |= 0x10;</p>
<p>
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> borrow_out <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida |= 0x20;</p>
<p>
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> zero_out <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida |= 0x40;</p>
<p>
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000dd;">fputc</span><span style="color: #000000;">&#40;</span> salida, outstream <span style="color: #000000;">&#41;</span>;</p>
<p>
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>
&nbsp; &nbsp; <span style="color: #0000dd;">fclose</span><span style="color: #000000;">&#40;</span>outstream<span style="color: #000000;">&#41;</span>;</p>
<p>
&nbsp; &nbsp; <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span>;</p>
<p><span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p></p>
<h4>Nota importante:</h4>
<p>La construcción del CPU se está llevando justo ahorita, por lo que toda la información presentada en este  post puede estar incompleta o incorrecta al ser de carácter provisional.</p>

]]></description>
			<content:encoded><![CDATA[<p>En este post voy a poner el desarrollo sobre la <strong>Unidad Artitmético Lógica</strong> que es una de las secciones más interesantes de un procesador.  De hecho, las veces que me he aproximado a estudiar por dentro los microprocesadores, siempre he empezado por el <strong>ALU</strong>. Tan es así, que lo he implementado en tres formas: la primera fue comprando (hace 20 años) el circuito integrado 74LS181, armándola con compuertas como lo hace <strong>Donn Stewart</strong> en su <a href="http://cpuville.com/ALU.htm" onclick="pageTracker._trackPageview('/outgoing/cpuville.com/ALU.htm?referer=');">página</a> o con la técnica de "micro-código" similar a la que utilicé para hacer la lógica de control para este CPU.</p>
<h4>Diseño de la ALU</h4>
<p>Al igual que en la lógica de control, se van a utilizar memorias EPROM de la familia 27XX. Podemos ver que al proponernos hacer una ALU de 8 bits, las líneas del bus de direcciones son muchas porque se necesitan ocho para el primer dato, ocho para el segundo y tres para el comando de la operación (Total: 19 bits). Para cumplir con el bus de entradas, se necesitaría por lo tanto una memoria de 512 MB.</p>
<p>La solución por lo tanto es dividir el problema en dos y mejor hacer dos ALUs de cuatro bits que estén conectadas en cascada. Para hacer una ALU de cuatro bits se necesitan cuatro bits para el primer dato, cuatro  para el segundo, tres para el comando y uno para la bandera de acarreo (Total: 12 bits). Por lo tanto, es suficiente con dos memorias 2732 para nuestra ALU de 8 bits.</p>
<p align="center">
<a href="http://www.machin.com.mx/wp-content/uploads/2009/09/memoria.gif"><img src="http://www.machin.com.mx/wp-content/uploads/2009/09/memoria-300x249.gif" alt="memoria" title="memoria" width="400" height="333" class="aligncenter size-medium wp-image-3341" /></a><br />
<strong>ALU implementada con dos memorias 2732</strong>
</p>
<p>Al requerir dos memorias EPROM en cascada, se limita enormemente el rendimiento de la CPU. Para fines experimientales, esta bien; pero sin duda se recomienda las otras alternativas si se busca un CPU con mejor rendimiento.</p>
<h4>Programando los EPROMs</h4>
<p>Hacer una tabla a mano para programar las memorias es algo engorroso, por lo que en este caso se hizo un pequeño programa en C que la obtiene por nosotros. El código fuente es el siguiente:</p>
<div class="syntax_hilite">
<div id="cpp-2">
<div class="cpp"><span style="color: #339900;">#include &lt;iostream&gt;</span></p>
<p><span style="color: #339900;">#include &lt;string&gt;</span></p>
<p><span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std;</p>
<p><span style="color: #0000ff;">int</span> main<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>
&nbsp; &nbsp; <span style="color: #0000dd;">cout</span> &lt;&lt;<span style="color: #666666;">"¡Creando ALU EPROM!"</span> &lt;&lt;endl;</p>
<p>&nbsp; &nbsp; <span style="color: #ff0000;">// Abre el archivo</span></p>
<p>&nbsp; &nbsp; <span style="color: #0000ff;">FILE</span> *outstream;</p>
<p>&nbsp; &nbsp; outstream=<span style="color: #0000dd;">fopen</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">"alu.bin"</span>,<span style="color: #666666;">"wb"</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span style="color: #0000ff;">if</span><span style="color: #000000;">&#40;</span> outstream == <span style="color: #0000ff;">NULL</span> <span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000dd;">cout</span> &lt;&lt;<span style="color: #666666;">"No se pudo abrir el archivo"</span> &lt;&lt;endl;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">return</span> -<span style="color: #0000dd;">1</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>
&nbsp; &nbsp; <span style="color: #ff0000;">// Ciclo principal</span></p>
<p>&nbsp; &nbsp; <span style="color: #0000ff;">char</span> alu_command, a, b;<br />
&nbsp; &nbsp; <span style="color: #0000ff;">bool</span> carry_in, carry_out, borrow_out, zero_out;</p>
<p>&nbsp; &nbsp; <span style="color: #0000ff;">int</span> salida;</p>
<p>&nbsp; &nbsp; <span style="color: #0000ff;">for</span><span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">long</span> address = <span style="color: #0000dd;">0</span>; address&lt;0x10000; ++address <span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// Datos de entrada</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; a&nbsp; = address &amp; 0x0f;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; b&nbsp; = <span style="color: #000000;">&#40;</span> address&gt;&gt;<span style="color: #0000dd;">4</span> <span style="color: #000000;">&#41;</span> &amp; 0x0f;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; alu_command= <span style="color: #000000;">&#40;</span> address&gt;&gt; <span style="color: #0000dd;">8</span> <span style="color: #000000;">&#41;</span> &amp; 0x07;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; carry_in = <span style="color: #000000;">&#40;</span> <span style="color: #000000;">&#40;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&#41;</span> address &amp; 0x800 <span style="color: #000000;">&#41;</span> ? <span style="color: #0000ff;">true</span> : <span style="color: #0000ff;">false</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; salida = <span style="color: #0000dd;">0</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; carry_out = <span style="color: #0000ff;">false</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; borrow_out = <span style="color: #0000ff;">false</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; zero_out = <span style="color: #0000ff;">false</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">switch</span><span style="color: #000000;">&#40;</span> alu_command <span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">0</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// NOT</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida = ~a &amp; 0x0f;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">break</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">1</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// LROT</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> carry_in <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;salida = 0x01;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida |= <span style="color: #000000;">&#40;</span> a&lt;&lt;<span style="color: #0000dd;">1</span> <span style="color: #000000;">&#41;</span> &amp; 0x0e;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> <span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">char</span> <span style="color: #000000;">&#41;</span> a &amp; 0x08 <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;carry_out = <span style="color: #0000ff;">true</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">break</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">2</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// RROT</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> carry_in <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;salida = 0x08;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida |= a&gt;&gt;<span style="color: #0000dd;">1</span> &amp; 0x07;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> <span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">char</span> <span style="color: #000000;">&#41;</span> a &amp; 0x01 <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;borrow_out = <span style="color: #0000ff;">true</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">break</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">3</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// ADD</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> carry_in <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;salida = 0x01;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida += <span style="color: #000000;">&#40;</span> a + b <span style="color: #000000;">&#41;</span> &amp; 0x0f;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> a + b&gt; 0x0f <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;carry_out = <span style="color: #0000ff;">true</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">break</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">4</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// SUB</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> carry_in <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;salida = 0x10;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida += <span style="color: #000000;">&#40;</span> a - b <span style="color: #000000;">&#41;</span> &amp; 0x0f;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">break</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">5</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// AND</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida = a &amp; b;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">break</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">6</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// OR</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida = a | b;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">break</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">7</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// XOR</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida = a ^ b;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">break</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// Checa condición de cero</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> salida == <span style="color: #0000dd;">0</span> <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; zero_out = <span style="color: #0000ff;">true</span>;</p>
<p>
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">//&nbsp; Ajusta las banderas</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> carry_out <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida |= 0x10;</p>
<p>
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> borrow_out <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida |= 0x20;</p>
<p>
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> zero_out <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salida |= 0x40;</p>
<p>
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000dd;">fputc</span><span style="color: #000000;">&#40;</span> salida, outstream <span style="color: #000000;">&#41;</span>;</p>
<p>
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>
&nbsp; &nbsp; <span style="color: #0000dd;">fclose</span><span style="color: #000000;">&#40;</span>outstream<span style="color: #000000;">&#41;</span>;</p>
<p>
&nbsp; &nbsp; <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span>;</p>
<p><span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p></p>
<h4>Nota importante:</h4>
<p>La construcción del CPU se está llevando justo ahorita, por lo que toda la información presentada en este  post puede estar incompleta o incorrecta al ser de carácter provisional.</p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/3150/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Proyecto: Construyendo un CPU con circuitos básicos (parte 5)</title>
		<link>http://www.machin.com.mx/archives/2847</link>
		<comments>http://www.machin.com.mx/archives/2847#comments</comments>
		<pubDate>Mon, 28 Sep 2009 02:48:58 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Arqueología Machinesca]]></category>
		<category><![CDATA[CPU hecha en casa]]></category>
		<category><![CDATA[Electrónica]]></category>
		<category><![CDATA[Proyectos]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=2847</guid>
		<description><![CDATA[<p>Durante el transcurso de este post se va a desarrollar la <strong>Unidad de Control</strong>. Desde mi punto de vista, es la  parte  más interesante porque aunque sencilla en concepto, es el corazón del procesador y su diseño es lo  que nos llevó a los humanos a crear un nuevo tipo de máquinas: las programables.</p>
<h4>Unidad de control</h4>
<p>La <strong>Unidad de control</strong> esta formada por varias partes: registro de estado, secuenciador, decodificador de estado y la lógica de control. Esta última  nos produce las señales de control que son utilizadas para la implementación en hardware de cada una de las instrucciones. El diagrama de la unidad de Control es el siguiente:</p>
<p align="center">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/09/UnidadControl.jpg" alt="UnidadControl" title="UnidadControl" width="375" height="349"  /><br />
<strong>Figura 5.1 Unidad de Control</strong>
</p>
<p>El trabajo de la <strong>Unidad de Control</strong> consiste en  hacer pasar cada instrucción por varios "estados" en los cuales se va realizando por partes su operación. A pesar de tener diferentes instrucciones, los estados son compartidos entre ellas por tener funciones similares. Por ejemplo, todas las instrucciones al inicio deben cargar su operando e incrementar el contador de programa; todas las instrucciones matemáticas en nuestro diseño deben cargar un operando y guardar el resultado en el acumulador. Las operaciones lógicas también guardan el resultado en el acumulador.</p>
<h4>Registro de Estado</h4>
<p>Nuestro <strong>Registro de Estado</strong> va a ser de 4 bits, lo cual nos va a permitir manejar hasta 16 estados diferentes; lo cual es suficiente para un procesador de esta escala y a su vez, nos va a simplificar el desarrollo posterior de nuestro secuenciador al disminuir su número de entradas..</p>
<h4>Estados de Control</h4>
<p>El diseño de nuestros estados se debe pensar detenidamente porque de él depende en gran medida el hardware a implementar y la velocidad de las instrucciones. Si dividimos una orden en muchos ciclos, el microprocesador ejecutará menos instrucciones por segundo. Si juntamos muchas instrucciones en un sólo estado, es posible que aumentemos el hardware necesario.</p>
<p>En la siguiente tabla definimos los estados de control de nuestro procesador:</p>
<table width="100%" border="1">
<tr>
<td width="10%"><b>Número</b></td>
<td width="30%"><b>Acción</b></td>
<td width="30%"><b>Instrucciones</b></td>
<td width="40%"><b>Actividades</b></td>
</tr>
<tr>
<td valign="top">0</td>
<td valign="top">Obtención de la instrucción a ejecutar.</td>
<td valign="top">Todas</td>
<td valign="top">1. Carga la instrucción en el registro de instruccón.<br />
2. Incrementa el contador de programa.
</td>
</tr>
<tr>
<td valign="top">1</td>
<td valign="top">Obtención de operando en instrucciones de 2 bytes</td>
<td valign="top">"LD A, #", "LD IX, #",  "LD A, $",  "LD A, IX:$",  "LD $, A",  "LD IX:$, A",  "JMP IX:$",  "JPC IX:$",  "JPZ IX:$", "JPM IX:$", "JMP",  "JPC", "JPZ", "JPM",  "LROT", "RROT", "AND", "OR", "XOR",  "ADD", "SUB"</td>
<td valign="top">1. Carga el operando en el registro de datos.<br />
2. Incrementa el contador de programa.
</td>
</tr>
<tr>
<td valign="top">2</td>
<td valign="top">Carga al acumulador con dato inmediato.</td>
<td valign="top">"LD A, #"</td>
<td valign="top">1. Carga al acumulador con dato inmediato.
</td>
</tr>
<tr>
<td valign="top">3</td>
<td valign="top">Carga al registro índice con dato inmediato.</td>
<td valign="top">"LD I, #"</td>
<td valign="top">1. Carga al registro índice con dato inmediato.
</td>
</tr>
<tr>
<td valign="top">4</td>
<td valign="top">Carga indexada o de página al acumulador</td>
<td valign="top">"LD A, $", "LD A, IX:$"</td>
<td valign="top">1. Selecciona a usar el registro IX o los últimos 4 bits del contador de programa.<br />
2. Carga al acumulador con dato en memoria.
</td>
</tr>
<tr>
<td valign="top">5</td>
<td valign="top">Carga indexada o de página del valor del acumulador</td>
<td valign="top">"LD $, A", "LD IX:$, A"</td>
<td valign="top">1. Selecciona a usar el registro IX o los últimos 4 bits del contador de programa.<br />
2. Guarda en la memoria el contenido del acumulador.
</td>
</tr>
<tr>
<td valign="top">6</td>
<td valign="top">Brinco Indexado</td>
<td valign="top">"JMP IX:$", "JPC IX:$", "JPZ IX:$", "JPM IX:$"</td>
<td valign="top">1. Si se cumple la condición, carga el Contador de programa con el operando y el registro indice.
</td>
</tr>
<tr>
<td valign="top">7</td>
<td valign="top">Brinco Inmediato</td>
<td valign="top">JMP, JMZ, JPC JPM</td>
<td valign="top">1. Si se cumple la condición, carga el Contador de programa con el operando
</td>
</tr>
<tr>
<td valign="top">8</td>
<td valign="top">Realiza operación lógica sobre el acumulador.</td>
<td valign="top">"NOT", "LROT", "RROT", "AND", "OR", "XOR"</td>
<td valign="top">1. Realiza operación lógica sobre el acumulador por medio de la ALU.
</td>
</tr>
<tr>
<td valign="top">9</td>
<td valign="top">Realiza operación aritmética sobre el acumulador</td>
<td valign="top">"ADD", "SUB"</td>
<td valign="top">1. Realiza operación aritmética sobre el acumulador por medio de la ALU.
</td>
</tr>
<tr>
<td valign="top">10</td>
<td valign="top">Operaciones de entrada.</td>
<td valign="top">"IN 0", "IN 1", "IN 2", "IN 3"</td>
<td valign="top">1. Realiza salida/entrada sobre el acumulador.
</td>
</tr>
<tr>
<td valign="top">11</td>
<td valign="top">Operaciones de salida.</td>
<td valign="top">"OUT 0", "OUT 1", "OUT 2", "OUT 3"</td>
<td valign="top">1. Realiza salida/entrada sobre el acumulador.
</td>
</tr>
<tr>
<td valign="top">12</td>
<td valign="top">Retorno a estado inicial</td>
<td valign="top">"LD A, #", "LD IX, #",  "LD A, $",  "LD A, IX:$",  "LD $, A",  "LD IX:$, A",  "JMP IX:$",  "JPC IX:$",  "JPZ IX:$", "JPM IX:$", "JMP",  "JPC", "JPZ", "JPM",  "NOT", "LROT", "RROT", "AND", "OR", "XOR",  "ADD", "SUB"</td>
<td valign="top">1. Termina cualquier ciclo pendiente.
</td>
</tr>
</table>
<p><H4>Secuenciador</H4></p>
<p>Ahora que tenemos definidos nuestros estados, el siguiente paso es diseñar la "secuencia" que estos estados van a seguir para ejecutar nuestro set de instrucciones. Para mi procesador el diagrama de estado es el siguiente:</p>
<p align="center">
<a href="http://www.machin.com.mx/wp-content/uploads/2009/09/Secuenciador.jpeg"><img src="http://www.machin.com.mx/wp-content/uploads/2009/09/Secuenciador-300x205.jpg" alt="Secuenciador" title="Secuenciador" width="300" height="205"  /></a><br />
<strong>Figura 5.2 Máquina de estados de las instrucciones del procesador</strong>
</p>
<p>Con el estado actual y la orden a ejecutarse es como se obtiene el siguiente estado con una simple tabla de correspondencia a la cual llamamos secuenciador. La implementación en hardware del secuenciador se puede obtener utilizando compuertas. Sin embargo, el resultado puede requerir una gran cantidad de circuitos integrados y una difícil escalabilidad a futuro, pues cada modificación requeriría cambios en el hardware. Es por eso que en esta parte he sacrificado el diseño con compuertas ( que podría hacer el proyecto más interesante ) por el uso de una memoria EPROM ( que lo hace escalable y sencillo de modificar y depurar ). </p>
<p>De hecho, en la década de los sesentas del siglo veinte, los fabricantes de computadoras empezaron a usar esta técnica no solamente para reducir el número de circuitos; sino también para poderlos actualizar, ampliar o corregir sin modificar el hardware. A este tipo de firmware se le conoce como "microcódigo" y es una técnica muy recurrida incluso en la actualidad.</p>
<p>En este diseño, sirven como entrada las banderas de estado para simplificar la implantación en hardware de los saltos condicionales.</p>
<h4>Implementación en hardware</h4>
<p>El diagrama esquemático de la parte principal de la lógica de control es el siguiente:</p>
<p align="center">
<a href="http://www.machin.com.mx/wp-content/uploads/2009/09/controlunit.jpg" ><img src="http://www.machin.com.mx/wp-content/uploads/2009/09/controlunit-300x131.jpg" alt="controlunit" title="controlunit" width="400" height="171"  /></a><br />
<strong>Figura 5.3 Diagrama esquemático del sistema de control - 1</strong>
</p>
<p>Aqui podemos apreciar que el secuenciador esta elaborado con una memoria 2732, el registro de estado al igual que el registro de instrucción esta fabricado con un circuito integrados 74175 para que al aplicar la señal de reinicio pongan como estado inicial el cero. El decodificador de estado esta hecho con un circuito 74LS154.</p>
<p><strong>Registro de Datos</strong></p>
<p>De igual forma que guardamos en un registro la instrucción, es conveniente agregar un registro para el dato que contiene las instrucciones de dos bytes para tenerlo disponible en los otros estados. En este caso como no nos interesa que el registro este inicializado a ceros podemos usar un solo integrado 74LS374 para esta función.</p>
<p><center><br />
<a href="http://www.machin.com.mx/wp-content/uploads/2009/09/DataRegister.jpg"><img src="http://www.machin.com.mx/wp-content/uploads/2009/09/DataRegister-300x133.jpg" alt="DataRegister" title="DataRegister" width="400" height="173"  /></a><br />
<strong>Figura 5.4 Circuito del Registro de datos</strong><br />
</center></p>
<p><strong>Contenido del EPROM</strong></p>
<p>Con ayuda de la máquina de estados del diagrama 5.2, podemos armar la tabla que va ir contenida en la memoria EPROM:</p>
<table width="100%" border="1">
<tr>
<td><b>Estado actual (4 bits)</b></td>
<td><b>Operación (7 bits)</b></td>
<td><b>Hex</b></td>
<td><b>Siguiente estado (4 bits)</b></td>
<td><strong>Hex</strong></td>
</tr>
<tr>
<td>0000</td>
<td>0000-0000</td>
<td>000</td>
<td>0000</td>
<td>00</td>
</tr>
<tr>
<td>0000</td>
<td>0000-0001->0000-1110</td>
<td>001->00E</td>
<td>0001</td>
<td>01</td>
</tr>
<tr>
<td>0000</td>
<td>0010-0000->0010-0011</td>
<td>020->023</td>
<td>1010</td>
<td>0A</td>
</tr>
<tr>
<td>0000</td>
<td>0011-0000->0011-0011</td>
<td>030->033</td>
<td>1011</td>
<td>0B</td>
</tr>
<tr>
<td>0000</td>
<td>0100-0000->0100-0010</td>
<td>040->042</td>
<td>1000</td>
<td>08</td>
</tr>
<tr>
<td>0000</td>
<td>0100-0011->0100-0111</td>
<td>043->047</td>
<td>0001</td>
<td>01</td>
</tr>
<tr>
<td>0001</td>
<td>0000-0001</td>
<td>101</td>
<td>0010</td>
<td>02</td>
</tr>
<tr>
<td>0001</td>
<td>0000-0010</td>
<td>102</td>
<td>0011</td>
<td>03</td>
</tr>
<tr>
<td>0001</td>
<td>0000-0011->0000-0100</td>
<td>103->104</td>
<td>0100</td>
<td>04</td>
</tr>
<tr>
<td>0001</td>
<td>0000-0101->0000-0110</td>
<td>105->106</td>
<td>0101</td>
<td>05</td>
</tr>
<tr>
<td>0001</td>
<td>0000-0111->0000-1010</td>
<td>107->10A</td>
<td>0110</td>
<td>06</td>
</tr>
<tr>
<td>0001</td>
<td>0000-1011->0000-1110</td>
<td>10B->10E</td>
<td>0111</td>
<td>07</td>
</tr>
<tr>
<td>0001</td>
<td>1000-0011->1000-0111</td>
<td>143->147</td>
<td>1001</td>
<td>09</td>
</tr>
<tr>
<td>0010</td>
<td>0000-0001</td>
<td>201</td>
<td>1100</td>
<td>0C</td>
</tr>
<tr>
<td>0011</td>
<td>0000-0010</td>
<td>302</td>
<td>1100</td>
<td>0C</td>
</tr>
<tr>
<td>0100</td>
<td>0000-0011->0000-0100</td>
<td>403->404</td>
<td>1100</td>
<td>0C</td>
</tr>
<tr>
<td>0101</td>
<td>0000-0101->0000-0110</td>
<td>505->506</td>
<td>1100</td>
<td>0C</td>
</tr>
<tr>
<td>0110</td>
<td>0000-0111->0000-1010</td>
<td>607->60A</td>
<td>1100</td>
<td>0C</td>
</tr>
<tr>
<td>0111</td>
<td>0000-1011->0000-1110</td>
<td>70B->70E</td>
<td>1100</td>
<td>0C</td>
</tr>
<tr>
<td>1000</td>
<td>0100-0000->0100-0010</td>
<td>840->842</td>
<td>0000</td>
<td>00</td>
</tr>
<tr>
<td>1001</td>
<td>0100-0011->0100-0111</td>
<td>943->847</td>
<td>1100</td>
<td>0C</td>
</tr>
<tr>
<td>1010</td>
<td>0010-0000->0010-0011</td>
<td>A20->A23</td>
<td>0000</td>
<td>00</td>
</tr>
<tr>
<td>1011</td>
<td>0011-0000->0011-0011</td>
<td>B30->B33</td>
<td>0000</td>
<td>00</td>
</tr>
<tr>
<td>1100</td>
<td></td>
<td></td>
<td>0000</td>
<td>00</td>
</tr>
</tr>
</table>
<p><strong>Señales de control</strong></p>
<h4>Nota importante:</h4>
<p>La construcción del CPU se está llevando justo ahorita, por lo que toda la información presentada en este  post puede estar incompleta o incorrecta al ser de carácter provisional.</p>

]]></description>
			<content:encoded><![CDATA[<p>Durante el transcurso de este post se va a desarrollar la <strong>Unidad de Control</strong>. Desde mi punto de vista, es la  parte  más interesante porque aunque sencilla en concepto, es el corazón del procesador y su diseño es lo  que nos llevó a los humanos a crear un nuevo tipo de máquinas: las programables.</p>
<h4>Unidad de control</h4>
<p>La <strong>Unidad de control</strong> esta formada por varias partes: registro de estado, secuenciador, decodificador de estado y la lógica de control. Esta última  nos produce las señales de control que son utilizadas para la implementación en hardware de cada una de las instrucciones. El diagrama de la unidad de Control es el siguiente:</p>
<p align="center">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/09/UnidadControl.jpg" alt="UnidadControl" title="UnidadControl" width="375" height="349"  /><br />
<strong>Figura 5.1 Unidad de Control</strong>
</p>
<p>El trabajo de la <strong>Unidad de Control</strong> consiste en  hacer pasar cada instrucción por varios "estados" en los cuales se va realizando por partes su operación. A pesar de tener diferentes instrucciones, los estados son compartidos entre ellas por tener funciones similares. Por ejemplo, todas las instrucciones al inicio deben cargar su operando e incrementar el contador de programa; todas las instrucciones matemáticas en nuestro diseño deben cargar un operando y guardar el resultado en el acumulador. Las operaciones lógicas también guardan el resultado en el acumulador.</p>
<h4>Registro de Estado</h4>
<p>Nuestro <strong>Registro de Estado</strong> va a ser de 4 bits, lo cual nos va a permitir manejar hasta 16 estados diferentes; lo cual es suficiente para un procesador de esta escala y a su vez, nos va a simplificar el desarrollo posterior de nuestro secuenciador al disminuir su número de entradas..</p>
<h4>Estados de Control</h4>
<p>El diseño de nuestros estados se debe pensar detenidamente porque de él depende en gran medida el hardware a implementar y la velocidad de las instrucciones. Si dividimos una orden en muchos ciclos, el microprocesador ejecutará menos instrucciones por segundo. Si juntamos muchas instrucciones en un sólo estado, es posible que aumentemos el hardware necesario.</p>
<p>En la siguiente tabla definimos los estados de control de nuestro procesador:</p>
<table width="100%" border="1">
<tr>
<td width="10%"><b>Número</b></td>
<td width="30%"><b>Acción</b></td>
<td width="30%"><b>Instrucciones</b></td>
<td width="40%"><b>Actividades</b></td>
</tr>
<tr>
<td valign="top">0</td>
<td valign="top">Obtención de la instrucción a ejecutar.</td>
<td valign="top">Todas</td>
<td valign="top">1. Carga la instrucción en el registro de instruccón.<br />
2. Incrementa el contador de programa.
</td>
</tr>
<tr>
<td valign="top">1</td>
<td valign="top">Obtención de operando en instrucciones de 2 bytes</td>
<td valign="top">"LD A, #", "LD IX, #",  "LD A, $",  "LD A, IX:$",  "LD $, A",  "LD IX:$, A",  "JMP IX:$",  "JPC IX:$",  "JPZ IX:$", "JPM IX:$", "JMP",  "JPC", "JPZ", "JPM",  "LROT", "RROT", "AND", "OR", "XOR",  "ADD", "SUB"</td>
<td valign="top">1. Carga el operando en el registro de datos.<br />
2. Incrementa el contador de programa.
</td>
</tr>
<tr>
<td valign="top">2</td>
<td valign="top">Carga al acumulador con dato inmediato.</td>
<td valign="top">"LD A, #"</td>
<td valign="top">1. Carga al acumulador con dato inmediato.
</td>
</tr>
<tr>
<td valign="top">3</td>
<td valign="top">Carga al registro índice con dato inmediato.</td>
<td valign="top">"LD I, #"</td>
<td valign="top">1. Carga al registro índice con dato inmediato.
</td>
</tr>
<tr>
<td valign="top">4</td>
<td valign="top">Carga indexada o de página al acumulador</td>
<td valign="top">"LD A, $", "LD A, IX:$"</td>
<td valign="top">1. Selecciona a usar el registro IX o los últimos 4 bits del contador de programa.<br />
2. Carga al acumulador con dato en memoria.
</td>
</tr>
<tr>
<td valign="top">5</td>
<td valign="top">Carga indexada o de página del valor del acumulador</td>
<td valign="top">"LD $, A", "LD IX:$, A"</td>
<td valign="top">1. Selecciona a usar el registro IX o los últimos 4 bits del contador de programa.<br />
2. Guarda en la memoria el contenido del acumulador.
</td>
</tr>
<tr>
<td valign="top">6</td>
<td valign="top">Brinco Indexado</td>
<td valign="top">"JMP IX:$", "JPC IX:$", "JPZ IX:$", "JPM IX:$"</td>
<td valign="top">1. Si se cumple la condición, carga el Contador de programa con el operando y el registro indice.
</td>
</tr>
<tr>
<td valign="top">7</td>
<td valign="top">Brinco Inmediato</td>
<td valign="top">JMP, JMZ, JPC JPM</td>
<td valign="top">1. Si se cumple la condición, carga el Contador de programa con el operando
</td>
</tr>
<tr>
<td valign="top">8</td>
<td valign="top">Realiza operación lógica sobre el acumulador.</td>
<td valign="top">"NOT", "LROT", "RROT", "AND", "OR", "XOR"</td>
<td valign="top">1. Realiza operación lógica sobre el acumulador por medio de la ALU.
</td>
</tr>
<tr>
<td valign="top">9</td>
<td valign="top">Realiza operación aritmética sobre el acumulador</td>
<td valign="top">"ADD", "SUB"</td>
<td valign="top">1. Realiza operación aritmética sobre el acumulador por medio de la ALU.
</td>
</tr>
<tr>
<td valign="top">10</td>
<td valign="top">Operaciones de entrada.</td>
<td valign="top">"IN 0", "IN 1", "IN 2", "IN 3"</td>
<td valign="top">1. Realiza salida/entrada sobre el acumulador.
</td>
</tr>
<tr>
<td valign="top">11</td>
<td valign="top">Operaciones de salida.</td>
<td valign="top">"OUT 0", "OUT 1", "OUT 2", "OUT 3"</td>
<td valign="top">1. Realiza salida/entrada sobre el acumulador.
</td>
</tr>
<tr>
<td valign="top">12</td>
<td valign="top">Retorno a estado inicial</td>
<td valign="top">"LD A, #", "LD IX, #",  "LD A, $",  "LD A, IX:$",  "LD $, A",  "LD IX:$, A",  "JMP IX:$",  "JPC IX:$",  "JPZ IX:$", "JPM IX:$", "JMP",  "JPC", "JPZ", "JPM",  "NOT", "LROT", "RROT", "AND", "OR", "XOR",  "ADD", "SUB"</td>
<td valign="top">1. Termina cualquier ciclo pendiente.
</td>
</tr>
</table>
<p><H4>Secuenciador</H4></p>
<p>Ahora que tenemos definidos nuestros estados, el siguiente paso es diseñar la "secuencia" que estos estados van a seguir para ejecutar nuestro set de instrucciones. Para mi procesador el diagrama de estado es el siguiente:</p>
<p align="center">
<a href="http://www.machin.com.mx/wp-content/uploads/2009/09/Secuenciador.jpeg"><img src="http://www.machin.com.mx/wp-content/uploads/2009/09/Secuenciador-300x205.jpg" alt="Secuenciador" title="Secuenciador" width="300" height="205"  /></a><br />
<strong>Figura 5.2 Máquina de estados de las instrucciones del procesador</strong>
</p>
<p>Con el estado actual y la orden a ejecutarse es como se obtiene el siguiente estado con una simple tabla de correspondencia a la cual llamamos secuenciador. La implementación en hardware del secuenciador se puede obtener utilizando compuertas. Sin embargo, el resultado puede requerir una gran cantidad de circuitos integrados y una difícil escalabilidad a futuro, pues cada modificación requeriría cambios en el hardware. Es por eso que en esta parte he sacrificado el diseño con compuertas ( que podría hacer el proyecto más interesante ) por el uso de una memoria EPROM ( que lo hace escalable y sencillo de modificar y depurar ). </p>
<p>De hecho, en la década de los sesentas del siglo veinte, los fabricantes de computadoras empezaron a usar esta técnica no solamente para reducir el número de circuitos; sino también para poderlos actualizar, ampliar o corregir sin modificar el hardware. A este tipo de firmware se le conoce como "microcódigo" y es una técnica muy recurrida incluso en la actualidad.</p>
<p>En este diseño, sirven como entrada las banderas de estado para simplificar la implantación en hardware de los saltos condicionales.</p>
<h4>Implementación en hardware</h4>
<p>El diagrama esquemático de la parte principal de la lógica de control es el siguiente:</p>
<p align="center">
<a href="http://www.machin.com.mx/wp-content/uploads/2009/09/controlunit.jpg" ><img src="http://www.machin.com.mx/wp-content/uploads/2009/09/controlunit-300x131.jpg" alt="controlunit" title="controlunit" width="400" height="171"  /></a><br />
<strong>Figura 5.3 Diagrama esquemático del sistema de control - 1</strong>
</p>
<p>Aqui podemos apreciar que el secuenciador esta elaborado con una memoria 2732, el registro de estado al igual que el registro de instrucción esta fabricado con un circuito integrados 74175 para que al aplicar la señal de reinicio pongan como estado inicial el cero. El decodificador de estado esta hecho con un circuito 74LS154.</p>
<p><strong>Registro de Datos</strong></p>
<p>De igual forma que guardamos en un registro la instrucción, es conveniente agregar un registro para el dato que contiene las instrucciones de dos bytes para tenerlo disponible en los otros estados. En este caso como no nos interesa que el registro este inicializado a ceros podemos usar un solo integrado 74LS374 para esta función.</p>
<p><center><br />
<a href="http://www.machin.com.mx/wp-content/uploads/2009/09/DataRegister.jpg"><img src="http://www.machin.com.mx/wp-content/uploads/2009/09/DataRegister-300x133.jpg" alt="DataRegister" title="DataRegister" width="400" height="173"  /></a><br />
<strong>Figura 5.4 Circuito del Registro de datos</strong><br />
</center></p>
<p><strong>Contenido del EPROM</strong></p>
<p>Con ayuda de la máquina de estados del diagrama 5.2, podemos armar la tabla que va ir contenida en la memoria EPROM:</p>
<table width="100%" border="1">
<tr>
<td><b>Estado actual (4 bits)</b></td>
<td><b>Operación (7 bits)</b></td>
<td><b>Hex</b></td>
<td><b>Siguiente estado (4 bits)</b></td>
<td><strong>Hex</strong></td>
</tr>
<tr>
<td>0000</td>
<td>0000-0000</td>
<td>000</td>
<td>0000</td>
<td>00</td>
</tr>
<tr>
<td>0000</td>
<td>0000-0001->0000-1110</td>
<td>001->00E</td>
<td>0001</td>
<td>01</td>
</tr>
<tr>
<td>0000</td>
<td>0010-0000->0010-0011</td>
<td>020->023</td>
<td>1010</td>
<td>0A</td>
</tr>
<tr>
<td>0000</td>
<td>0011-0000->0011-0011</td>
<td>030->033</td>
<td>1011</td>
<td>0B</td>
</tr>
<tr>
<td>0000</td>
<td>0100-0000->0100-0010</td>
<td>040->042</td>
<td>1000</td>
<td>08</td>
</tr>
<tr>
<td>0000</td>
<td>0100-0011->0100-0111</td>
<td>043->047</td>
<td>0001</td>
<td>01</td>
</tr>
<tr>
<td>0001</td>
<td>0000-0001</td>
<td>101</td>
<td>0010</td>
<td>02</td>
</tr>
<tr>
<td>0001</td>
<td>0000-0010</td>
<td>102</td>
<td>0011</td>
<td>03</td>
</tr>
<tr>
<td>0001</td>
<td>0000-0011->0000-0100</td>
<td>103->104</td>
<td>0100</td>
<td>04</td>
</tr>
<tr>
<td>0001</td>
<td>0000-0101->0000-0110</td>
<td>105->106</td>
<td>0101</td>
<td>05</td>
</tr>
<tr>
<td>0001</td>
<td>0000-0111->0000-1010</td>
<td>107->10A</td>
<td>0110</td>
<td>06</td>
</tr>
<tr>
<td>0001</td>
<td>0000-1011->0000-1110</td>
<td>10B->10E</td>
<td>0111</td>
<td>07</td>
</tr>
<tr>
<td>0001</td>
<td>1000-0011->1000-0111</td>
<td>143->147</td>
<td>1001</td>
<td>09</td>
</tr>
<tr>
<td>0010</td>
<td>0000-0001</td>
<td>201</td>
<td>1100</td>
<td>0C</td>
</tr>
<tr>
<td>0011</td>
<td>0000-0010</td>
<td>302</td>
<td>1100</td>
<td>0C</td>
</tr>
<tr>
<td>0100</td>
<td>0000-0011->0000-0100</td>
<td>403->404</td>
<td>1100</td>
<td>0C</td>
</tr>
<tr>
<td>0101</td>
<td>0000-0101->0000-0110</td>
<td>505->506</td>
<td>1100</td>
<td>0C</td>
</tr>
<tr>
<td>0110</td>
<td>0000-0111->0000-1010</td>
<td>607->60A</td>
<td>1100</td>
<td>0C</td>
</tr>
<tr>
<td>0111</td>
<td>0000-1011->0000-1110</td>
<td>70B->70E</td>
<td>1100</td>
<td>0C</td>
</tr>
<tr>
<td>1000</td>
<td>0100-0000->0100-0010</td>
<td>840->842</td>
<td>0000</td>
<td>00</td>
</tr>
<tr>
<td>1001</td>
<td>0100-0011->0100-0111</td>
<td>943->847</td>
<td>1100</td>
<td>0C</td>
</tr>
<tr>
<td>1010</td>
<td>0010-0000->0010-0011</td>
<td>A20->A23</td>
<td>0000</td>
<td>00</td>
</tr>
<tr>
<td>1011</td>
<td>0011-0000->0011-0011</td>
<td>B30->B33</td>
<td>0000</td>
<td>00</td>
</tr>
<tr>
<td>1100</td>
<td></td>
<td></td>
<td>0000</td>
<td>00</td>
</tr>
</tr>
</table>
<p><strong>Señales de control</strong></p>
<h4>Nota importante:</h4>
<p>La construcción del CPU se está llevando justo ahorita, por lo que toda la información presentada en este  post puede estar incompleta o incorrecta al ser de carácter provisional.</p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/2847/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Proyecto: Construyendo un CPU con circuitos básicos (parte 4)</title>
		<link>http://www.machin.com.mx/archives/3826</link>
		<comments>http://www.machin.com.mx/archives/3826#comments</comments>
		<pubDate>Sat, 26 Sep 2009 08:00:24 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Arqueología Machinesca]]></category>
		<category><![CDATA[CPU hecha en casa]]></category>
		<category><![CDATA[Electrónica]]></category>
		<category><![CDATA[Proyectos]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=3826</guid>
		<description><![CDATA[<p>En este post se va a tratar el diseño del <strong>contador de programa</strong> que es el encargado de señalar la instrucción a ejecutar y el <strong>sistema de memoria</strong> donde se almacenan tanto las instrucciones del programa que se esta ejecutando y la memoria de datos. Con estos dos sistemas se forman las dos troncales más importantes de un procesador: el <strong>bus datos</strong> y el <strong>bus de direcciones</strong>.</p>
<h4>Contador de programa</h4>
<p>El contador de programa es un registro que nos permite seguir la huella  de la instrucción que estamos ejecutando. Se van a utilizar contadores  para formar nuestro bus de direcciones de 12 bits capaz de direccionar un máximo de 4 KB. El circuito integrado 74LS161 es un contador en cascada de cuatro bits, el cual permite inicializarlo a cero (a la hora de un reset o al aplicar corriente) e incluso ponerlos a un número arbitrario. Esta característica última es la que nos va permitir implementar las instrucciones de salto. </p>
<p>El diagrama  esquemático de nuestro contador de programa sería el siguiente:</p>
<p align="center">
<a href="http://www.machin.com.mx/wp-content/uploads/2009/09/contador-programa.gif"><img src="http://www.machin.com.mx/wp-content/uploads/2009/09/contador-programa-266x300.gif" alt="contador programa" title="contador programa" width="399" height="450" class="aligncenter size-medium wp-image-3291" /></a><br />
<strong>Figura 4.1 Contador de Programa</strong>
</p>
<p>Un diseño avanzado sería conectarlo a la ALU para poder aplicarle operaciones aritméticas y así implementar instrucciones de brincos relativos al poder aplicarle sumas y restas. Por el momento esto último no se va hacer para simplificar la circuitería.</p>
<h4>Sistema de Memoria</h4>
<p>Realmente, el sistema de memoria, al igual que el sistema de reloj y de reinicio; pueden pertenecer internamente o no al diseño del procesador. Pero obviamente es una parte esencial sin la cual una computadora no funcionaría y por lo tanto la vamos a tratar porque no podríamos probar nuestra CPU sin él. </p>
<p>Al tener 12 bits de bus de direcciones, tan sólo podemos direccionar 4 KB de memoria, esto nos permite usar el último byte para seleccionar dos bloques de memoria de 2 KB. Uno sería una memoria EPROM 2716 (2K bytes) donde tendríamos grabado nuestro BIOS o "sistema operativo" y en el otro banco tendríamos la memoria RAM que se podría omitir para algunos que no requieran guardar o procesar datos. Para este proyecto de van usar dos memorias 2114 de 1 Kbyte x 4 cada una.  El diagrama esquemático es el siguiente:</p>
<p align="center">
<a href="/wp-content/uploads/2009/09/memory.gif" ><img src="http://www.machin.com.mx/wp-content/uploads/2009/09/memory-300x251.gif" alt="memory" title="memory" width="330" height="276"  /></a><br />
<strong>Figura 4.2 Memoria RAM y ROM</strong>
</p>
<p>Por el otro lado, el bus de direcciones estaría conectado directamente al contador de programa, al registro de dirección y a los puertos de entrada y salida.</p>
<h4>Registro de Instrucción</h4>
<p>Es importante recordar que las instrucciones que pueden llevar varios ciclos para ejecutarse  y que el contador de programa no se incrementa con cada ciclo de señal de reloj, sino en el estado en el cual le corresponda incrementarse y puede moverse para adquirir un operador.  Como la secuencia de los estados depende también de la instrucción es necesario tener un registro donde tengamos almacenada la instrucción actual. El diagrama esquemático es el siguiente:</p>
<p align="center">
<a href="http://www.machin.com.mx/wp-content/uploads/2009/09/CommandRegister.jpg"><img src="http://www.machin.com.mx/wp-content/uploads/2009/09/CommandRegister-300x243.jpg" alt="CommandRegister" title="CommandRegister" width="300" height="243" /></a><br />
<strong>Figura 4.3 Registro de Instrucción</strong>
</p>
<p>Se utilizan dos registros 74LS175 porque permite limpiar el registro a diferencia de usar solo un circuito integrado 74LS373. Para grabar el comando en el registro, se utiliza una compuerta para casarlo con el nivel alto de la señal de reloj. Por lo que es muy importante tener su valor con antelación durante el nivel bajo del ciclo.</p>
<h4>Programa de prueba</h4>
<p>Un programa de prueba adecuado que podemos grabar en la memoria EPROM, podría ser el siguiente:</p>
<div class="syntax_hilite">
<div id="asm-3">
<div class="asm"><span style="color: #ff0000;">00</span>:<span style="color: #ff0000;">0000</span> <span style="color: #ff0000;">01</span> AA LD A, #AA<br />
<span style="color: #ff0000;">00</span>:<span style="color: #ff0000;">0002</span> <span style="color: #ff0000;">44</span> <span style="color: #ff0000;">77</span> <span style="color: #00007f;">SUB</span> A, #77<br />
<span style="color: #ff0000;">00</span>:<span style="color: #ff0000;">0004</span> <span style="color: #ff0000;">00</span>&nbsp; &nbsp; <span style="color: #00007f;">NOP</span><br />
<span style="color: #ff0000;">00</span>:<span style="color: #ff0000;">0005</span> <span style="color: #ff0000;">02</span> <span style="color: #ff0000;">03</span> LD IX, #03<br />
<span style="color: #ff0000;">00</span>:<span style="color: #ff0000;">0007</span> <span style="color: #ff0000;">06</span> <span style="color: #ff0000;">00</span> LD IX:$<span style="color: #ff0000;">00</span>,A<br />
<span style="color: #ff0000;">00</span>:<span style="color: #ff0000;">0009</span> <span style="color: #ff0000;">80</span>&nbsp; &nbsp; <span style="color: #00007f;">NOT</span> A<br />
<span style="color: #ff0000;">00</span>:000A <span style="color: #ff0000;">31</span>&nbsp; &nbsp; <span style="color: #00007f;">OUT</span> <span style="color: #ff0000;">1</span>, A<br />
<span style="color: #ff0000;">00</span>:<span style="color: #ff0000;">000B</span> <span style="color: #ff0000;">41</span>&nbsp; &nbsp; LROT A<br />
<span style="color: #ff0000;">00</span>:000C <span style="color: #ff0000;">0B</span> 0A <span style="color: #00007f;">JMP</span> $0A</div>
</div>
</div>
<p></p>
<p>En el se carga el acumulador, se realiza una operación aritmética, se guarda información en la memoria y se rota un registro que es sacado a un puerto de salida.</p>
<h4>Nota importante:</h4>
<p>La construcción del microprocesador se está llevando justo ahorita, por lo que toda la información presentada en este post puede estar incompleta o incorrecta al ser de carácter provisional.</p>

]]></description>
			<content:encoded><![CDATA[<p>En este post se va a tratar el diseño del <strong>contador de programa</strong> que es el encargado de señalar la instrucción a ejecutar y el <strong>sistema de memoria</strong> donde se almacenan tanto las instrucciones del programa que se esta ejecutando y la memoria de datos. Con estos dos sistemas se forman las dos troncales más importantes de un procesador: el <strong>bus datos</strong> y el <strong>bus de direcciones</strong>.</p>
<h4>Contador de programa</h4>
<p>El contador de programa es un registro que nos permite seguir la huella  de la instrucción que estamos ejecutando. Se van a utilizar contadores  para formar nuestro bus de direcciones de 12 bits capaz de direccionar un máximo de 4 KB. El circuito integrado 74LS161 es un contador en cascada de cuatro bits, el cual permite inicializarlo a cero (a la hora de un reset o al aplicar corriente) e incluso ponerlos a un número arbitrario. Esta característica última es la que nos va permitir implementar las instrucciones de salto. </p>
<p>El diagrama  esquemático de nuestro contador de programa sería el siguiente:</p>
<p align="center">
<a href="http://www.machin.com.mx/wp-content/uploads/2009/09/contador-programa.gif"><img src="http://www.machin.com.mx/wp-content/uploads/2009/09/contador-programa-266x300.gif" alt="contador programa" title="contador programa" width="399" height="450" class="aligncenter size-medium wp-image-3291" /></a><br />
<strong>Figura 4.1 Contador de Programa</strong>
</p>
<p>Un diseño avanzado sería conectarlo a la ALU para poder aplicarle operaciones aritméticas y así implementar instrucciones de brincos relativos al poder aplicarle sumas y restas. Por el momento esto último no se va hacer para simplificar la circuitería.</p>
<h4>Sistema de Memoria</h4>
<p>Realmente, el sistema de memoria, al igual que el sistema de reloj y de reinicio; pueden pertenecer internamente o no al diseño del procesador. Pero obviamente es una parte esencial sin la cual una computadora no funcionaría y por lo tanto la vamos a tratar porque no podríamos probar nuestra CPU sin él. </p>
<p>Al tener 12 bits de bus de direcciones, tan sólo podemos direccionar 4 KB de memoria, esto nos permite usar el último byte para seleccionar dos bloques de memoria de 2 KB. Uno sería una memoria EPROM 2716 (2K bytes) donde tendríamos grabado nuestro BIOS o "sistema operativo" y en el otro banco tendríamos la memoria RAM que se podría omitir para algunos que no requieran guardar o procesar datos. Para este proyecto de van usar dos memorias 2114 de 1 Kbyte x 4 cada una.  El diagrama esquemático es el siguiente:</p>
<p align="center">
<a href="/wp-content/uploads/2009/09/memory.gif" ><img src="http://www.machin.com.mx/wp-content/uploads/2009/09/memory-300x251.gif" alt="memory" title="memory" width="330" height="276"  /></a><br />
<strong>Figura 4.2 Memoria RAM y ROM</strong>
</p>
<p>Por el otro lado, el bus de direcciones estaría conectado directamente al contador de programa, al registro de dirección y a los puertos de entrada y salida.</p>
<h4>Registro de Instrucción</h4>
<p>Es importante recordar que las instrucciones que pueden llevar varios ciclos para ejecutarse  y que el contador de programa no se incrementa con cada ciclo de señal de reloj, sino en el estado en el cual le corresponda incrementarse y puede moverse para adquirir un operador.  Como la secuencia de los estados depende también de la instrucción es necesario tener un registro donde tengamos almacenada la instrucción actual. El diagrama esquemático es el siguiente:</p>
<p align="center">
<a href="http://www.machin.com.mx/wp-content/uploads/2009/09/CommandRegister.jpg"><img src="http://www.machin.com.mx/wp-content/uploads/2009/09/CommandRegister-300x243.jpg" alt="CommandRegister" title="CommandRegister" width="300" height="243" /></a><br />
<strong>Figura 4.3 Registro de Instrucción</strong>
</p>
<p>Se utilizan dos registros 74LS175 porque permite limpiar el registro a diferencia de usar solo un circuito integrado 74LS373. Para grabar el comando en el registro, se utiliza una compuerta para casarlo con el nivel alto de la señal de reloj. Por lo que es muy importante tener su valor con antelación durante el nivel bajo del ciclo.</p>
<h4>Programa de prueba</h4>
<p>Un programa de prueba adecuado que podemos grabar en la memoria EPROM, podría ser el siguiente:</p>
<div class="syntax_hilite">
<div id="asm-4">
<div class="asm"><span style="color: #ff0000;">00</span>:<span style="color: #ff0000;">0000</span> <span style="color: #ff0000;">01</span> AA LD A, #AA<br />
<span style="color: #ff0000;">00</span>:<span style="color: #ff0000;">0002</span> <span style="color: #ff0000;">44</span> <span style="color: #ff0000;">77</span> <span style="color: #00007f;">SUB</span> A, #77<br />
<span style="color: #ff0000;">00</span>:<span style="color: #ff0000;">0004</span> <span style="color: #ff0000;">00</span>&nbsp; &nbsp; <span style="color: #00007f;">NOP</span><br />
<span style="color: #ff0000;">00</span>:<span style="color: #ff0000;">0005</span> <span style="color: #ff0000;">02</span> <span style="color: #ff0000;">03</span> LD IX, #03<br />
<span style="color: #ff0000;">00</span>:<span style="color: #ff0000;">0007</span> <span style="color: #ff0000;">06</span> <span style="color: #ff0000;">00</span> LD IX:$<span style="color: #ff0000;">00</span>,A<br />
<span style="color: #ff0000;">00</span>:<span style="color: #ff0000;">0009</span> <span style="color: #ff0000;">80</span>&nbsp; &nbsp; <span style="color: #00007f;">NOT</span> A<br />
<span style="color: #ff0000;">00</span>:000A <span style="color: #ff0000;">31</span>&nbsp; &nbsp; <span style="color: #00007f;">OUT</span> <span style="color: #ff0000;">1</span>, A<br />
<span style="color: #ff0000;">00</span>:<span style="color: #ff0000;">000B</span> <span style="color: #ff0000;">41</span>&nbsp; &nbsp; LROT A<br />
<span style="color: #ff0000;">00</span>:000C <span style="color: #ff0000;">0B</span> 0A <span style="color: #00007f;">JMP</span> $0A</div>
</div>
</div>
<p></p>
<p>En el se carga el acumulador, se realiza una operación aritmética, se guarda información en la memoria y se rota un registro que es sacado a un puerto de salida.</p>
<h4>Nota importante:</h4>
<p>La construcción del microprocesador se está llevando justo ahorita, por lo que toda la información presentada en este post puede estar incompleta o incorrecta al ser de carácter provisional.</p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/3826/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Proyecto: Construyendo un CPU con circuitos básicos (Parte 3)</title>
		<link>http://www.machin.com.mx/archives/2806</link>
		<comments>http://www.machin.com.mx/archives/2806#comments</comments>
		<pubDate>Fri, 25 Sep 2009 10:17:03 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Arqueología Machinesca]]></category>
		<category><![CDATA[CPU hecha en casa]]></category>
		<category><![CDATA[Electrónica]]></category>
		<category><![CDATA[Proyectos]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=2806</guid>
		<description><![CDATA[<p>En este post se van a publicar los primeros circuitos accesorios que necesita el CPU casero que estoy construyendo. Aunque sencillos, se presentan primero porque son muy útiles para probar las demás partes del procesador.</p>
<h4>Sistema de Reloj</h4>
<p>Para fines de depuración se han diseñado tres tipos de reloj: para "producción", uno con un cristal de 2 Mhz  y para debugeo; uno muy lento con unos inversores schmitt triger y otro paso a paso usando un flip flop para revisar todo paso a paso. Estos tres circuitos electrónicos  son los mismos que se utilizan con cualquier otro microprocesador y son idénticos a los que usaba hace años con el viejo <strong>Z80A</strong>.</p>
<p><strong>Circuito con señal de reloj paso a paso</strong></p>
<p>Este circuito es muy útil en etapas de desarrollo o cuando se esta cableando. Consiste en un "flip-flop" para alternar y mantener fijo el nivel actual de la señal de reloj hasta que se presione el interruptor opuesto:</p>
<p align="center">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/09/reloj1.jpg" alt="reloj1" title="reloj1" width="383" height="275" border="1"  /><br />
<strong>Figura 3.1</strong>
</p>
<p><strong>Señal de reloj de baja velocidad</strong></p>
<p>Ya que se tienen construidas partes completas y se prueban la máquina de estado de las instrucciones o el contador de programa, es conveniente usar un reloj de baja velocidad para poder ver el flujo completo sin el procedimiento engorroso que puede representar presionar los botones del paso a paso. Además puede sacar a la luz problemas de sincronía.</p>
<p align="center">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/09/reloj2.jpg" alt="reloj2" title="reloj2" width="389" height="137"  border="1" /><br />
<strong>Figura 3.2</strong>
</p>
<p>Esta construido con inversores schmitt trigger (circuito TTL 74LS14), un capacitor y una resistencia. Sin duda es una de las formas más sencillas y baratas de hacer una señal de reloj, la cual podemos modificar fácilmente cambiando los valores de los capacitores. La formula que nos da la frecuencia es la siguiente:</p>
<p align="center">
F = 1 / ( 2.2 * R * C )
</p>
<p><strong>Señal de reloj de alta velocidad con un cristal</strong></p>
<p>Para usar el procesador con una señal de reloj  que pueda ser para medir tiempos con mayor exactitud  es conveniente usar un cristal. Un circuito muy empleado es el siguiente:</p>
<p align="center">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/09/xtal.gif" alt="xtal" title="xtal" width="400" height="300" border="1" /><br />
<strong>Figura 3.3</strong>
</p>
<p>La frecuencia esta dada por el crystal.</p>
<h4>Sistema de Reinicio</h4>
<p>Al igual que el Sistema de Reloj, el circuito para crear la señal de reset es el mismo que se suele usar para microprocesadores. El diagrama es el siguiente:</p>
<p align="center">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/09/reset.jpg" alt="reset" title="reset" width="352" height="191"  border="1" /><br />
<strong>Figura 3.4</strong>
</p>
<p>Cumple con dos funciones: la primera es presentar un nivel bajo cuando se presiona el botón de reinicio. La segunda es dar un pulso a nivel bajo cuando se da alimentación al sistema. Esto se hace por medio del condensador y la resistencia.</p>
<h4>Nota importante:</h4>
<p>La construcción del microprocesador se está llevando justo ahorita, por lo que toda la información presentada en este post puede estar incompleta o incorrecta al ser de carácter provisional.</p>

]]></description>
			<content:encoded><![CDATA[<p>En este post se van a publicar los primeros circuitos accesorios que necesita el CPU casero que estoy construyendo. Aunque sencillos, se presentan primero porque son muy útiles para probar las demás partes del procesador.</p>
<h4>Sistema de Reloj</h4>
<p>Para fines de depuración se han diseñado tres tipos de reloj: para "producción", uno con un cristal de 2 Mhz  y para debugeo; uno muy lento con unos inversores schmitt triger y otro paso a paso usando un flip flop para revisar todo paso a paso. Estos tres circuitos electrónicos  son los mismos que se utilizan con cualquier otro microprocesador y son idénticos a los que usaba hace años con el viejo <strong>Z80A</strong>.</p>
<p><strong>Circuito con señal de reloj paso a paso</strong></p>
<p>Este circuito es muy útil en etapas de desarrollo o cuando se esta cableando. Consiste en un "flip-flop" para alternar y mantener fijo el nivel actual de la señal de reloj hasta que se presione el interruptor opuesto:</p>
<p align="center">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/09/reloj1.jpg" alt="reloj1" title="reloj1" width="383" height="275" border="1"  /><br />
<strong>Figura 3.1</strong>
</p>
<p><strong>Señal de reloj de baja velocidad</strong></p>
<p>Ya que se tienen construidas partes completas y se prueban la máquina de estado de las instrucciones o el contador de programa, es conveniente usar un reloj de baja velocidad para poder ver el flujo completo sin el procedimiento engorroso que puede representar presionar los botones del paso a paso. Además puede sacar a la luz problemas de sincronía.</p>
<p align="center">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/09/reloj2.jpg" alt="reloj2" title="reloj2" width="389" height="137"  border="1" /><br />
<strong>Figura 3.2</strong>
</p>
<p>Esta construido con inversores schmitt trigger (circuito TTL 74LS14), un capacitor y una resistencia. Sin duda es una de las formas más sencillas y baratas de hacer una señal de reloj, la cual podemos modificar fácilmente cambiando los valores de los capacitores. La formula que nos da la frecuencia es la siguiente:</p>
<p align="center">
F = 1 / ( 2.2 * R * C )
</p>
<p><strong>Señal de reloj de alta velocidad con un cristal</strong></p>
<p>Para usar el procesador con una señal de reloj  que pueda ser para medir tiempos con mayor exactitud  es conveniente usar un cristal. Un circuito muy empleado es el siguiente:</p>
<p align="center">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/09/xtal.gif" alt="xtal" title="xtal" width="400" height="300" border="1" /><br />
<strong>Figura 3.3</strong>
</p>
<p>La frecuencia esta dada por el crystal.</p>
<h4>Sistema de Reinicio</h4>
<p>Al igual que el Sistema de Reloj, el circuito para crear la señal de reset es el mismo que se suele usar para microprocesadores. El diagrama es el siguiente:</p>
<p align="center">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/09/reset.jpg" alt="reset" title="reset" width="352" height="191"  border="1" /><br />
<strong>Figura 3.4</strong>
</p>
<p>Cumple con dos funciones: la primera es presentar un nivel bajo cuando se presiona el botón de reinicio. La segunda es dar un pulso a nivel bajo cuando se da alimentación al sistema. Esto se hace por medio del condensador y la resistencia.</p>
<h4>Nota importante:</h4>
<p>La construcción del microprocesador se está llevando justo ahorita, por lo que toda la información presentada en este post puede estar incompleta o incorrecta al ser de carácter provisional.</p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/2806/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
