lunes, 28 de abril de 2008

Controlador do DAC

Introducción
Aquí plantéxase implementar o módulo descrito no diagrama de bloques encargado de que un dato de 12 bits apareza á saida dun dos convertidores DAC121S101 presentes no módulo PMOD DA2 de Digilent.
Cada un destes conversores consiste nunha entrada serie e unha saida analóxica, ademáis de outros sinais de sincronización. A tarefa do módulo a implementar consistirá, por tanto, en capturar un dato en paralelo nun rexistro de desprazamento, engadir uns bits de control e transmitilo cara ó convertidor vía serie.
O controlador que figura implementado na páxina do departamento, ao que anteriormente se fixo mención, está diseñado para o módulo PMOD DA1, que incorpora 2 convertidores de 2 canles, e adaptalo para a aplicación actual conlevaría un grande desperdicio de área na FPGA debido a que somentes precisamos unha canle. Por outra banda, unha das características do módulo PMOD DA2 de Digilent, é que conecta as entradas de sincronización de ámbolos dous convertidores ao mesmo punto, polo que cando se transmite un dato a un convertidor é necesario transmitilo ao outro, e por tanto non se pode ignorar a presencia deste segundo convertidor. Estas dúas razóns leváronnos a reescribir desde cero o controlador para o convertidor, de maneira que somentes se empregan os recursos imprescindibles.




Implementación
A transmisión dos datos vía serie a un convertidor DAC121S101 realízase mediante un protocolo moi sinxelo. Por un lado transmítese un sinal de reloxo que lle indica os instantes de mostreo da entrada serie, e por outra línea recibe un sinal de inicio de trama. A trama consistirá en dous bits indiferentes, dous de modo de operación e 12 para o valor de voltaxe a xerar. A ecuación que relaciona a entrada dixital coa saida analóxica é moi sinxela:



(valor dixital)*(tensión de referencia)/4096



O convertidor mostrea a trama nos flancos de baixada do sinal de reloxo que se lle comunica, polo que a introducción desta na línea serie sincronizarémola por flancos de subida.


O diseño modular interno parece por tanto evidente: un rexistro paralelo/serie, un contador e unha máquina de estados. Sen embargo esto complícase debido a que a máxima frecuencia que admite o convertidor no sinal de reloxo son 30 MHz e o oscilador da placa é de 50 MHz. Ao noso xuicio existen varias solucións a este problema:

a) o controlador pode actuar na súa totalidade a unha frecuencia inferior á do resto do sistema. Poderíase, por exemplo, dividir o sinal do oscilador entre 10, e transmitir un bit da trama en cada periodo de reloxo. Sen embargo esto faría necesario un circuito a maiores para comunicar este controlador co resto do sistema, que opera a unha frecuencia maior.

b) dividir a frecuencia de reloxo de todo o sistema. Non optaremos esta solución debido a que este sistema podería pasar a formar parte de outro máis complexo e por tanto é interesante optimizar a velocidade.

c) poderíase incorporar un divisor de frecuencia de maneira que a máquina de estados espera ao seguinte período de bit. Sen embargo esto complicaría o diseño da máquina de estados xa que tería que controlar dous contadores.


d)unha solución intermedia pasa por incorporar retardos na máquina de estados, con estados que simplemente esperan. Esta será a solución que adoptaremos, dividindo a frecuencia do oscilador de 50 MHz entre 2, para obter 25MHz, que xa entran dentro da marxe especificada de 30 MHz.





Ficheiro fonte e diagrama



dac_top.vhd




DIAGRAMA.JPG
(se non funciona o segundo enlace presionar ENTER sobre a barra de direccións)

Simulación temporal






Extracto do informe de síntese

Device utilization summary:

---------------------------
Selected Device : 3s200ft256-5
Number of Slices: 17 out of 1920 0%

Number of Slice Flip Flops: 30 out of 3840 0%

Number of 4 input LUTs: 26 out of 3840 0%

Number of IOs: 19

Number of bonded IOBs: 19 out of 173 10%

Number of GCLKs: 1 out of 8 12%

Timing Summary:

---------------

Minimum period: 3.764ns (Maximum Frequency: 265.661MHz)

