Laboratorio Calificado 2
Laboratorio Calificado 2
Laboratorio Calificado 2
TITULO DE LA EXPERIENCIA:
LABORATORIO CALIFICADO 2
N° DE PREGUNTAS:
FECHA: 10-10-21
U17101665
LABORATORIO CALIFICADO 02
En este laboratorio calificado se hará uso de diversos circuitos vistos en clase, tales como:
divisor de frecuencia, contador, circuito anti-rebote, entre otros. Además, se aplicará el estilo de
código estructural para obtener un código más ordenado y legible.
• Circuito de entrada
• Circuito pre-escalador
• Divisor de frecuencia
• Contador
• Banco de señales
• Generador de señal PWM
Algunos de los componentes, necesarios para el diseño del sistema, le serán proporcionados
en una carpeta llamada “componentes_basicos_LC2”. Específicamente, los componentes
que encontrará son:
Para obtener el puntaje completo, en cada una de las preguntas debe proporcionar lo siguiente:
✓ Diagrama jerárquico
✓ Todos los archivos fuente (,vhd)
✓ Una captura de pantalla del diagrama RTL obtenido.
PARTE 01 – DISEÑO DEL CIRCUITO DE ENTRADA (05 PUNTOS)
Para esta parte del diseño, se requiere que usted construya el componente correspondiente al
ciruito anti-rebote (explicado en la sesión 08), y lo guarde en un archivo “debouncer.vhd”.
Posteriormente, debe crear un archivo llamado “input_circuit.vhd”, en donde tiene que
instanciar los componentes “frecuency_divider”, “debouncer” y “counter”, e interconectarlos
para obtener como resultado el circuito deseado.
No olvide que algunos componentes tienen parámetros genéricos, los cuales deben ser
configurados en la instanciación. Asimismo, debe tomar en cuenta que la salida del
componente “contador” es de tipo UNSIGNED, por lo cual las salidas COUNT_01 y COUNT_02
también deben ser de tipo UNSIGNED o, de lo contrario, utilizar una conversión del tipo de dato
(type cast).
Desarrollo
En esta primera pregunta nos pide diseñar un divisor de frecuencia de 500 000, 2 circuitos anti-
rebote, el primero para el button_01 y el segundo para el button_02, y por último dos contadores,
el primero con una salida de 3 bits(COUNT_01) y el segundo una salida de 2 bits(COUNT_02).
Para el divisor de frecuencia utilice el código genérico brindado por el profesor, cambiando el
número de bits a 20, y al hacer el código estructural del input_circuit le damos el valor 500 000 al
divider, expresado en sexagesimal. En el caso del circuito anti-rebote, tuve que diseñarlo con las
entradas de sw_in, clk y la salida sw_in_clean, además de las señales que se usaron para el
diseño, en este caso para el input_circuit tuvo que ser llamado dos veces como se ve en el
código del circuito. Y, por último, usamos el circuito genérico del contador cambiándole el n_bits
a 3 ya que nos piden que sea salida la salida de 3 bits en el count_01, pero podemos ver que en
el count_02 la salida es de 2 bits, esto lo modificamos en el código del input_circuit poniendo
GENERIC MAP (n_bits=>2).
Código VHDL del divisor de frecuencia
freq_div
debouncer
counter
Diagrama jerárquico de input_circuit
PARTE 02 – DISEÑO DEL PRE-ESCALADOR (05 PUNTOS)
Para la segunda parte de este laboratorio calificado, se requiere diseñar el circuito pre-
escalador, el cual hará posible variar la frecuencia de la señal generada.
El primer paso será diseñar un multiplexor de 8 entradas a 1 salida, el cual debe guardarse en
el archivo “mux_8_to_1.vhd”. El selector de este multiplexor tiene 03 bits, sus entradas tienen
08 bits y su salida tiene 08 bits.
No olvide tomar en cuenta que, el tipo de dato de la salida del multiplexor debe coincidir con el
tipo de dato de la entrada “divider” del divisor de frecuencia.
Desarrollo
En esta segunda pregunta nos piden diseñar el pre_scaler, ya que tenemos el divisor de
frecuencia genérico, tenemos que diseñar solo el mux de 8, empezamos asignando como
entrada un selector(3 bits) y como salida un div_in(8 bits) usamos el case para el diseño. Ya que
tenemos todos los bloques, diseñamos el pre_scaler. Empezamos asignando como entradas el
sel, clk_in y como salida el clk_div, en el código estructural llamamos a las entidades del divisor
de frecuencia y la del mux_8_to_1, también creamos una señal entre la salida del mux y la
entrada del divisor de frecuencia. Finalmente como el divisor de frecuencia ahora es de 8 bits y
ya no de 20, lo cambiamos con el GENERIC MAP (n_bits=>8).
Código VHDL mux8
RTL de mux8
Código VHDL de pre_scaler
RTL de pre_scaler
Diagrama jerárquico de pre_scaler
PARTE 03 – DISEÑO DEL BANCO DE SEÑALES (05 PUNTOS)
Para el generador de señales propuesto, se desea generar las siguientes formas de onda:
cuadrada, diente de sierra, triangular y sinusoidal. Cada forma de onda cuenta con 32 puntos
en un periodo y el valor de cada punto se representa como un número binario de 05 bits.
Dicho de otro modo, para la tercera parte de este laboratorio calificado, se requiere diseñar 04
memorias ROM, cada una con una capacidad de 32 x 5 bits. Estas memorias pueden
construirse empleando el archivo “my_rom.vhd” como plantilla.
Las memorias creadas deben guardarse en los archivos “ROM_A”, “ROM_B”, “ROM_C” y
“ROM_D”. Estas memorias almacenan la señal cuadrada, diente de sierra, triangular y
sinusoidal, respectivamente. Para tener una idea de los valores que deben almacenarse en
cada ROM, se muestran las siguientes gráficas.
Una vez que las memorias han sido diseñadas, debe construirse un nuevo componente: un
multiplexor de 4 a 1. Este componente debe guardarse en el archivo “mux_4_to_1”. El selector
de este multiplexor tiene 02 bits, sus entradas tienen 05 bits y su salida tiene 05 bits.
Desarrollo
Para esta pregunta 3 piden diseñar 4 rom’s y un mux de 4, lo primero que hice en esta pregunta
fue hallar los valores de la posición como se observa en la tabla insertada en la parte inferior, ya
que tenemos los valores de posición de cada rom, empecé a diseñar la rom A de 5 bits que
produce una señal cuadrada, ya teniendo el código genérico lo que se tuvo que hacer fue
cambiar el numero de bits y poner los valores en cada posición, lo mismo con las demás rom’s
asignando los valores de posición de acuerdo a que rom sea. En segundo lugar, se diseño u mux
de 4, asignándole 5 entradas, 4 de las salidas de la rom que después se unirán con una señal,
una del selector de 2 bits que se unirá con el waveform_index y como salida el div_out de 5 bits.
Ya teniendo diseñado todos los bloques, hacemos el código estructural de signal_ bank, tenemos
como entradas el time_index(5 bits), clk, waveform_index(2 bits) y como salida el sig_val(5 bits).
Ya que todas las rom’s son de 5 bits se asignaran al time_index sin problemas por ser de 5 bits
también, luego a todos los enable le asignamos 1 y a todos los clocks de las rom’s se le asignan
el clk del signal_bank, usamos 4 señales que unen las salidas de cada rom con las entradas del
mux, como dijimos anteriormente el sel se le asigna con el waveform_index y por último el
div_out del mux se le asigna el sig_val ambos de 5 bits.
Tabla de valores para las rom’s
Para la última parte de este laboratorio calificado, se requiere interconectar los sub-bloques
creados anteriormente (“input_circuit”, “pre_scaler” y “signal_bank”) con un contador de 06 bits
y un generador de señal PWM, tal y como se muestra en el siguiente diagrama:
Desarrollo
Para esta cuarta pregunta se desea diseñar la entidad TOP, teniendo bloques hechos
anteriormente, teniendo el input_circuit, pre_scaler, un divisor de frecuencia de 32, un contador
de 5 bits, signal_bank y el generador de pwm. Teniendo como entradas frequency, waveform, clk
y como salida el gen_out. Empezaremos diseñando el generador de pwm, teniendo el código
genérico tenemos que cambiar el n_bits a 5 bits. Luego empezamos a diseñar la entidad top, ya
llamados todos los bloques, yo use 5 señales count_sel, count2, s_clkdiv, s_freq, s_counter y
e_pwm. La señal de count_sel es la unión de la salida del input circuit (count_01) con la entrada
sel del pre_scaler, la señal de count2 es la salida del input circuit(count_01) con la entrada
waveform index del signal_ bank, la señal de s_clkdiv es el de la salida del clk_div del pre scaler
y la entrada de clock del generador de pwm, la señal s_freq es la salida del divisor de frecuencia
con la entrada clk del contador y el clk del signal_bank, la señal s_counter une la salida del
contador con el time index del signal_bank y por último la señal e_pwm es la que une la salida
signal bank con la entrada del generador de pwm. Cabe resaltar que en el divisor de frecuencia
tenemos que cambiar el número de bits a 5 y asignar al divider “11111” , el contador también
cambiarle el n_bits a 5 y al period del generador del pwm asignarle “00000”.
- Imput_circuit
- Pre_scaler
- Signal_bank
- Pwm_generator