DEPARTAMENTO DE ELECTRÓNICA I.T.Telecomunicación Sistemas Electrónicos ASIGNATURA Microelectrónica FECHA Junio - 2009 APELLIDOS,NOMBRE SOLUCION Nº Lista 1 2 3 4 5 6 7 T Cuestión 1 (10 ptos) Nota: las respuestas incorrectas, restan 1/3 de la puntuación. a. En las pastillas VirtexII de Xilinx existen bloques de memoria denominados BRAM, qué capacidad de almacenamiento tiene cada uno de ellos? 18 kbit b. Qué significa BIST. Built-in Self Test En el proceso de fabricación de chips. c. Enumere los pasos de la implementación de un CI tras haber realizado la síntesis del diseño. Wafer Preparation Photolithography Etch Cleaning Thin Films Ion Implantation Planarization Test and Assembly d. Indique para qué sirve la implantación de iones. Es el proceso de dopado del silicio. e. Existe un proceso denominado Etch, qué proceso le precede y qué proceso le sigue? Photo-Lithography => Etch => Cleaning 1/9
Cuestión 2 (10 ptos) Codifique un procedimiento Cont1 dentro de un paquete MM para que sea usado en la generación del siguiente cronograma correspondiente a un contador dentro de un testbench. Sus parámetros son los siguientes: - una constante de 4 bits, que define el salto de la cuenta (cronograma = 2) - una señal de entrada que indica el valor inicial de partida del contador (4, dada en 6 bits). - una señal de entrada que indica el valor máximo que puede llegar a tener el contador (dada en 10 bits). - una señal de salida (10 bits) con el valor de cuenta. Los valores se van proporcionando en cada flanco descendente de la señal de reloj clk. Cronograma: SOL: procedure cont1 ( constant N : in unsigned(3 downto 0); signal INI : in unsigned(3 downto 0); signal MAX : in unsigned(9 downto 0); signal S : out unsigned(9 downto 0) ) is variable aux : unsigned(s'range); -- cont1 aux := (others => '0'); aux(ini'range) := INI; S <= aux; wait until clk='0'; while aux<max loop aux := aux+n; S <= aux; wait until clk='0'; end cont1; 2/9
Cuestión 3 (15 ptos) El código Gray es un tipo especial de código binario que no es ponderado (los dígitos que componen el código no tienen un peso asignado). Su característica más significativa es que entre una combinación de dígitos y la siguiente sólo hay una diferencia de un dígito. En la tabla adjunta se muestra la relación entre un código Gray y el binario para un dato de 4 bits. Decimal Binario Gray 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0011 0010 0110 0111 0101 0100 1100 1101 1111 1110 1010 1011 1001 1000 Para convertir un número binario a Gray se procede de la siguiente forma: El primer bit del código Gray (MSB) es el mismo, igual al primer bit del número binario (MSB). El segundo bit del código Gray será 1 si los bits del primer y segundo del código binario son diferentes y 0 si son iguales. El tercer bit del código Gray será 1 si los bits segundo y tercero del número binario son diferentes y 0 en caso contrario, y así sucesivamente. Para convertir de Gray a binario se requiere de este otro procedimiento: El primer bit binario (MSB) es el mismo que el primer bit Gray (MSB). Si el segundo bit Gray es 0, el segundo bit binario es el mismo que el primero; si el segundo bit Gray es 1, el segundo bit binario es el inverso del primer bit binario. El paso 2 se repite para bits sucesivos. Se debe crear el código VHDL sintetizable que modele un circuito conversor que permita pasar un dato A (de N bits genérico) de binario a Gray o de Gray a binario, en función del valor de una entrada de selección SEL. Si SEL es 1 se realiza la conversión de binario a Gray y si es 0 la conversión es de Gray a binario. 3/9
library ieee; use ieee.std_logic_1164.all; entity gray is generic (N : positive := 4); port ( dato : in std_logic_vector(n-1 downto 0); sel : in std_logic; q : out std_logic_vector(n-1 downto 0) ); end gray; architecture rtl of gray is process (dato, sel) variable aux : std_logic_vector(n-1 downto 0); if sel = '1' then aux(n-1) := dato(n-1); for i in dato'high-1 downto dato'low loop aux(i) := dato(i+1) xor dato(i); else aux(n-1) := dato(n-1); for i in dato'high-1 downto dato'low loop if dato(i) = '0' then aux(i) := aux(i+1); else aux(i) := not aux(i+1); q <= aux; end rtl; 4/9
Cuestión 4 (15 ptos) Realice un testbench que compruebe de forma exhaustiva el comportamiento del circuito de la cuestión anterior, particularizado para N=8 considerando que el circuito combinacional tiene un retardo de 15 ns y escribiendo los resultados en un fichero de nombre results_conversion.dat con el siguiente formato: Tipo_de_Conversion : Valor_Entrada => Valor_Salida En el testbench para finalizar la simulación una vez se haya realizado toda la operativa necesaria de comprobación del circuito se debe dar orden al simulador de finalizar el proceso de simulación. library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use std.textio.all; use ieee.std_logic_textio.all; entity gray_tb is end gray_tb; architecture sim of gray_tb is component gray generic ( N : positive); port ( dato : in std_logic_vector(n-1 downto 0); sel : in std_logic; q : out std_logic_vector(n-1 downto 0)); end component; constant N : positive := 4; signal dato_i : std_logic_vector(n-1 downto 0); signal sel_i : std_logic; signal q_i : std_logic_vector(n-1 downto 0); -- sim DUT : gray generic map ( N => N) port map ( dato => dato_i, sel => sel_i, q => q_i); process file res : text open write_mode is "results_conversion.txt"; variable buf : line; variable aux : std_logic_vector(n-1 downto 0); sel_i <= '1'; for i in 0 to (2**N)-1 loop aux := std_logic_vector(to_unsigned(i, N)); dato_i <= aux; write (buf, string'( "Binario a Gray : ")); write(buf, aux); write (buf, string'( " => ")); wait for 50 ns; aux := q_i; write(buf, aux); writeline(res, buf); sel_i <= '0'; for i in 0 to (2**N)-1 loop aux := std_logic_vector(to_unsigned(i, N)); dato_i <= aux; write (buf, string'( "Gray a Binario : ")); write(buf, aux); write (buf, string'( " => ")); wait for 50 ns; aux := q_i; write(buf, aux); writeline(res, buf); file_close(res); assert false report "fin simulación" severity failure; end sim; 5/9
Cuestión 5 (15 ptos) Se pide que codifique en VHDL sintetizable un circuito que permita restar dos números A y B, codificados en BCD con un tamaño genérico de N dígitos (p.e. el número 6420, tiene N=4 dígitos BCD). El resultado, RES, también codificado en BCD, tendrá el mismo tamaño que los datos de entrada. Asimismo, se dispondrá de una salida SIGN que indica el signo del resultado. En el caso de que el número A sea mayor que B la operación a realizar será A-B y SIGN toma el valor 0, para indicar que el resultado es positivo. En caso contrario, se realiza la operación B-A y SIGN toma el valor 1 para indicar que el resultado es negativo. Nota: Los puertos de la entidad serán del tipo std_logic o std_logic_vector. library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity resta is generic ( N : positive := 4); port ( a, b : in std_logic_vector (4*N-1 downto 0); sign : out std_logic; res : out std_logic_vector (4*N-1 downto 0)); end resta; architecture rtl of resta is -- rtl process (a, b) variable a1, b1 : std_logic_vector (4*N-1 downto 0); variable ai, bi, si : std_logic_vector(3 downto 0); variable co : std_logic; -- process if b > a then a1 := b; b1 := a; sign <= '1'; else a1 := a; b1 := b; sign <= '0'; co := '0'; for i in 0 to N-1 loop ai := a1(i*4+3 downto i*4); bi := std_logic_vector(unsigned (b1(i*4+3 downto i*4))+("000"&co)); if ai < bi then si := std_logic_vector( unsigned(ai)+10 -unsigned(bi)); co := '1'; else si := std_logic_vector( unsigned(ai) -unsigned(bi)); co := '0'; res(i*4+3 downto i*4) <= std_logic_vector(si(3 downto 0)); end rtl; 6/9
Cuestión 6 (20 ptos) Se desea realizar un circuito sumador secuencial con la entidad dada más abajo. Tiene de entrada un bit de datos X y un bit DX que indica cuándo el bit X es válido para ser leído por el circuito. La salida S (un bit) debe ir proporcionando de forma secuencial, el resultado de la operación de suma, indicando un bit DS cuándo el valor de salida es válido. El circuito realiza la suma serie de dos números A y B de N bits (parámetro genérico). Los bits de los números a sumar A y B se van introduciendo alternativamente de forma secuencial por el bit X, siguiendo la secuencia de valores siguiente (LSB a MSB): a0, b0, a1, b1, etc. y atendiendo a que DX esté activo. El circuito proporciona por el bit de salida S, N+1 bits, para que la suma no tenga pérdida de precisión. Entre operación de suma de dos valores A/B y la siguiente operación de suma de otros datos A/B, se debe dar un pulso a la señal de reset (rst), el cual tiene un funcionamiento síncrono. La latencia del circuito debe ser mínima, por lo que no es válido capturar los datos A/B y sumar en paralelo. Se recomienda hacer uso de una máquina de estados Mealy. entity sum_serie is generic(n:integer:=3); port( X,DX,clk,rst: in std_logic; S,DS: out std_logic); end entity sum_serie; SOL: El grafo que se va a implementar es el siguiente: El circuito a implementar en 3 procesos f,g,mem está interconectado de la siguiente manera: 7/9
architecture rtl of FSM1 is type estadosfsm is (q0, q1, q2,q3,q4,q5); signal estado, prox_estado : estadosfsm; f:process (X, DX, estado) case estado is when q0 => if (X='0') then prox_estado <= q1; else prox_estado <= q2; when q1 => prox_estado <= q0; when q2 => if (X='0') then prox_estado <= q0; else prox_estado <= q3; when q3 => if (X='0') then prox_estado <= q2; else prox_estado <= q4; when q4 => prox_estado <= q3; end case; if(dx=0) then prox_estado <= estado; -- no avanza mem:process (CLK, RST) if (RST='1') then estado <= q0; elsif CLK'event and CLK='1' then estado <= prox_estado; g:process (X, DX, estado) case estado is when q0 => DS<='0'; S<= 0 ; -- salida no valida when q1 => DS<='1'; S<=X; when q2 => DS<= 1 ;S<= not X; when q3 => DS<='0'; S<= 0 ; -- salida no valida when q4 => DS<='1'; S<=X; end case; if(dx=0) then DS<= 0 ; -- estado no avanza y salida no es valida end rtl; 8/9
Cuestión 7 (15 ptos) Realice el circuito digital comparador de dos bits A1A0 con B1B0 que proporciona 3 salidas: Igual, Mayor, Menor, usando lógica np-mos. Se valorará la reducción del número de transistores empleados. SOL: El circuito de lógica np-mos tiene el siguiente esquema. Las funciones a realizar como PDN y que serán utilizadas como entradas posteriormente de las PUN de salida, son: Ig0 =a0*b0+/a0*/b0 May0=a0*/b0 Men0=/a0*b0 Ig1 =a1*b1+/a1*/b1 Cuya implementación usando la teoría de CMOS estático es directa. Como redes PUN, se tienen las 3 salidas deseadas: May10=a1*/b1+May0*Ig1 Men10=/a1*b1+Men0*Ig1 Ig10 =Ig1*Ig0 Cuya implementación usando la teoría de CMOS estático es también directa. 9/9