PRÁCTICA DE SÍNTESIS El sumador restador en complemento a dos 1.- Introducción Mediante el complemento a dos se simplifica la circuitería necesaria para realiar las operaciones suma y resta de números binarios con signo. El empleo de esta técnica permite realiar estas operaciones empleando un sencillo sumador binario junto con una lógica adicional. La figura 1 presenta el esquema de un circuito aritmético para números en complemento a 2 de bits, mostrando los componentes principales y sus conexiones. X Y Control 1 Selector de datos Selector de datos Complemento a 1 Control 2 Sumador binario de bits OP_SELECT Detector de desbordamiento Salida Figura 1. Diagrama de bloques de un circuito para sumar o restar números en complemento a dos. El sumador en el centro de la unidad está diseñado para números binarios sin signo. Si se activa un complementador (un circuito lógico bastante sencillo) en una de sus entradas de datos, el mismo sumador puede realiar restas, aprovechando el hecho de que la operación X-Y es la suma de X y el complemento a dos de Y (o sea, X+(-Y)). El complementador se controla con una señal externa OP_SELECT, que ecciona la operación, suma o resta, que efectúa la unidad aritmética. Dos componentes controlados 1/9
externamente, llamados ectores de datos (o multiplexores), determinan cuáles serán los operandos que se aplicarán a la entrada derecha y la entrada iquierda del sumador. Con esta disposición, podemos aplicar X o Y a la entrada de la iquierda del sumador, y X, Y, -X o Y a la entrada de la derecha del sumador, lo que permitiría calcular las siguientes operaciones aritméticas: X+Y X-Y Y-X 2X (ó X+X) 2Y (ó Y+Y) Las otras operaciones que podría realiarse con el resto de las combinaciones de las señales de control son obvias o redundantes y no se tomarán en cuenta (estas son: Y+X = X+Y, X-X=0, Y-Y=0). Este sumador-restador es mucho más sencillo que un sumador-restador similar para números codificados mediante magnitud-signo, ya que se necesitarían sumadores y restadores separados, además de circuitos para comparar la magnitud de los operandos de entrada. El objetivo de la presente práctica es diseñar, simular e implementar un circuito capa de realiar las operaciones anteriormente expresadas, donde X e Y son números en complemento a 2. 2.- Pasos a seguir 2.1. DISEÑO DE LOS MULTIPLEXORES Primeramente hay que diseñar un multiplexor 2 a1 de un bit (esta parte ya ha sido realiada en clase). Una ve sintetiado el componente, éste debe simularse para comprobar el correcto funcionamiento del mismo (ver figura 2). Figura 2. Esquema de un multiplexor de 1 bit y simulación funcional del mismo. Tras comprobar que el diseño funciona correctamente, se procede a la implementación de un multiplexor de señales de bits, que son los que necesitamos en el diseño 2/9
global que aparece en la figura 1. El diseño de un multiplexor de estas características se consigue conectando multiplexores sencillos tal y como se muestra en la figura. unit0 (0) (0) (0) (1) (1) unit1 (1) (2) (2) unit2 (2) Figura. Esquema de un multiplexor de bits (componente y detalle de implementación) Para implementar este componente creamos un nuevo código con el asistente, en el que pondremos en este caso que las señales, y son buses de bits (es decir, de 2 a 0). A continuación, en la plantilla generada, hay que inicialiar el componente básico creado anteriormente (mux2a1 de 1 bit) en la parte declarativa de la arquitectura mediante la cláusula COMPONENT según se vio en el tutorial. Además, en el cuerpo de la arquitectura habría que instanciar (o usar) tres veces dicho componente básico (cláusula PORT MAP). Ambas sintaxis se pueden obtener generando una plantilla para tal fin en Processes Design Utilities View HDL Instantiation Template. Una ve realiadas las conexiones pertinentes en los PORT MAP, hay que comprobar nuevamente que el módulo funciona correctamente, por lo que creamos un nuevo archivo de simulación (mux2a1_bits_tb) que asociamos a este nuevo módulo. Para corroborar el correcto funcionamiento, en este caso nos basta con poner dos datos distintos a las entradas de y y comprobar que la salida conmuta entre estos dos valores en consonancia con la señal de ección (sustituir en la parte declarativa de /9
y las inicialiaciones de todo a 0, others=>'0', por valores tipo 010 ). El formato de los datos de los buses puede verse en distintas codificaciones, sin más que hacer click con el botón derecho del ratón en los valores, tal y como se aprecia en la figura 4. Figura 4. Simulación funcional del multiplexor de bits (en formato binario puro y decimal sin signo) 2.2. DISEÑO DEL COMPLEMENTADOR A 1 El complementador a 1 es un sencillo bloque que, a través de la señal de control OP_SELECT hace que la señal de bits entrante se obtenga a la salida tal cual o complementada (es decir, cambiando 0 s por 1 s y viceversa). Así, creamos un nuevo componente denominado ca1_bits, que tendrá una señal simple de control (op_ect) y dos buses de bits de datos (din y dout), tal y como se muestra en la figura 5. Para realiar esta operación empleamos el operador xor (or-exclusiva) para cada una de las componentes del bus din, ya que din 0 = din din 1 = din según vimos en clase. Figura 5. Esquema del complementador y simulación funcional del mismo 4/9
2.. DISEÑO DEL SUMADOR DE BITS El último bloque que queda por diseñar en la figura 1 es el sumador completo de bits. Para implementar este bloque haremos uso de sumadores completos de 1 bit conectados en cascada. Las ecuaciones algebraicas de un sumador completo son: s = a b cin = ( a b) cin cout = a b + a cin + b cin = ( a b + a cin) + b cin En las ecuaciones descritas arriba se ha aplicado la propiedad asociativa respecto a la suma lógica y a la suma exclusiva, ya que los operadores or y xor están definidos en el lenguaje como operadores binarios (entre dos operandos). En la figura 6 aparece el módulo que debe implementarse y su simulación funcional. a b cout S. C. cin s Figura 6. Esquema del sumador completo de 1 bit y simulación funcional del mismo El sumador de bits se obtiene conectando en cascada bloques iguales al anterior. Como el módulo está pensado para realiar sumas y restas en complemento a 2, en esta representación numérica el último acarreo de salida no se tiene en cuenta, pero sí es útil implementar un detector de desbordamiento u overflow, que se obtiene tal y como se muestra en la figura 7. Figura 7. Implementación del sumador completo de bits con bloques básicos Como sabemos, para bits, el rango de números que podemos representar en complemento a 2 está en el intervalo [-4:+]. En la simulación funcional de la figura 8 se ha optado por dejar uno de los sumandos fijo y variar el otro. Todos los buses se han representado en notación Decimal (Signed), o sea, en complemento a dos, haciendo click con el botón derecho del ratón en los mismos. Se puede comprobar que la suma se realia correctamente en todos los casos excepto en los dos últimos en donde se produce desbordamiento (overflow=1). 5/9
a b overflow S. C. cin s Figura 8. Interfase del sumador completo de bits y simulación funcional del mismo 2.4. DISEÑO DEL SISTEMA GLOBAL Una ve hallamos implementado y simulado todos los componentes anteriores, estos deben conectarse tal y como se mostraba en la figura 1. En las figuras 9 y 10 se muestran, respectivamente, el módulo de jerarquía superior que debe crearse con sus puertos de interfase y el esquema de conexionado de los bloques creados anteriormente x y overflow sumador restador ca2 control1 control2 op_ect salida Figura 9. Esquema del sumador restador completo de bits control2 op_ect x y int1 Ca1 din dout op_ect int2 b cin control1 S. C. s salida int0 a overflow overflow Figura 10. Conexión de los bloques creados que conforman el sumador restador 6/9
que lo componen. Se han declarado los buses internos int0, int1 e int2 como std_logic_vector (2 downto 0) para conectar algunos módulos, según puede apreciarse. Para calcular el opuesto a un número en complemento a 2, una manera de obtenerlo es realiar el complemento a 1 y sumar 1. Es por ello que la señal op_ect se conecta al complementador a 1 Ca1 y al puerto de entrada cin del sumador. Con esta combinación en realidad hacemos el complemento a 2 pues. Llegados a este punto, hemos realiado un diseño jerárquico de niveles, como se aprecia en la figura 11. Figura 11. Esquema jerárquico del diseño implementado En la figura 12 se muestra la simulación funcional del sistema diseñado. En este caso se han puesto como operandos X=+1 e Y=- y se han realiado las 8 combinaciones de las señales de control op_ect, control1 y control2. En la tabla adjunta se puede comprobar la operación que se está realiando con cada combinación. Comprobar que los resultados son los esperados para otros valores. op_ect control2 control1 operación resultado 0 0 0 X+X +2 0 0 1 Y+X -2 0 1 0 X+Y -2 0 1 1 Y+Y +2 (ov) 1 0 0 X-X 0 1 0 1 Y-X -4 1 1 0 X-Y -4 (ov) 1 1 1 Y-Y 0 Figura 12. Simulación funcional del sumador/restador implementado 7/9
2.5. ASIGNACIÓN DE PINES Para realiar la asignación de pines hay que crear un archivo de restricciones de usuario donde se incluye esta información. Como vimos en el tutorial, Processes User Constraints Floorplan IO Pre-Synthesis, asegurándonos de tener eccionada en la ventana de Sources el top del diseño. Nuestro diseño consta de 9 puertos de entrada ( para X, para Y, y para las señales de control). Lo ideal sería asignar dichos puertos a interruptores, pero lo placa SPARTAN- sólo tiene 8. Así pues, asignaremos SW7 a control2, SW6 a control1, SW5-SW para X y SW2-SW0 para Y. La referencia de los pines a los que están conectados estos interruptores se encuentran en el anexo. La señal op_ect se asignará a un botón (BTN0, por ejemplo). Para la salida no tenemos ningún problema en cuanto a recursos y podemos asignar el overflow al LD7 y la salida a los leds más a la derecha (LD2-LD0), por ejemplo. 2.6. IMPLEMENTACIÓN DEL DISEÑO Una ve que se han diseñado y simulado correctamente todos y cada uno de los bloques, y se ha realiado la asignación de pines de la FPGA, debemos sintetiar nuestro diseño. Seleccionando el módulo de jerarquía superior, hacemos doble-click en Processes Generate Programming File (cerrar el cuadro de diálogo que aparece). Esto hará que se ejecuten todos los procesos anteriores para generar el archivo de programación. Ya con la placa conectada, el último paso es programarla (Generate Programming File Configure Device (impact)). Switches and LEDs Slide Switches The Spartan- Starter Kit board has eight slide switches, indicated as 11 in Figure 1-2. The switches are located along the lower edge of the board, toward the right edge. The switches are labeled SW7 through SW0. Switch SW7 is the left-most switch, and SW0 is the rightmost switch. The switches connect to an associated FPGA pin, as shown in Table 4-1. A detailed schematic appears in Figure A-2. Table 4-1: Slider Switch Connections Switch SW7 SW6 SW5 SW4 SW SW2 SW1 SW0 FPGA Pin K1 K14 J1 J14 H1 H14 G12 F12 Push Button Switches The Spartan- Starter Kit board has four momentary-contact push button switches, indicated as1 in Figure 1-2. These push buttons are located along the lower edge of the board, toward the right edge. The switches are labeled BTN through BTN0. Push button switch BTN is the left-most switch, BTN0 the right-most switch. The push button switches connect to an associated FPGA pin, as shown in Table 4-2. A detailed schematic appears in Figure A-2. Table 4-2: Push Button Switch Connections Push Button BTN BTN2 BTN1 BTN0 FPGA Pin L14 L1 M14 M1 8/9
LEDs The Spartan- Starter Kit board has eight individual surface-mount LEDs located above the push button switches, indicated by 12 in Figure 1-2. The LEDs are labeled LED7 through LED0. LED7 is the leftmost LED, LED0 the right-most LED. Table 4- shows the FPGA connections to the LEDs. Table 4-: LED Connections to the Spartan- FPGA LED LD7 LD6 LD5 LD4 LD LD2 LD1 LD0 FPGA Pin P11 P12 N12 P1 N14 L12 P14 K12 Figure 1-2: Xilinx Spartan- Starter Kit Board (Top Side) 9/9