Examen Escrito Extraordinario 2022 - Solucion
Examen Escrito Extraordinario 2022 - Solucion
Examen Escrito Extraordinario 2022 - Solucion
UNIVERSIDAD
NOMBRE: DNI:
POLITÉCNICA
01 07 2022 Tercero
Rellene AHORA los datos personales que deben figurar en esta hoja.
Mientras dure el examen deberá exponer su D.N.I. encima de la mesa.
NO SE ADMITIRÁN exámenes escritos a lapicero ni con tinta roja o verde.
COMPRUEBE que su ejemplar del examen consta de 1 ejercicio en 9 páginas
numeradas.
En este examen NO PUEDEN UTILIZARSE CALCULADORAS, LIBROS,
APUNTES NI DISPOSITIVOS DE TELECOMUNICACIÓN. Retírelos ahora de la
mesa.
La duración de esta parte del examen es de 60 minutos.
La calificación de esta parte del examen tendrá un peso del 50% sobre la calificación
total
1
Esta hoja se ha dejado en blanco intencionadamente
2
Ejercicio 1 Máster SPI a tres hilos
10 puntos 60 minutos
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity master_spi_3_hilos is
port(nRst: in std_logic;
clk: in std_logic; -- 50 MHz
-- Ctrl_SPI
start: in std_logic; -- Orden de ejecucion
nWR_RD: in std_logic; -- Escritura (0) o lectura (1)
dir_reg: in std_logic_vector(6 downto 0); -- autoinc - direccion de acceso;
dato_wr: in std_logic_vector(7 downto 0); -- dato a escribir (solo
-- escrituras de 1 bit
dato_rd: buffer std_logic_vector(7 downto 0); -- valor del byte leido
ena_rd: buffer std_logic; -- valida a nivel alto a dato_rd
rdy: buffer std_logic; -- unidad preparada para aceptar start
-- bus SPI
nCS: buffer std_logic; -- chip select
SPC: buffer std_logic; -- clock SPI (5 MHz)
SDI_O: inout std_logic); -- Data Input/Output
end entity;
-- Para el control
signal no_bytes: std_logic_vector(2 downto 0);
signal fin: std_logic;
--Control buffer Z
signal ctrl_SDI_O: std_logic;
signal op_nWR: std_logic;
begin
3
-- Generacion de nCS:
process(nRst, clk)
begin
if nRst = '0' then
nCS <= '1';
op_nWR <= '0';
end if;
end if;
end process;
-- Generacion de SPC:
process(nRst, clk)
begin
if nRst = '0' then
cnt_SPC <= (1 => '1', others => '0');
SPC <= '1';
else
cnt_SPC <= cnt_SPC + 1;
end if;
end if;
end process;
end if;
end if;
end process;
4
-- Registro
process(nRst, clk)
begin
if nRst = '0' then
reg_SPI <= (others => '0');
SDI_syn <= '0';
end if;
end if;
end process;
ena_rd <= (not nCS and fin) when cnt_bits_SPC(5 downto 3) = 7 else
SPC_negedge when cnt_bits_SPC(5 downto 3) > 1 and
cnt_bits_SPC(2 downto 0) = 0 else
'0';
process(nRst, clk)
begin
if nRst = '0' then
ctrl_SDI_O <= '0';
end if;
end if;
end process;
-- Control heuristico
process(nRst, clk)
begin
if nRst = '0' then
no_bytes <= (others => '0');
else
no_bytes <= "111";
end if;
end if;
end if;
end process;
end rtl;
5
1.- Conteste a las siguientes cuestiones:
Tsu(CS)
Th(CS)
Tsu(SI)
Th(SI)
6
b) Analice el código del modelo del circuito para explicar detalladamente cómo se
garantiza el cumplimiento de los tiempos descritos en el apartado anterior. (2
puntos)
Tsu(CS):
Cuando se activa la señal nCS la señal SPC se encuentra a nivel alto. Desde ese instante
el contador cnt_SPC contará desde 1 hasta el valor SPC_LH (5) antes de bajar la línea
SPC. Por lo tanto transcurren 5*20ns = 100 ns.
Th(CS):
Tsu(SI):
La señal SDI toma el valor del bit de mayor peso del registro reg_SPI. Este registro se
desplaza cuando la señal SPC_negedge se activa, lo cual se produce cuando cnt_SP toma
el valor 1. Así pues, hay cuatro ciclos de reloj entre la puesta del dato y la subida de SPC,
es decir, 80ns.
Th(SI):
Siguiendo la explicación anterior, hay 6 ciclos de reloj entre el flanco de subida de SPC
y la puesta del nuevo dato en SDI. Es decir, 120ns.
7
c) De acuerdo con la especificación de tiempos del acelerómetro:
Indique la anchura mínima que deben tener el nivel alto y el nivel bajo de
la señal de reloj SPC. Justifique detalladamente su respuesta (1.5 puntos)
El tiempo a nivel bajo debe permitir que se respeten los tiempos de setup
de datos tSU(SI) y el tiempo de dato válido en SDO tV(SO). Así pues será
el mayor de estos valores. En nuestro caso, 50ns.
d) Analice el código del modelo del circuito para explicar detalladamente la función
que realizan las señales op_nWR y ctrl_SDI_O y el modo en el que el circuito
maneja su valor para conseguir que la interfaz a 3 hilos funcione correctamente:
Esta señal controla cuando la señal SDI_O debe funcionar como entrada (1)
o como salida (0). Cuando esta señal vale 1 el master se desconecta de la
línea, poniéndola en alta impedancia (Z). Esto sucede en las transferencias
de lectura (op_nWR = ‘1’), cuando se ha transmitido el primer byte
(cnt_bits_SPC(5 downto 3) = 1 y fdc_cnt_SPC = '1').
8
op_nWR: (1.5 puntos)
Esta sentencia modela una salida con control de alta impedancia. Si la señal
ctrl_SDI toma el valor 1, esta señal SDI_O toma el valor Z, es decir, permanece
en alta impedancia. En caso contrario toma el valor 1 o 0 según sea el valor de
reg_SPI(16)
9
library work;
use work.auxiliar.all; -- Funcion ceil_log
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_signed.all;
entity estimador is
generic(N: in positive := 16); -- numero de registros del banco (potencia de 2)
port(nRst: in std_logic;
clk: in std_logic;
end entity;
begin
-- Banco de registros
process(clk, nRst)
begin
if nRst = '0' then
for i in reg_muestra'range loop
reg_muestra(i) <= (others => '0');
end loop;
-1-
for i in 1 to N-1 loop
reg_muestra(i) <= reg_muestra(i-1);
end loop;
end if;
end if;
end process;
-- Delta de acumulacion
dif_X_muestra_N <= X_out_bias(10)&X_out_bias - reg_file_aux(32 downto 22);
dif_Y_muestra_N <= Y_out_bias(10)&Y_out_bias - reg_file_aux(21 downto 11);
dif_Z_muestra_N <= Z_out_bias(10)&Z_out_bias - reg_file_aux(10 downto 0);
dif_X_muestra_N_2 <= X_out_bias(10)&X_out_bias - reg_file_aux_2(32 downto 22);
dif_Y_muestra_N_2 <= Y_out_bias(10)&Y_out_bias - reg_file_aux_2(21 downto 11);
dif_Z_muestra_N_2 <= Z_out_bias(10)&Z_out_bias - reg_file_aux_2(10 downto 0);
-- Acumulador
process(nRst, clk)
begin
if nRst = '0' then
X_media_N <= (others => '0') ;
Y_media_N <= (others => '0') ;
Z_media_N <= (others => '0') ;
X_media_N_2 <= (others => '0') ;
Y_media_N_2 <= (others => '0') ;
Z_media_N_2 <= (others => '0') ;
end if;
end if;
end process;
-2-
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity sensor_driver is
port(nRst: in std_logic;
clk: in std_logic; -- 50 MHz
tic: in std_logic;
-- Ctrl_SPI
rdy: in std_logic; -- unidad preparada para aceptar start
start: buffer std_logic; -- Orden de ejecucion
nWR_RD: buffer std_logic; -- Escritura (0) o lectura (1)
repeat_conf: in std_logic;
dir_reg: buffer std_logic_vector(6 downto 0); -- autoincremento + direccion de
acceso;
dato_wr: buffer std_logic_vector(7 downto 0)); -- dato a escribir
end entity;
begin
process(nRst, clk)
begin
if nRst = '0' then
start <= '0';
nWR_RD <= '0';
dir_reg <= (others => '0');
dato_wr <= (others => '0');
estado <= wait_5ms;
cnt_op_conf <= (0 => '1', others => '0');
end if;
end if;
-1-
when assert_start =>
if cnt_op_conf <= num_op_conf and rdy = '1' then
start <= '1';
nWR_RD <= '0';
case cnt_op_conf is
when "001" =>
dir_reg <= dir_reg2;
dato_wr <= valor_reg2;
elsif tic = '1' and cnt_op_conf > num_op_conf and rdy = '1' then
start <= '1';
nWR_RD <= '1';
dir_reg <= dir_reg_rd;
estado <= release_start;
end if;
end if;
end case;
end if;
end process;
end rtl;
-2-