Minimum input arrival time before clock: 2.444ns

Maximum output required time after clock: 6.216ns

Maximum combinational path delay: No path found

Verificación

Para probar o módulo compreto na placa creamos un sistema moi sinxelo que captura dos interruptores os 8 bits máis significativos do dato a convertir. Os demais supóñense nulos. Instánciase un detector de flancos que xera un sinal cada vez que se acciona un dos pulsadores da placa. Neste momento visualízase este mesmo dato nos led para comprobar que non existen erros nos interruptores e dáse orde ao módulo en proba de iniciar a conversión.

A placa conéctase ao convertidor a través da placa MIB de Digilent. Para elaborar o ficheiro .ucf foi necesario seguir a pista de cada un dos sinais.

O ficheiro resultante consta das seguintes liñas:

# DIGILENT S3 BOARD COMPONENTS
NET "clk" LOC = "T9" ;

#Main clock 50 MHz
# S3 BOARD SWITCHES

# FROM SWITCH 7 (MOST SIGNIFICANT) TO SWITCH 0 (LEAST SIGNIFICANT)

NET "dato<7>" LOC = "K13" ;

NET "dato<6>" LOC = "K14" ;

NET "dato<5>" LOC = "J13" ;

NET "dato<4>" LOC = "J14" ;

NET "dato<3>" LOC = "H13" ;

NET "dato<2>" LOC = "H14" ;

NET "dato<1>" LOC = "G12" ;

NET "dato<0>" LOC = "F12" ;
# S3 BOARD PUSHBUTTONS

# FROM BTN3 TO BTN 0

NET "convertir" LOC = "M14" ;

NET "reset" LOC = "M13" ;
# S3 BOARD LEDs

# FROM LED 7 (MOST SIGNIFICANT) TO LED 0 (LEAST SIGNIFICANT)

NET "dato_led<7>" LOC = "P11" ;

NET "dato_led<6>" LOC = "P12" ;

NET "dato_led<5>" LOC = "N12" ;

NET "dato_led<4>" LOC = "P13" ;

NET "dato_led<3>" LOC = "N14" ;

NET "dato_led<2>" LOC = "L12" ;

NET "dato_led<1>" LOC = "P14" ;

NET "dato_led<0>" LOC = "K12" ;
# S3 BOARD 4-DIGIT 7-SEGMENT DYNAMIC DISPLAY ANODES

# FROM ANODE 3 (MOST SIGNIFICANT DIGIT) TO ANODE 0 (LEAST SIGNIFICANT DIGIT)

# ACTIVE LOW ANODES

NET "sclk" LOC = "C11" ;

NET "sdin2" LOC = "T3" ;

NET "sdin1" LOC = "E10" ;

NET "sync" LOC = "C10" ;

Con esto damos por concluido o diseño do controlador do convertidor DA, anque é posible realizar unha pequena optimización introducindo un rexistro de desprazamento para conmutar o segundo conversor a modo de baixo consumo. De facerse farase ao final do proxecto.


martes, 15 de abril de 2008

Gráfica 1





Diseño dos osciladores


Elección da frecuencia de mostreo do sistema


A frecuencia máxima de muestreo virá determinada polo tempo que lle leva ao convertidor dixital-analóxico xerar unha saida estable. Segundo as follas de características o período mínimo para o peor caso é de 12us. Esto permítenos unha frecuencia máxima de 83kHz.


Por outra banda, a frecuencia mínima de mostreo ven dada polo dobre da máxima frecuencia analóxica coa que se vai traballar, que neste caso será de 2*1633Hz=3266Hz para cumprir o criterio de Nyquist.


Outra restricción a maiores é que a frecuencia debe poder xerarse a partir do oscilador incluido na placa que é de 50MHz.


Esta marxe é moi amplia, pero co fin de non incorporar un filtro analóxico á saida do sistema empregaremos sobremostreo. A contraparte desto será unha menor precisión na frecuencia debido á cuantificación dos coeficientes.


En canto a esta, empregaremos o menor número de bits necesarios. Partimos de I1Q11 debido ao número de bits cos que traballa o convertidor, pero un coeficiente é maior que 1 nalgún caso (en módulo) , polo que como mínimo será I2Q10 se mantemos o número total de bits.


O estándar esixe que as frecuencias xeradas estean nun marxe de 1.5% da especificada, polo que debemos realizar a elección do número de bits dos coeficientes do filtro acorde con esto. Para este propósito escribimos dous scripts en Matlab, un que xera o filtro a partir dunha frecuencia discreta, e o outro que calcula a tolerancia despois da cuantificación:




script 1
function [num,den]=filtro(omega_discreta)
num=[1 -cos(omega_discreta)];
den=[1 -2*cos(omega_discreta) 1];
end




script 2
Q=10;
Ts=1/50000;
frec_analoxicas=[697 770 852 941 1209 1336 1477 1633];
w=2*pi*frec_analoxicas*Ts;
for k=1:length(frec_analoxicas)
%%filtro sen cuantificar
[N,D]=filtro(w(k));
%%filtro cuantificado
Dc=round(D*2^Q)/2^Q;
dif=phase(roots(D))-phase(roots(Dc));
tol=max(abs(dif))/Ts/2/pi;
fprintf('frec=%iHz => tolerancia=%iHz => %i%%\n',frec_analoxicas(k),tol,tol/frec_analoxicas(k)*100)
end






A saida xerada é:


frec=697Hz => tolerancia=6.601286e+000Hz => 9.470998e-001%


frec=770Hz => tolerancia=1.671428e+001Hz => 2.170685e+000%


frec=852Hz => tolerancia=9.872585e+000Hz => 1.158754e+000%


frec=941Hz => tolerancia=9.995271e+000Hz => 1.062197e+000%


frec=1209Hz => tolerancia=1.046912e+001Hz => 8.659324e-001%


frec=1336Hz => tolerancia=4.765929e+000Hz => 3.567312e-001%


frec=1477Hz => tolerancia=3.688330e+000Hz => 2.497177e-001%


frec=1633Hz => tolerancia=5.679399e-001Hz => 3.477893e-002%




onde detectamos que para 770Hz supérase o 1.5%, polo que empregaremos un bit a maiores.


Repetindo esto para I2Q11 obtemos:


frec=697Hz => tolerancia=6.601286e+000Hz => 9.470998e-001%


frec=770Hz => tolerancia=3.221402e+000Hz => 4.183639e-001%


frec=852Hz => tolerancia=8.291335e+000Hz => 9.731614e-001%


frec=941Hz => tolerancia=6.503294e+000Hz => 6.911046e-001%


frec=1209Hz => tolerancia=2.325194e+000Hz => 1.923238e-001%


frec=1336Hz => tolerancia=4.765929e+000Hz => 3.567312e-001%


frec=1477Hz => tolerancia=3.688330e+000Hz => 2.497177e-001%


frec=1633Hz => tolerancia=5.679399e-001Hz => 3.477893e-002%




co que sí cumplimos a restricción.




En cuanto aos efectos da precisión finita dentro dos filtros simulamos a resposta con Matlab valéndonos do Toolbox de procesado de sinal: mediante o fdatool definimos a lonxitude dos acumuladores, coeficientes e rexistros e mediante dfilt/filter() xeramos un tono de 10 segundos para comprobar a resposta final:








jueves, 3 de abril de 2008

Búsqueda de información

Introducción
A sinalización (transmisión de información de control entre nodos) na rede telefónica resolveuse de maneiras distintas ao longo do tempo. En concreto, a información de control que intercambian os dous extremos do bucle de abonado realizouse tradicionalmente de maneiras distintas: primeiramente de modo manual a través de operadores humanos, a posteriori mediante LD (loop disconnect), que era o sistema do disco de marcar xiratorio presente ata os 90, despois con DTMF e finalmente con transmisión dixital de datos, que é o que se emprega actualmente en bucles DSL ou cable.

DTMF

