Вы находитесь на странице: 1из 27

Grado en Ingeniera Electrnica de Comunicaciones

Curso acadmico 2015-2016


Asignatura Diseo Electrnico
Departamento de Electrnica
Universidad de Alcal

Controlador para Cdec de Audio

Agero Zeballos, Sebastin Alonso


Bitai, Anne Mria
1

ndice
Introduccin ................................................................................................................ 3

1.- Detector de flanco de subida y de bajada configurable. ................................ 4

2.- Doble detector de flanco de subida y de bajada basado en un modelo


genrico. ...................................................................................................................... 9

3.- Reset and sync generation. .............................................................................. 11

4.- Output Frame ...................................................................................................... 16

5 y 6.- Control de Volmen y Frecuencia, y modelo general final. .................. 21

7.- Conclusiones ...................................................................................................... 27

Introduccin
En este laboratorio se pretende realizar un diseo sintetizable mediante cdigo
VHDL para controlar un sistema integrado de la FPGA spartan 6, el LM4550,
un CODEC de audio. Para llevar a cabo este diseo se ha desglosado el
mismo en diferentes entidades, para facilitar el entendimiento de cada paso, y
hacer un anlisis localizado, que resulta ms sencillo a la hora de encontrar
posibles fallos durante su desarrollo.

El diseo consiste en un top system que engloba a todas las dems entidades,
y contiene el dcm, el codec_controller, y en la versin final del diseo tambin
incluye una entidad llamada vol_freq_control.

El dcm (digital clock manager) se utiliza como herramienta para alinear todos
los relojes internos del diseo. A veces puede existir cierto desfase entre
relojes y este mdulo lo corrige. Se genera utilizando un coregen, as que no
tiene mayor diseo propio.

El codec_controller contiene a las entidades que realmente se van a disear en


esta prctica (aparte del vol_freq_control), y estas son: double_edge_detector,
output_frame, y rst_and_sync_generation.

La unidad ms bsica de este diseo, es un detector de flancos, con el que


luego se construye un detector doble de flancos. Esta unidad se utilizar para
detectar flancos de una seal de reloj proporcionada por el cdec (bit_clk) que
da la temporizacin de los bits. Esta seal que detecta los flancos de bit_clk se
utilizar

para

sincronizar

todo

el

sistema

mediante

clock

enables

principalmente.

La entidad rst_and_sync_generation es la encargada de generar un reset inicial


para resetear todos los componentes del cdec, y se ha elegido un valor de 5
us para su duracin. Adems de esto, tambin es la encargada de generar una
seal de sincronismo que se activa a nivel alto durante los primeros 16 bits de
cada trama generada en el output_frame.
3

La entidad output_frame, como se menciona anteriormente, es la encargada de


generar las tramas, que luego son serializadas antes de mandarlas al cdec.
Dado que la trama se forma mediante informacin relativa al volumen y
frecuencia del tono que se quiere transmitir al cdec, dentro de esta entidad
tambin se generan las muestras del tono a transmitir, adems de su
frecuencia y volumen.

Como extra, y para realizar un mejor diseo, se expande el control del volumen
y frecuencia a una entidad, en lugar de unos switches de la FPGA. Se pretende
realizar lo que se hacia con 8 switches, ahora con 2 botones y 1 switch. Para
ello se incluye vol_freq_control, que estar formada por una mquina de
estados y unos contadores.

Todas estas entidades en conjunto van a realizar el control del cdec de audio
LM4550. Para cada entidad primero se va a proceder a realizar su traduccin a
componentes electrnicos en base a su funcionalidad. Y luego sern retraducidos a cdigo VHDL sintetizable. Cada entidad ser verificada con
simulaciones en bancos de prueba, inyectando distintos estmulos.

1.- Detector de flanco de subida y de bajada configurable.


Para llevar a cabo el diseo en VHDL de esta entidad, primero se ha realizado
el diseo equivalente utilizando componentes electrnicos mostrados en la
figura 1.1.

Fig. 1.1 Esquemtico del circuito

El diseo se detalla en los siguientes pasos:

1. La seal de entrada sobre la cual se quiere detectar los flancos


