¿Cómo funciona este acumulador directo de síntesis digital?

2

Entonces, tomé un código en línea y lo transformé para que funcionara con mi tablero DE2-115, y ahora necesito ayuda para entender exactamente cómo funciona.

DDS_accum <= DDS_accum + 32'h16FC7BBC + 
    ((256+((message[15]==0)? message[15:7]+256 : message[15:7]-256))<<15) ; // "audio input"

Necesito ayuda para entender exactamente por qué existe la línea Verilog HDL anterior. El bloque grande de código que se muestra a continuación muestra cómo se implementa.

Este es el bloque principal de mi Proyecto de Diseño para Personas Mayores, pero mi especialización en la universidad me enseña sobre software y hardware, no tanto por Modulación de Frecuencia. Entonces, mucho de esto está pasando por encima de mi cabeza.

He leído esto y algunas páginas de Wikipedia y algunos videos de YouTube, pero no entiendo el punto de la constante y jugar con la señal de mensaje en la línea de arriba.

//make a direct digital synthesis accumulator 
// and output a 10-bit sine wave to the VGA plug
// set carrier frequency to 1 MHz DDS_incr = 32'h51EB84C = 85,899,340
// 11 MHz 32'h3851DCA8 = 944889000
// 9 MHz 2DF8F778 (771291000) : 4.5 16FC7BBC (385,645,500)
// 7 Mhz 274AF224 (659223076)
// set modulation to 400 Hz 85E7

// This outputs at 146.0 MHz.

always @ (posedge CLOCK_50) begin
    //generate 4.5 Mhz square wave carrier with FM modulation
// 32'h16FC7BBC = 385645500
    DDS_accum <= DDS_accum + 32'h16FC7BBC + 
    ((256+((message[15]==0)? message[15:7]+256 : message[15:7]-256))<<15) ; // "audio input"
    end

    //hook up the ROM table for carrier
    sqwave sqTable(CLOCK_50, DDS_accum[31:24], sq_out);

    //use the VGA DAC for an FM modulated RF signal 
    assign VGA_R = sq_out;
    assign VGA_SYNC = 1 ;
    assign VGA_BLANK = 1 ;
endmodule

//////////////////////////////////////////////////
// Square wave table for the DDS
module sqwave (clock, address, sq);
    input clock;
    input [7:0] address;
    output [7:0] sq; // changed to 7:0
    reg [7:0] sq;    // changed to 7:0
    always @ (posedge clock)
    begin
        sq <= (address<128)? 8'h7f : 8'h01 ; // changed
    end
endmodule
///////////////////////////////////////////////////

Pido disculpas por el gran bloque de código, pero ese es el corazón de este transmisor de FM. Este código modula una señal de audio de entrada de 24 bits desde el puerto de entrada de línea y sale del puerto VGA_R como una señal de FM a aproximadamente 146.0 MHz.

    
pregunta Everlight

1 respuesta

4

La modulación de frecuencia básicamente significa que la frecuencia de la portadora se cambia según la magnitud del mensaje (la señal de audio). Si la magnitud es positiva, la frecuencia aumenta. Si la magnitud es negativa, la frecuencia disminuye. Por lo tanto, 'modulación de frecuencia' porque la frecuencia se está cambiando en lugar de la amplitud (AM) o la fase (PM).

En este caso, se está utilizando un DDS para generar la onda portadora. La síntesis digital directa básicamente implica generar muestras de una forma de onda desde una tabla de búsqueda a una velocidad específica. La tasa está determinada por un contador, llamado acumulador de fase. En cada ciclo de reloj, el contador se incrementa un poco, la "fase" acumulada por la onda portadora durante el período de reloj. En general, los contadores DDS tienen una cantidad de bits fraccionarios, de modo que el contador puede acumular un paso de fase más preciso en cada período de reloj. Parece que este no tiene ningún bit fraccionario, probablemente debido a la modulación y la frecuencia de salida relativamente alta. Después de eso, la salida del contador se alimenta a la tabla de búsqueda, seleccionando una muestra. Un paso de fase constante producirá una frecuencia constante. Sin embargo, el ajuste del paso de fase agregando los datos del mensaje variará la frecuencia en el paso del mensaje, formando una señal modulada de FM.

Parece que esta línea está agregando los datos del mensaje de audio al paso de fase, pero con un poco de trabajo adicional para volver a escalarlos correctamente y lidiar con el bit de signo.

Editar: No importa, tiene 24 bits fraccionarios. Los 24 bits más bajos del acumulador no se utilizan en la búsqueda de tabla.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas