Está en la página 1de 9

M.I.

T Sistemas Electrónicos Avanzados 8/09/2020

Problema I – 3 puntos

Queremos calcular la suma de todos los elementos de un vector.


El sumador en coma flotante tiene una latencia de 10 ciclos.
Asumiremos que la suma es conmutativa y asociativa.
El código adjunto tarda 10002 ciclos en ejecutarse independientemente de las
directivas que se añadan debido a la dependencia de datos.
Se pide modificar la función para hacerlo en menos de 2000 ciclos.
Indicar cuantos ciclos tarda.
No se puede modificar la entrada pero si añadir tanto hardware como sea
necesario.
Las sentencias dentro de un bucle se ejecutan en paralelo si la dependencia de
datos lo permite.

float SUMAR (float x[1000]) {


float acc;

acc = 0 :
for (int i = 0 ; i < 1000; i++) acc = acc + x[i] ;

return(acc);
}

Problema II 3 puntos

Diseñar en VHDL sintetizable un circuito combinacional que haga la suma de dos


números en coma flotante en formato IEEE-754. Los datos (entradas y salida)
tienen el valor numérico siguiente:

(-1)**A(31)*(1.A(22 downto 0))* (2**(A(30 downto 23)-127)).


A(22 downto 0) y A(30 downto 23) se interpretan sin signo.

Entradas: A(31 downto 0),B(31 downto 0).


Salida: R(31 downto 0).

No nos preocuparemos de los overflow/underflow ni del número cero.


Para simplificar asumiremos que los dos números tienen el mismo signo.
Codificar en VHDL sintetizable el circuito resultante.

1
M.I.T Sistemas Electrónicos Avanzados 8/09/2020

Problema III 4 puntos


El circuito de la figura 1.1 (controlador + RAM) se comporta como una memoria FIFO (First In, First
Out) de 512 palabras de 8 bits. La memoria FIFO realiza operaciones de escritura (PUSH) y de lectura
(POP). Su funcionamiento es el siguiente:
— Las señales PUSH y POP permanecen activas durante un ciclo de reloj. Son activas a 1
— Cuando la señal PUSH se activa, el dato presente en DI se almacena en la primera posición libre de la
memoria RAM. El dato a escribir permanece estable en DI mientras la señal PUSH está activada. El
controlador lo mantendrá estable en el puerto D de la memoria RAM el tiempo necesario.
— Cuando la señal POP se activa, se recupera el primer dato almacenado en la memoria. La señal DATV se
activa durante un ciclo indicando que dicho dato se encuentra en el puerto DO de la memoria RAM.
— La señal BSY indica que la memoria FIFO está ocupada.
No nos preocuparemos de los desbordamientos que se puedan producir ni de las lecturas cuando no hay
datos almacenados.
Asumiendo que el controlador de la figura 1.1 es síncrono y que fCLK = 50MHz, dibuje los accesos de
escritura y de lectura que han de implementarse en el controlador para que se satisfagan los
cronogramas de lectura (figura 1.2) y escritura (figura 1.3) de la RAM.
Codificar en VHDL sintetizable el circuito utilizando procesos diferentes para la parte secuencial y
combinatoria, indicar el nombre y el número de bits de los flipflop utilizados.

CONTROLADOR RAM 512x8


nOE OE
CLK CLK nWE WE
RST RST D(7:0) DO
Q(8:0) A(8:0)
PUSH PUSH
CE
POP POP
DO(7:0)

DI DI(7:0) DATV DATV


BSY BSY

Fig. 1.1. Memoria FIFO 512×8.

tRC tWC
A A
tCE tCW
/CE /CE
tOE tAS tWP tAH
/OE
tOZ /WE
tAA tOH tDS tDH
D DATO D DATO
Fig. 1.2. Cronograma de lectura. Fig. 1.3. Cronograma de escritura.

Lectura RAM Escritura RAM


tRCmin 45 tWCmin 45
tCEmax 45 tCWmin 35
tOEmax 30 tASmin 5
tAAmax 45 tWPmin 30
tOHmin 5 tAHmin 5
tOZmax 10 tDSmin 15
tDHmin 5
Tabla. Parámetros temporales en ns.

2
Sistemas Electrónicos Avanzados 1/02/2021

Problema I 4 puntos.

Queremos implementar un filtro FIR de 100 etapas.


Los coeficientes están almacenados en una memoria ROM de simple puerto que
se puede leer solo una vez por ciclo de reloj.
Los datos de entrada se almacenan en una memoria RAM de simple puerto que se
puede leer o escribir solo una vez por ciclo de reloj.
No se pueden cambiar las memorias, ni la interface.
Asumiremos que los operadores aritméticos son combinacionales y lo
suficientemente rápidos.
Modificar el código C para que se pueda ejecutar en menos de 150 ciclos de reloj.
El manejo de la memoria shift_reg será muy parecido al de una pila FIFO.

#define N 100
void fir ( ap_int<12> *y, ap_int<10> x)
{
constant ap_int<16> c[N] = #include “coeff.h” ;
#pragma HLS RESOURCE variable=c core=ROM_1P_1S latency=1
static ap_int<10> shift_reg [N] ;
#pragma HLS RESOURCE variable=shift_reg core=RAM_1P_1S latency=1

ap_int<28> acc=0;
ap_int<10> data;
Shift_Accum_Loop: for (int i=N-1;i>=0;i--) {

if (i==0) {
shift_reg[0]=x;
data = x;
} else {
shift_reg[i]=shift_reg[i-1];
data = shift_reg[i];
}
acc+=data*c[i];
}
*y=acc.range(27,16);

1
Sistemas Electrónicos Avanzados 1/02/2021

Problema II 3 puntos

Tenemos almacenada la función seno [0,2*PI) en una memoria ROM de 1024x32


de doble puerto con lectura combinacional. La fase esta codificada con 16 bits.
Para mejorar la precisión en el valor del seno se utiliza una interpolación lineal.

Entradas : FASE(15 downto 0)


Salida : SENO(31 downto 0)

Codificar en VHDL sintetizable el circuito resultante.

Problema III: 3 Puntos


Diseñar en VHDL sintetizable un sistema que multiplique números de 8 bits
positivos en cuatro ciclos de reloj. Al multiplicador se le fijan en las entradas
A(7:0) y B(7:0) los números a multiplicar y se le indica que comience a operar
dándole un pulso de un ciclo de reloj de duración en la entrada START. A partir
de ese momento el circuito irá calculando en cada ciclo de reloj dos de los
términos a sumar y los acumulará en un registro de 16 bits RES(15:0). Al cabo de
cuatro ciclos de reloj se habrán calculado, y acumulado en el registro, los ocho
términos de la multiplicación y el registro contendrá el resultado de la
multiplicación. Cuando se acabe el proceso de la multiplicación el circuito lo
indicará poniendo a cero la señal de salida BUSY, que se encontraba a uno
mientras se estaba operando.
En la suma de términos únicamente pueden utilizarse dos sumadores.

0 0 0 1 1 0 0 0
0 1 1 0 0 0 1 1
0 0 0 1 1 0 0 0 primer grupo de
0 0 0 1 1 0 0 0 terminos a sumar
0 0 0 0 0 0 0 0 segundo grupo
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 tercer grupo
0 0 0 1 1 0 0 0
0 0 0 1 1 0 0 0 cuarto grupo
0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0
RST
CLK
RES(15:0)
A(7:0)
B(7:0) BUSY
START

También podría gustarte