lunes, 11 de mayo de 2009

Unidade de Cálculo de Módulos (I): Documentación

Esta é a documentación da Unidade de Cálculo de Módulos, supostamente definitiva. Se se produce algún cambio indicarese nestas liñas.

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

Modelo VHDL da Unidade de cálculo de módulos.

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

1.- Descrición do circuito:

Este circuito efectúa o cálculo do módulo de números complexos en forma cartesiá z = a + jb, onde a e b son a parte real e imaxinaria do número respectivamente e j é a unidade imaxinaria. Os valores a e b deben estar expresados con 18 bits en complemento a 2, mentres que o módulo de z proporciónase nun formato sen signo de 9 bits.
No seu interior este circuito implementa directamente a expresión
|z| = (a^2 + b^2)^(1/2)
seguindo a orde de operacións lóxica: primeiro realiza o producto de cada parte por si mesma, logo suma os resultados, e por último calcula a raíz cadrada da suma utilizando un IPCore de Xilinx que implementa unha variante do algoritmo Cordic. Este IPCore proporciona resultados enteiros de 19 bits sen signo, redondeando tódalas cifras decimais sempre que sexa necesario.
A continuación os valores dos módulos de 19 bits deben ser adaptados ó bus de saída de datos, de 9 bits de ancho. Para isto intercálase entre o IPCore Cordic e o bus de saída un circuito de redondeo/truncado e saturación (UD_RD_SAT). Este circuito permite escala-lo valor de entrada por unha potencia de dous e finalmente limita-dos valores de saída a unha constante arbitraria, evitando así problemas de desbordamento. Os detalles sobre este circuito atópanse no arquivo redondeo_saturación.vhd.



2.- Estructura do circuito:


O circuito está deseñado como unha estructura de procesado de datos en pipeline. Posúe tres etapas en serie:
• Unha etapa inicial na que se calcula o cadrado das partes real e imaxinaria e se suman, isto é, o módulo ó cadrado do número complexo de entrada.
• Unha segunda etapa co IPCore que implementa o algoritmo Cordic, no que se computa a raíz cadrada do módulo ó cadrado.
• Unha etapa final de adaptación do valor do módulo de 19 bits ó bus de saída de 9 liñas, mediante o circuito de redondeo/truncamento e saturación.
A etapa inicial e o IPCore Cordic realizan os seus cálculos con pipelining sempre; no entanto, o circuito de adaptación por redondeo/truncamento e saturación pode realizar pipelining ou non dependendo da asignación ós parámetros xenéricos: pode ser dende un circuito totalmente combinacional ata implementar múltiples etapas de pipelining, en función das asignacións ós parámetros xenéricos do modelo VHDL da Unidade de Cálculo de Módulos.

Para que a Unidade de Cálculo de Módulos funcione correctamente o IPCore Cordic debe xerarse coas seguintes características:
- Debe implementa-la operación raíz cadrada, como é lóxico.
- Debe elixirse unha estructura con pipeline óptimo ou máximo. Unha ou outra elección só repercute na frecuencia máxima de traballo do circuito completo, xa que de toda a circuitería da unidade de cálculo de módulos, este IPCore é o elemento máis limitativo.
- O formato de datos debe ser enteiro sen signo ("unsigned integer"), e é necesario que o IPCore posúa terminais CE, SCLR, ND e RDY.
- As entradas e saídas deben posuír rexistros obrigatoriamente, de 36 bits e 19 respectivamente.
Os demáis parámetros poden elixirse a vontade, o circuito funcionará exactamente igual, aínda que para que o redondeo se realice tal e como aquí se describe debe marcarse a opción "Roud Pos Inf".


3.- Descrición dos terminais de entrada e saída:

As entradas do circuito son as seguintes:

• X_RE, X_IM: buses de entrada das partes real e imaxinaria.

• DV_IN: liña activa a nivel alto e síncrona que indica que existen datos válidos nos buses X_RE e X_IM. Cando este terminal se atopa a nivel alto e se produce un flanco de reloxo ascendente os datos de ambos buses son capturados para comeza-lo seu procesado inmediatamente. Grazas á estructura pipeline da unidade de cálculo de módulos é posíbel cargar un par de datos de entrada (a parte real e a parte imaxinaria) en cada ciclo de reloxo mandendo a nivel alto a liña DV_IN. A única restricción é que se debe asegura-la estabilidade dos datos de ambos buses cando se procuza o flanco ascendente e polo tanto a súa captura.

• escala: Bus de dúas liñas onde se especifica un valor asociado ós desprazamentos á dereita dos módulos da DFT de 19 bits antes do circuito de saturación (zoom). Permítense catro valores de escala, dende 0 (máis detalle, sen redondeo/truncamento) a 3 (mínimo detalle, máximo redondeo/truncamento). A cantidade de bits desprazados á dereira é de 3*(Escala).

• escala_WE: terminal de habilitación de captura do valor do bus Escala. A captura ocorre sempre que escala_WE estea a nivel alto e se produza un flanco ascendente.

Estes dous sinais están directamente conectados nas entradas cos mesmos nomes do circuito de redondeo / truncamento e saturación.

As saídas do circuito son as seguintes:

• Modulo: bus de datos síncrono no que se proporcionan os valores dos módulos calculados polo circuito. Cada un destes valores aparece durante un único ciclo de reloxo.

• DV_OUT: sinal activo a nivel alto e síncrono que indica que no bus Modulo existen un dato válido. Este sinal actívase un ciclo de reloxo por cada dato de saída presentado polo circuito, manténdose a nivel alto durante varios ciclos se nestes se proporcionan varios resultados válidos consecutivos. A captura do valor do bus Modulo debería producirse sempre que DV_OUT se atopa a nivel alto e ocorre un flanco ascendente de reloxo, xa que é neste momento no que se asegura sempre a estabilidade dos datos.


Os portos de simulación permiten obter información sobre os cálculos internos da unidade: X_mod2_SIM amosa cada un dos módulos ó cadrado calculados e X_mod_SIM a saída do core Cordic, isto é, a raíz cadrada de X_mod2_ SIM. Non existe ningún sinal indicador de datos válidos, co que o uso destes valores necesita analiza-la latencia dos datos, e é pouco aconsellábel.


4.- Implementación:

O valor dos parámetros xenéricos determina a estructura interna do circuito de redondeo / truncado e saturación. Están directamente asignados ós parámetros xenéricos da instancia deste circuito, co que afectan exclusivamente ó seu funcionamento. A súa descrición atópase na documentación do modelo vhdl do circuito de redondeo / truncado e saturación.
Brevemente:
• O parámetro REDONDEO indica se o cálculo do módulo se realiza con redondeo intermedio (REDONDEO = true, precisa máis recursos) ou con truncado (REDONDEO = false, menos recursos empregados).
• NIVEL_PIPELINING serve para selecciona-la estructura do circuito de redondeo e saturación. Canto máis alto sexa este valor (dentro dos posíbeis) máis etapas de pipeline se engaden no circuito, o que permite que traballe a unha frecuencia de traballo maior a costa dunha maior latencia inicial. Os valores posíbeis son 0 (sen pipeline: circuito totalmente combinacional), 1 (número intermedio de rexistros de pipeline) e 2 (impleméntanse tódolos rexistros de pipeline posíbeis).
• VALOR_MAXIMO indica o valor ó cal se produce a saturación.

No hay comentarios:

Publicar un comentario