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 |
Para ayudar a conceptualizar el hardware necesario para este diseño, se muestra su 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.
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 (-).
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.vhdpara modelar la funcionalidad descrita.
en Vivado: Sources→Design Sources→Syntax Error Files→lab2.vhd.