Red de conocimiento informático - Aprendizaje de código fuente - Programación CNC VHDL

Programación CNC VHDL

DDS o DDFS es la abreviatura de síntesis directa de frecuencia digital. El principio de funcionamiento de DDS es generar una onda sinusoidal con frecuencia y fase controlables a través de un oscilador controlado numéricamente. El circuito generalmente incluye un reloj de referencia, un acumulador de frecuencia, un acumulador de fase, un circuito de conversión de amplitud/fase, un convertidor D/A y un filtro de paso bajo (LPF). El acumulador de frecuencia acumula la señal de entrada para generar datos de control de frecuencia K (datos de frecuencia o paso de fase). El acumulador de fase consta de un sumador completo de N bits y un registro de acumulación de N bits. Es un circuito de retroalimentación típico que acumula códigos binarios que representan la frecuencia y produce un resultado acumulado. El circuito de conversión de amplitud/fase es esencialmente un registro de forma de onda utilizado para tablas de búsqueda. Los datos leídos se envían al convertidor D/A y al filtro de paso bajo.

El flujo de trabajo específico es el siguiente:

Siempre que llega el pulso de reloj fc, el sumador de N bits agrega la palabra de control de frecuencia k a los datos de fase acumulados emitidos por el registro de acumulación. y agrega el El resultado de la suma se envía a la entrada de datos del registro de acumulación. El acumulador de fase se compone de un sumador de N bits y un registro de acumulación de N bits. El registro de acumulación retroalimenta los nuevos datos de fase generados por el sumador después del último pulso de reloj al extremo de entrada del sumador, para que el sumador pueda. continúa trabajando con el siguiente pulso de reloj. Se agrega la palabra de control de frecuencia K. De esta manera, el acumulador de fase acumula continuamente la fase lineal de la palabra de control de frecuencia K bajo la acción del reloj. Se puede ver que el acumulador de fase acumula la palabra de control de frecuencia k cada vez que se ingresa un pulso de reloj. Los datos emitidos por el acumulador de fase son la fase de la señal sintetizada. La frecuencia de desbordamiento del acumulador de fase es la frecuencia de señal emitida por. el DDS. Los datos emitidos por el acumulador de fase se utilizan como dirección de muestreo de fase de la memoria ROM de forma de onda. El valor de muestreo de forma de onda (código binario) almacenado en la memoria de forma de onda se puede encontrar a través de la tabla de búsqueda para completar la conversión de fase a amplitud. La salida de la memoria de forma de onda se envía al convertidor D/A. El convertidor D/A convierte la amplitud de la forma de onda digital en una señal analógica de la frecuencia sintética requerida. Después de que el filtro de paso bajo filtra el desorden y los armónicos, se envía la salida. La frecuencia es de onda sinusoidal. La relación entre la frecuencia de salida fo y la frecuencia de reloj fc satisface la siguiente fórmula: fo = k× fc/2 n.

Entre ellos, fo es la frecuencia de salida, fc es el pulso del reloj y k es la palabra de control de frecuencia. n es el número de bits (longitud de palabra) del acumulador.

El lenguaje VHDL simula y describe la salida del programa de onda sinusoidal por DDS en el software MAX PLUSⅱ. ...

En este diseño, el ancho de datos n del acumulador de fase es de 32 bits.

Diseño de biblioteca IEEE-DDS de primer nivel

Usando IEEE. STD_LOGIC_1164. Todos;

Utiliza IEEE.

STD_LOGIC_UNSIGNED ALL;

ENTIDAD DDS_VHDL ES

PUERTO (CLK: EN STD_LOGIC;

FWORD: EN STD_LOGIC_VECTOR(7 hasta 0); -Palabra de control de frecuencia

PWORD: IN STD _ LOGIC _ VECTOR(7 hasta 0); -Palabra de control de fase

FOUT: OUT STD _ LOGIC _ VECTOR(9 hasta 0) ));

END DDS_VHDL

Una de las estructuras de DDS_VHDL es

Registro de componentes 32B

Puerto (LOAD: IN STD _ LOGIC;

DIN: EN STD_LOGIC_VECTOR(31 hasta 0)

DOUT: OUT STD_LOGIC_VECTOR(31 hasta 0));

Componente final;

Componente REG10B

Puerto (CARGA: EN STD _ LOGIC;

DIN: EN STD _ LOGIC _ VECTOR( 9 hasta 0);

DOUT: OUT STD _ LOGIC _ VECTOR(9 hasta 0));

Componente final;

Componente sumador 32B

PUERTO(A: EN STD_LOGIC_VECTOR(31 hasta 0);

b: EN STD_LOGIC_VECTOR(31 hasta 0);

s :OUT STD _ LOGIC _ VECTOR(31 hasta 0);

Componente final;

Dirección del componente 10B

PORT(A:IN STD _ LOGIC _ VECTOR(9 hasta 0);

b: En STD_LOGIC_VECTOR (9 hasta 0));

s: OUT STD_LOGIC_VECTOR (9 hasta 0));

Fin del componente; p>

Componente SIN_ROM

Puerto (dirección: en STD_LOGIC_VECTOR (9 DOWNTO 0));

inclock: en STD_LOGIC

q: OUT STD; _ LOGIC _ VECTOR (9 hasta 0));

Componente final;

Señal F32B, D32B, din 32b: STD_LOGIC_VECTOR (31 hasta 0); /p>

Señal P10B, LIN10B, sin 10B: STD _ LOGIC _ VECTOR (9 hasta 0);

Inicio

F32B(27 hasta 20) lt; = FWORDF32B (31 hasta 28) lt;="0000";

P10B(1 hasta 0) lt;="00";

