2.2 Diseño

La primera parte de la práctica consiste en diseñar un multiplicador de palabras de 6 bits codificadas en complemento a 2 y mostrar el resultado en los displays de 7 segmentos.

EL rango de valores de entrada es de -32 a +31, por tanto el rango del producto es de -992 ( -32 × 31) a 1024 ( -32 × -32), por lo que son necesarios 12 bits para representarlo en complemento a 2.

Como se ha visto en el apartado 2.1 Basys3: Display en un instante dado solo puede estar activo uno de los visualizadores, utilizaremos los pulsadores BTNU, BTNL, BTNC y BTNR para activar respectivamente los visualizadores controlados por AN3, AN2, AN1 y AN0. En AN3 representaremos los millares/signo, en AN2 las centenas, en AN1 las decenas, y en AN0 las unidades.

Los puertos de este módulo son los siguientes:

Puerto

Modo

Basys3

Propósito

A(5:0)

in

SW(5:0)

Multiplicando

B(5:0)

in

SW(13:8)

Multiplicador

SEL(3:0)

in

{BTNU, BTNL, BTNC, BTNR}

Control de los visualizadores

SS(6:0)

out

{CA, CB, CC, CD, CE, CF, CG}

Control de los segmentos

AN(3:0)

out

{AN3, AN2, AN1, AN0}

Control del ánodo de los visualizadores

Puertos de entrada/salida del módulo lab2.vhd

Para ayudar a conceptualizar el hardware necesario para este diseño, se muestra su diagrama de bloques:

Diagrama de bloques
Diagrama de bloques.

Recorremos el diagrama de bloques de arriba abajo; comienza calculando el valor que se va a representar, producto=A*B, para mostrarlo en los visualizadores es necesario conocer su magnitud abs_prod=abs(producto), y obtener su codificación en BCD bcd(15:0).

Para realizar la conversión de binario a BCD utilizaremos el algoritmo doubledabble, que implementa el bloque doubledabble12b. Este módulo está ya prediseñado en VHDL, lo encontrarás en el espacio de trabajo en rtl/doubledabble12b.vhd.

Bloque doubledabble12b.

Seguidamente un multiplexor (mux2) selecciona el código a mostrar en el display bcd_digito (ver tabla), en el caso del display AN3, se selecciona previamente los millares (bcd(15:12)) o el signo - (\(\textsf{x"F"}\)), en función del signo del producto (bit mas significativo producto(11)).

SEL(3:0)

bcd_digito

0001

unidades (AN0)

0010

decenas (AN1)

0100

centenas (AN2)

1000

millares/signo (AN3)

Un decodificador Bin_a_SS genera el código SS(6:0) que controla el estado de los segmentos del display. El bit SS(6) activa el segmento a, el bit SS(5) el segmento b, y así sucesivamente hasta SS(0), que corresponde al segmento g. La figura indica qué segmentos deben encenderse para representar cada dígito decimal (0–9) y el signo menos (-).

Display 7 segmentos.

Por último, quedan por obtener las señales AN(3:0) a partir de SEL(3:0):

SEL(3:0)

AN(3:0)

0001

1110

unidades (AN0 activo)

0010

1101

decenas (AN1 activo)

0100

1011

centenas (AN2 activo)

1000

0111

millares/signo (AN3 activo)

others

1111

resto de la opciones (AN0 → AN3 apagados)

Modela este diseño en VHDL.
Sigue el procedimiento visto en el lab1:
  • Descarga el archivo de recursos de lab2 y descomprímelo.

  • Arranca vivado y crea el proyecto utilizando el script scripts/lab.tcl.

  • Edita rtl/lab2.vhd para modelar la funcionalidad descrita.

    • en Vivado: Sources→Design Sources→Syntax Error Files→lab2.vhd.