Aquí centrarémonos nun dos pasos intermedios: o sistema de marcado mediante dous tonos multifrecuencia (Dual Tone Multi-Frequency), que foi unha solución máis eficiente que o LD, pero que non implicaba un excesivo coste na sustitución de terminais e unidades de marcado. Consiste na transmisión na banda de voz (a telefónica quédase co que hai entre 30 Hz e 3 KHz) da suma de dous tonos (cosenos), por tanto audibles polo ser humano. O sistema foi estandarizado polo UIT-T na recomendación Q.23, onde se especifican as frecuencias que corresponden a cada sinal. Estas asócianse coa disposición no teclado de cada número, solución que abarata o coste dos terminais, xa que mediante un sistema de interruptores é moi doada de implementar a selección. Sen embargo tamén existen máis sinais a maiores, como a de liña ocupada, liña libre, rechamada (US), A, B, C, D, *, # etc, estas últimas empregadas polos enxeñeiros para comunicarense con ordenadores mediante os terminais. Cómpre destacar que as frecuencias son distintas en Europa e nos Estados Unidos, onde simplemente descolgando o teléfono percibimos perfectamente a diferencia, que é perfectamente audible.
A solución analóxica nas unidades de marcado é filtrar paso banda con 8 filtros e decidir respecto do sinal transmitido.

As frecuencias dos tonos (wikipedia)
The tone frequencies, as defined by the Precise Tone Plan, are selected such that harmonics and intermodulation products will not cause an unreliable signal. No frequency is a multiple of another, the difference between any two frequencies does not equal any of the frequencies, and the sum of any two frequencies does not equal any of the frequencies. The frequencies were initially designed with a ratio of 21/19, which is slightly less than a whole tone. The frequencies may not vary more than ±1.5% from their nominal frequency, or the switching center will ignore the signal. The high frequencies may be the same volume or louder as the low frequencies when sent across the line. The loudness difference between the high and low frequencies can be as large as 3 decibels (dB) and is referred to as "twist". The minimum duration of the tone should be at least 70 msec, although in some countries and applications DTMF receivers must be able to reliably detect DTMF tones as short as 45ms.

DTMF can be decoded using the Goertzel algorithm.



Máis información
A medida que se vaia desenvolvendo o proxecto irase colgando máis información, como o manexo exacto do convertidor e o análisis e simulación en matlab do proceso de xeración dos tonos.

Referencias

Recomendación Q.23
Recomendacións ITU-T para implementar servicios DTMF
Wikipedia

Diagramas de bloques

Posto que o que se pedía era unha lista de bloques necesarios, así como as súas entradas, saidas e interconexións, o máis sinxelo para nós resulta ir creando as entidades en VHDL e xuntalas nun schematic, que da unha visión global moi clara do que se pretende.
Nunha primeira aproximación ao problema dividímolo en 3 bloques, un encargado do teclado, outro de xerar a suma dos tonos e outro encargado de enviar vía serie os datos ao DAC. A interface co exterior está ben definida, máis sen embargo, pode chegar a ser necesario incluir algunha outra saida a nivel constante.


Tanto o bloque de control do teclado como o de control do DAC están desenvolvidos na web do DTE, pero non se adaptan ao que consideramos máis optimizado para esta aplicación en concreto, así que adaptarémolos modificando lixeiramente a súa arquitectura externa: so empregaremos unha saida analóxica do convertidor, así como non se precisa realizar a conversión de filas e columnas a hexadecimal dentro do controlador do teclado.
O bloque importante é o central, que nun seguinte nivel de abstracción podemos dividir nos seguintes subsistemas:
Aquí unha máquina de estados (da que posteriormente engadiremos o diagrama de estados) encárgase dar a orde de inicialización dos osciladores cando a tecla é pulsada. A partir de entón indícalles mediante o sinal xera_mostra cando deben calcular a seguinte mostra, que ven sendo no seguinte instante de mostreo. Para temporizar o período de mostreo emprega un contador auxiliar provisto dun combinacional. O sumador final encárgase de que o que vaia para o DAC sexa a suma de ambos tonos, un correspondente ás filas e outro ás columnas.
Os osciladores están constituidos internamente por unha memoria ROM de coeficientes, que en principio implementaremos coma memoria distribuida debido ás súas pequenas dimensións(96x12bits), dous rexistros e un filtro IIR inestable. O funcionamento do mesmo xa foi verificado en Matlab con anterioridade, e cremos que constitúe a solción óptima, inda que seguramente precise ser modificado para funcionar correctamente en punto fixo.