F32B(19 hasta 0) lt;="00000000000000000000" P10B(9 hasta 2) lt;=PWORD

u1: Asignación de puertos ADDER32B (A = gtF32B, B = gtD32B, S = gtdin 3

2b);

u2: mapeo de puerto REG32B (DOUT = gtD32B, DIN = gtDIN32B, LOAD= >CLK);

u3: mapeo de puerto SIN_ROM (dirección = gtSIN10B, q= > FOUT, inclock = gtCLK);

u4: mapeo de puertos ADDER10B (A = gtP10B, B = >D32B (31 hasta 22), S = gtLin 10B

u5 : Mapeo de puerto REG10B (DOUT = gtSIN10B, DIN = >LIN10B, LOAD = gtCLK);

Final uno

Descripción VHDL del acumulador

Acumulador Consta de; un sumador de N bits y un registro de acumulación de N bits, donde N es 32 bits.

Módulo sumador de biblioteca IEEE de 32 bits

Utiliza IEEE. STD_LOGIC_1164. Todos;

Utiliza IEEE. STD_LOGIC_UNSIGNED ALL;

La entidad ADDER32B es

PORT (A, B: IN STD _ LOGIC _ VECTOR (31 hasta 0);

s: OUT STD _ LOGIC _ VECTOR(31 hasta 0);

END ADDER32B

El comportamiento arquitectónico de ADDER32B es

START

S lt = A B;

Comportamiento final;

Módulo de registro de biblioteca IEEE de 32 bits

Utiliza IEEE STD_LOGIC_1164;

Entidad REG32B.

Puerto (Carga: IN STD_LOGIC;

DIN: IN STD_LOGIC_VECTOR (31 hasta 0);

DOUT: OUT STD_ LOGIC _ VECTOR(31 hasta 0));

Fin de REG32B

El comportamiento arquitectónico de REG32B es

Iniciar

Proceso ( Load, DIN)

Iniciar

IF (Load'EVENT AND Load='1') luego

DOUT lt= DIN

End IF;

Finalizar proceso;

Finalizar comportamiento;

El ancho de datos del sumador de cambio de fase es de 10 bits, es decir, la precisión del la salida D/A es de 10 bits

Módulo sumador de biblioteca IEEE de 10 bits

Usa IEEE STD_LOGIC_UNSIGNED

La dirección de entidad 10B es

PUERTO. (A, B: IN STD_LOGIC_VECTOR (9 hasta 0);

s: OUT STD_LOGIC_VECTOR (9 hasta 0));

END sumador 10B;

El comportamiento arquitectónico de la dirección 10B es

Inicio

S lt= A B

Comportamiento final;

Módulo de registro de biblioteca IEEE de 10 bits

Utiliza IEEE STD_LOGIC_1164.

Todo;

La entidad REG10B es

Puerto(Carga: EN STD_LOGIC;

DIN: EN STD_LOGIC_VECTOR(9 hasta 0);

DOUT: OUT STD _ LOGIC _ VECTOR(9 hasta 0));

END reg 10B

El comportamiento arquitectónico de REG10B es

Inicio

Proceso (Carga, DIN)

Iniciar

SI (Cargar'EVENT AND Load='1') luego

DOUT lt= DIN

Finalizar IF;

Finalizar proceso;

Finalizar comportamiento;

Archivo de datos de inicialización LPM_ROM personalizado

Rom_data.mif El archivo de datos de onda sinusoidal de 10 bits se puede generar utilizando MATLAB/DSP Builder.

Ancho = 10;

Profundidad = 1024;

DIRECCIÓN _ RADIX = DEC

DATOS _ RADIX = DEC

El contenido comienza

0:512;1:515;2:518;3:521;4:524;5:527;6:530;7:533;

8: 537; 9: 540; 10: 543; 11: 546; 13: 552; ... (algunos datos omitidos) 496;1020:499;1021:502;1022:505;1023:508;

End;

ROM de datos de forma de onda para creación de instancias

Archivo ROM de datos de forma de onda para creación de instancias

Biblioteca ROM de datos IEEE

Utiliza IEEE. STD_LOGIC_1164. Todos;

La entidad sin_rom es

puerto (dirección: en STD_LOGIC_VECTOR(9 DOWNTO 0));

inclock: en STD_LOGIC;

q: OUT STD_LOGIC_VECTOR (9 hasta 0));

END sin_rom

La arquitectura SYN de sin_rom es

SEÑAL sub_wire 0: STD_LOGIC_VECTOR(9 hasta 0);

Componente LPM_ROM: llama al módulo LPM ROM.

GENERIC(LPM_width:NATURAL;

lpm_widthad:NATURAL;

LPM_address_control: STRING;

LPM_out data: STRING;

LPM _ file: STRING);

Puerto (dirección: en STD_LOGIC_VECTOR (9 DOWNTO 0));

inclock: en STD_LOGIC; >q: OUT STD _ LOGIC _ VECTOR (9 hasta 0));

Fin del componente

Inicio

q lt=sub_wire0(9 hasta; 0);

lpm_rom_component: mapeo universal lpm_rom (

ancho LPM = gt10,

ancho LPM = gt10,

CONTROL DE DIRECCIÓN LPM =>"Registrado",

LPM_OUTDATA=>"UNREGISTERED",

LPM FILE=>"ROM_DATA" .MIF")-Archivo de datos ROM y su ruta.

portmap(address = gt dirección, inclock = gtinclock, q = gtsub_wire 0);

END SYN

Esto va demasiado lejos. Hay muchos libros sobre los principios básicos de DDS y también están disponibles en línea. Generalmente, el código VHDL de DDS se incluye en los libros técnicos de EDA.