(input_signal se registra mediante un biestable, aadiendo ste
una latencia de un ciclo de reloj (10 ns) a la seal de salida
(din_r).
2. Al conmutar la seal input_signal, una de las puertas AND recibe
en una de sus entradas el valor de la seal actual (input_signal) y
en su otra entrada el valor de la seal de entrada registrada (not
(din_r)). En la otra puerta AND, ocurre lo contrario, un terminal
tiene not (input_signal), y el otro tiene din_r sin invertir.
3. De esta manera, al haber un flanco de subida en input_signal, el
valor anterior de esta seal es 0 (el cual se invierte en AND1), y el
actual es 1, por tanto r_edge detecta el flanco de subida con un
nivel alto, mientras que si hay un flanco de bajada, el valor
anterior de la seal es 1 y el actual es 0 (el cual se invierte en
AND2),

y entonces f_edge detecta un flanco de bajada con

tambin con un nivel alto.


4. Las seales f_edge y r_edge se conectan a un multiplexor 2:1 en
el cual se selecciona mediante la seal mode la entrada que se
quiere transmitir al biestable de salida.
5. Por ltimo, se registra la seal O_edge en el bistable de salida y
se obtiene edge_output, que estar activa durante un ciclo de
reloj.
Se visualiza mejor el comportamiento de Las puertas AND en la tabla 1.1,
descrita para cuando ocurre un flanco en la seal de entrada:

Seal

Valor

Valor

input_signal

din_r

r_edge

f_edge

0
Tabla1.1

Para la realizacin del diseo se han utilizado los componentes especificados


en la tabla 1.2:

Componente

Nmero

Biestable

Puerta AND

Multiplexor

Inversor

2
Tabla 1.2 Componentes usados

Luego se procede a su simulacin funcional para verificar su correcto


funcionamiento a travs del anlisis del cronograma mostrado a continuacin.

Figura 1.3 Simulacin funcional del detector de flancos

En la simulacin se pueden observar dos seales internas en colores distintos


para la mejor comprensin de lo que est pasando. En azul se puede ver la
seal de entrada registrada, con su respectiva latencia (entre 0 y 10 ns
dependiendo de qu tan lejos estaba la seal de entrada al conmutar del flanco
de reloj). Esta latencia se aprovecha para generar la seal edge, cuya duracin
depende de la latencia que tuvo la seal registrada. Edge pasa por otro
biestable (el de salida), quin le otorga otra latencia respecto a la seal de
entrada, pero estabiliza su duracin en alto, dejndola fija en 10 ns para
cualquier tiempo en alto de edge. Esto evita posibles glitches y por eso siempre
es recomendable utilizar biestables de salida.

Para los estmulos se ha utiliza una seal de entrada que imita a la seal
bit_clk generada por el cdec, como se puede apreciar en la figura 1.4.

Figura 1.4

Adicionalmente a eso, se genera una seal de clk de 100MHz, y se simula un


rst inicial de 32 ns. Finalmente para comprobar que el diseo puede detectar
flancos tanto de subida como de bajada, a la mitad de la simulacin se procede
a cambiar mode de 1 a 0. En el cronograma se puede apreciar que al
cambiar mode, la seal de salida empieza a activarse para flancos de bajada
en lugar de subida.

En funcionamiento continuo el cronograma se vera como en la figura 1.5.

Figura 1.5 Vista alejada de la simulacin.

En la vista alejada se puede apreciar mejor la variacin de latencia de la seal


edge, en contraste con la seal edge_output que siempre est en alto 10ns.

Una vez verificado su compartamiento se procede a realizar la simulacin


temporal.

Figura 1.6 Simulacin temporal vista alejada

Aqu todo es bastante parecido a lo anterior, con la diferencia que el primer


flanco parece errneo, como si de un flanco de bajada se tratase. Pero la
verdad, si se observa din_r_37, se aprecia que est detectando un flanco de
subida, lo que pasa es que din_r_37 tuvo un delay inexplicable al registrar la
seal de entrada. Para todos los siguientes flancos se puede ver que esta
anormalidad no continua.

Figura 1.7 Simulacin temporal vista con zoom.

Para el comportamiento normal, todo es muy similar a la simulacin funcional.

Una vez verificado el modelo vhdl, se adapta ligeramente para poder utilizarlo
en la construccin del detector doble de flancos. La seal mode pasa a ser un
genrico en lugar de un puerto. Todo lo dems sigue igual.

2.- Doble detector de flanco de subida y de bajada basado en un


modelo genrico.
Para este modelo, el componente doble_edge_detector est formado por la
instantacin del componente creado previamente, el detector de flanco
edge_detector_generic.

Sin embargo, se instancia dos veces, una para detectar el flanco de subida
cuando mode vale 1, y otra para que detecte el flanco de bajada cuando
mode vale 0. Su funcionalidad es la misma que la estudiada en el punto 1.

Figura 2.1 Simulacin funcional vista en funcionamiento continuo.

Ahora tenemos dos seales, una que detecta flancos solo de subida, y otra que
detecta flancos solo de bajada con sus latencias correspondientes.

Figura 2.2 Simulacin funcional vista de cerca.

Como todo es igual que en el apartado anterior, se han omitido las seales
internas que se estudiaron para ese caso.

Figura 2.3 Estimulos del testbench.

Dado que este diseo no tiene seal mode, no ha sido necesario ponerla como
parte de los estmulos. Todo lo dems es idntico.

Figura 2.4 Simulacin temporal.

Otra vez a la hora de hacer la simulacin temporal, ocurre algo anmalo, el


octavo flanco de bajada es inexistente. La causa de esto se desconoce.

Figura 2.4 simulacin temporal de cerca.

En funcionamiento normal es igual al detector simple.


10

3.- Reset and sync generation.


En esta ocasin se har uso de ms componentes. Dado que se tiene que
contar pulsos para generar la seal sync, se har uso de un contador de 8 bits
sincronizado con r_edge_b_clk en su clock enable, para que vaya contado bits.
Para saber cundo se ha alcanzado el nivel de cuenta deseado se utiliza un
comparador. Normal si se quisiera contar 16 pulsos, se hara de 0 a 15, pero
dado que sync debe iniciar su nivel alto cuando la cuenta es 255, se procede a
contar de 255 a 14, teniendo la cuenta iniciada en 255 despus del rst inicial. Si
el valor de cuenta es 255, o cualquier nmero del 0 al 14, sync es 1. Para
todos los dems valores de cuenta sync ser 0.

Por otro lado, la generacin de un reset de 5 us implica contar tiempo, lo que


va a llevar a otro contador. El tiempo de una cuenta funcionando a frecuencia
de reloj es 10 ns por cuenta, entonces se necesitan 500 cuentas para llegar a
5000 ns = 5 us. Se procede a contar de 0 a 499 (en la prctica se ha puesto
500, por lo que se tiene 5010 ns de reset, pero se ha dejado as dado que
estn todas las capturas hechas con ese valor). Y comparar de la misma forma
que se haca con sync (con un comparador). Si la cuenta es menor de 500 la
salida del comparador es 0, y si es mayor o igual la salida es 1. Para que el
contador no siga contando se utiliza la propia salida del comparador como
clock enable del contador, solo que invertida. De esta manera despus del
reset inicial, la cuenta es 0, la salida del comparador es 0, el clock enable es
1. Y cuando el comparador pasa a 1 el clock enable se desactiva a 0 y
nunca ms vuelve a activarse. Para contar hasta 500 se necesita un contador
de 9 bits.

Ambas salidas, sync y reset, se registran con biestables de salida para evitar
glitches, y se controla sus clock enable con la propia seal de salida de reset.
El valor de cuenta de bits tambin se conecta a una salida, pasando por un
biestable. Todo lo descrito se puede comprobar en el siguiente esquema.

11

Figura 3.1 Esquema de componentes de esta entidad. **Nota: En el diseo original el contador de 9 bits no tenia clock
enable, y se controlaba su periocidad con un multiplexor, tras implementar el clock enable como mejor solucin, el mux
no fue removido, y ahora no fue removido por falta de tiempo, pero su comportamiento al ser redundante no afecta la
funcionalidad del sistema, solamente usa ms lgica.

Figura 3.2 Simulacin funcional de la entidad.

En esta captura se ve mejor la temporizacin de sync, el pequeo tiempo en


alto seguido de un tiempo en bajo mucho ms largo.

12

Figura 3.3 Simulacin funcional con nfasis en tiempo en alto de sync.

En este zoom se aprecia que sync se activa cuando la cuenta es 255 (FF), y
finaliza cuando es 14 (0E). Tambien se puede ver que el tiempo total de esto
es 1.31 us, lo cual es bastante aceptable con lo que debera dar (1.3 us).

Figura 3.4 Simulacin funcional para visualizar tiempo en bajo de sync.

En esta otra captura estn presentes dos markers que nos dicen que el tiempo
en bajo de sync ha sido de 19,53 us (tambin aceptable, dado que debera dar
cercano a 19,5 us).

13

Figura 3.5 simulacin funcional, verificacin de r_edge_b_clk.

Dado que se ha simulado la entidad de rst_and_sync_generation en un


testbench conjuntamente con la entidad double_edge_detector, se aprovecha
para verificar que el tiempo en alto es de 10 ns.

Figura 3.6 Estmulos para testbench.

Para este banco de pruebas no hubo ningn estmulo extraordinario.

14

Figura 3.7 Simulacin temporal.

La simulacin temporal desde esta vista se ve exactamente igual que la antes.

Figura 3.8 Simulacin temporal zoom en sync.

Pero aunque no lo pareciera, hay una diferencia, ahora el tiempo en alto de la


seal sync es exactamente 1.3 us.

Figura 3.9 Simulacin temporal zoom en sync 2.

Y se siguen respedando los valores de cuenta para los cuales sync debe
activarse.

Figura 3.10 Simulacin temporal zoom en sync bajo.

15

Para la simulacin temporal el tiempo en bajo es de 19.54 us, ligeramente


distinto a la simulacin funcional.

4.- Output Frame


Esta entidad es la entidad ms importante del diseo, ya que es la encargada
de configurar y serializar la trama que se enva al cdec, y se controla adems
la frecuencia y volumen del tono a transmitir. Ya que se tiene que configurar 4
slots diferentes, la trama no es la misma para cada slot, y para modificar las
partes que cambian de la trama se hara uso de una mquina de estados. Esta
mquina tendr 4 estados: initial, general, pcm, mastervol.

Figura 4.1 Mquina de estados que controla los slots 1 y 2 de la trama.

Cada estado, salvo el inicial, va a configurar un registro distinto en el cdec. En


el slot 1 se manda la direccin de estos registros, y corresponde a ADR en el
16

esquema, y el slot 2 se mandan los datos a escribir en esos registros, y


corresponde con DATA.

En el slot 0 se manda el tag, que sirve para indicar qu registros vamos a usar
del cdec y que informacin de manda de los canales de audio. El tag es el
mismo siempre en todas las tramas, y por tanto no forma parte de la mquina
de estados. Los slots 3 y 4 son para los datos de los canales de audio, en esta
prctica se ha optado por mandar la misma informacin por ambos canales.
Cada slot es para un canal.

Una vez que se tiene la trama, para evitar glitches nuevamente, la registramos,
y luego se procede a serializarla mediante un multiplexor de 256 entradas. Se
conecta dada bit de la trama a un canal del multiplexor, y se utiliza un contador
de 8 bits para ir cambiando de canal en canal, cosa de que en la seal nica de
salida se obtienen los distintos bits. El contador de 8 bits est sincronizado con
r_edge_b_clk por su puesto, ya que estamos contando bits.

Adicional a esto, en esta entidad existe un control de frecuencia del tono que
se pretende enviar, actuando sobre el contador que barre la memoria que
contiene las muestras de los valores de un seno. Para actuar sobre el contador
se utiliza un prescaler controlado por un codificador que a su vez est
controlado por freq_code, el valor que se desea de frecuencia. Ya que
freq_code es un std_logic_vecto de 4 bits, se tienen 16 posibles frecuencias a
seleccionar, y se desea que se correspondan con los valores mostrados en la
siguiente tabla:

Frecuencia(Hz) Frecuencia
primaria
99,6
198,5
297,7
393,8
498,2
697,5
976,6
1220,7

24414
24414
24414
24414
24414
24414
24414
24414

Valor decimal

Valor
Hexadecimal

245
122
82
61
49
35
24
20

F5
7A
52
3D
31
23
18
14

17

1627,6
1878
2441,4
3000
3487,7
4069
4882,8
6103,5

24414
24414
24414
24414
24414
24414
24414
24414

15
13
10
8
7
6
5
4

0F
0D
0A
08
07
06
05
04

Si se barre la memoria a frecuencia de reloj (100MHz) el periodo del seno


resultante es de 24414KHz. Para seleccionar las frecuencias mostradas a la
izquierda de la tabla, se utiliza un prescaler con divisin ajustable mediante el
cdigo freq_code. Se muestra tanto el valor decimal del entero que toma el
divisor del prescaler, como el valor en hexadecimal que tomara freq_code para
las distintas frecuencias.

Este convertidor se puede fabricar con un simple case, y el prescaler es igual al


hecho en tutorial.

Figura 4.2 Esquema de la entidad.

18

Todo lo explicado se resume en este esquema de bloques. Solo est en


ausencia el clock enable del registro de salida de sdata_out, que corresponde
con r_edge_b_clk.

Figura 4.3 Simulacin temporal vista de lejos.

En esta visin general se puede ver que todo pareciera funcionar


correctamente, se observa un pico concentrado de bits en cada sync, lo cual
corresponde con el tag (xF800) que son 5 bits a 1 seguidos.

Figura 4.4 Simulacin temporal. Visto ms de cerca se aprecia mejor la serializacin.

Figura 4.5 Simulacin funcional con seales internas.

Para entender mejor lo que est pasando se agregan seales internas a la


simulacin. Las seales state y clkdiv no se pudieron poner el color pero
alguna razn, pero tambin son seales internas.

19

Se puede ver que con cada sync, cambia el estado, lo cual es correcto, y
tambin se puede apreciar que cuando cambiamos el valor de frecuencia (los 4
ultimos bits de SW) a la mxima frecuencia, el prescaler empieza a activarse
mucho ms seguido, y con ello, la memoria se barre mucho ms rpido. Por lo
que se comprueba que el control de frecuencia funciona sin problemas.

Figura 4.6 Simulacon funcional con zoom en el cambio de frecuencia.

Figura 4.7

Para este testbench aparte de los estmulos normales se ha hecho un barrido


de los SW, cambiando primero el valor del volumen y luego el valor de
frecuencia, para terminar cambiando los dos.

Cabe destacar que en esta simulacin se ha simulado la entidad cdec


controller, por recomendacin del profesor, en lugar de simular output_frame
20

por s solo. As que todas las capturas correspondes a simulaciones del cdec
controller.

5 y 6.- Control de Volmen y Frecuencia, y modelo general final.


Para mejorar el control de volumen y frecuencia (utilizar mejor pines de la
FPGA para su control) se ha propuesto un modelo vhdl que se va a situar en el
top system (recomendacin del profesor).

Figura 5.1 Esquema de vol_freq_control.

Este mdulo principalmente consta de 2 prescalers, 2 contadores, y una


mquina de estados.

Los prescalers se encargan de contador de 1 segundo en 1 segundo siempre y


cuando se mantenga presionado ya sea el botn de aumentar o de
decrementar (frecuencia o volumen).

Los contadores se encargan de aumentar o decrementar segn las seales de


salida de la mquina de estados. No son contadores cclicos, por lo que se
saturan al llegar a mxima/mnima cuenta. El valor de la cuenta es el valor de
los cdigos de frecuencia o volumen.
21

La mquina de estados se encarga de decidir si los contadores son crecientes


o decrecientes segn la combinacin de botones que se presiona.

Figura 5.2 Grafo de la mquina de estados

Figura 5.3 Simulacin funcional de top system incluyendo vol_freq_control.

22

Para apreciar lo que pasa con vol_code y freq_code, por recomendacin del
profesor se han puesto en leds la concatenacin de vol_code y freq_code.
Luego se ha procedido a estimular los botones de la FPGA primero ascendente
en frecuencia, luego descendente en frecuencia, despus ascendente en
volumen, y finalmente descendente en volumen. Todos hasta saturacin antes
de pasar a otro.

Figura 5.4 Estimulos para los botones y switches

Figura 5.5 Simulacin funcional vista de cerca.

Ms de cerca se observa como conmuta la memoria mas lentamente de 485 a


486. Y como el canal derecho va siguiendo los valores de la memoria
23

correctamente. Tambien se observan datos aparentemente correctamente


serializados en sdata_out.

Figura 5.6 Simulacin temporal de lejos.

Figura 5.7 Simulacin temporal de cerca.

Las simulaciones temporales no salen igual pero pareciera que todo funciona.
No se pueden ver tan bien como las otras ya que es difcil encontrar las
seales internas en simulacin temporal.

La cantidad de lgica inferida en este modelo descargable en placa es la


siguiente:

24

25

Y para el modelo del apartado 4 la lgica utilizada fue:

26

7.- Conclusiones
En todo proyecto es clave tener las entidades claras y bien ordenadas para la
fcil comprensin y debug de errores. Tambien es importante ir haciendo las
simulaciones paso a paso, tanto las funcionales como las temporales, que son
muy importantes para ir verificando el funcionamiento del cdigo.

Tambien es importante ir probando distintos estmulos en el banco de pruebas,


y a su vez ir verificando distintas seales internas, a veces el modelo parece
correcto pero el error yace en ellas.

27

Вам также может понравиться