Preguntas sobre la interfaz ADC: ADS5463 con FPGA

Soy diseñador principiante de FPGA.

Necesito conectar el componente ADC: ADS5463. hoja de datos: http://www.ti.com/lit/ds/symlink/ads5463.pdf con un FPGA (lattice ecp3).

Necesito sugerencias sobre cómo empezar a implementarlo. Según tengo entendido, todo lo que necesito hacer es State Machine basado en la tabla de tiempos y el gráfico proporcionado por la hoja de datos:ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

y para comprender las entradas y salidas de este ADC, especialmente las señales digitales: (clk, dry, d[11:0], ovr)

ingrese la descripción de la imagen aquíEscribí un cuerpo para el código verilog... pero aún pienso cómo escribir realmente la lógica:

    module top(
    input clk,                       //clock input = 250MHz
    input rst,
    output reg dry,              //DRY
    output reg ovr,              //OVR
    output reg [11:0] d_o;       //D[11:0]
    );

    reg [5:0] cs, ns;

    localparam  idle        = 6'b000001,
                start       = 6'b000010,
                busy        = 6'b000100,
                read_middle = 6'b001000,
                read_end    = 6'b010000,
                done        = 6'b100000;    

//clock input = 250MHz -> Ts=1/fs=4ns
    localparam  t_aperture = 200 ,   //200ps
                latency    = 8   ,   //3.5 input clock cycles -> 8 rising+falling edges of clock
                t_dry      = 1600,   //950-1600ps CLK to DRY delay
                t_data     = 2100,   //750-2100ps CLK to DATA/OVR delay
                t_skew     = 650 ;   //-350-650ps: t_data-t_dry: DATA to DRY skew.


        always @(posedge clk or posedge rst)
        if (rst) begin
            cs <= idle;
        end else begin
            cs <= ns;
        end

    always @(posedge clk or posedge rst)
        if (rst) begin
            ns = idle;
            dry = 1'b0;
            ovr   = 1'b0;
            d_o   = 12'b000000000000;


        end else begin
            case (curr_state)
                idle:

                start:

                busy:

                read_middle:

                read_end:

                done:

endmodule

Mis preguntas:

  1. ¿Cuál es mi trabajo en este tipo de diseño? Necesito escribir el mecanizado de estado onyl basado en la tabla de tiempos y conectar todas las entradas/salidas al FPGA y veré los resultados correctos.

  2. según la hoja de datos, ¿sobre qué señales debo tener control? por ejemplo, DRY es una señal que produce el ADC y debo usar en mi código o debo controlar sus niveles lógicos en mi código => tomar el CLK, dividirlo por 2 y retrasarlo hasta la mitad del reloj.

  3. ¿Alguna idea de cómo debo construir mi máquina de estado? parece que necesito 3-4 estados aquí: INACTIVO, OCUPADO, HECHO. ¿alguna idea de cómo puedo crear un retraso de 200ps con clk de 150-250MHz? Pensé en solo hacer 1 ciclo clk de retraso y funcionará bien ... tal vez un poco más lento de lo que recomienda la hoja de datos, pero es seguro y funciona.

  4. Estaría muy contento por cualquier buena explicación o pieza de código sobre cómo empezar a hacerlo.

¡¡Gracias!!

No salte al uso de una máquina de estados finitos (FSM), o cualquier otro circuito lógico para el caso. Use un FSM porque el circuito necesita estados. A algunos ingenieros les gustan los FSM porque pueden jugar con ellos, agregando estados y basura hasta que parece funcionar, pero es confuso y difícil de entender. Su ADC no tiene diferentes estados. Tiene una operación predecible y repetitiva, así que use un circuito contador predecible y repetitivo en su lugar. Será mucho más corto y fácil de diseñar, comprender y encontrar fallas. Simplicidad: la simplicidad lleva a la confiabilidad. Lea la hoja de datos nuevamente, vea los patrones en el bus ADC.

Respuestas (1)

Todo lo que necesita proporcionar desde el FPGA es la señal de reloj al ADC. Esté atento a que se afirme DRY, y cuando lo esté, puede cargar en paralelo los 12 bits de datos y la señal de desbordamiento. Lo que suceda después de eso depende de lo que pretenda hacer con los datos muestreados.

Entonces, mi máquina de estado solo debe esperar 3.5 ciclos de reloj y el borde ascendente de secado, luego de eso, ¿buscar salidas válidas de D [11: 0]?
si estuvieras diseñando este módulo adc... ¿cuáles serían las entradas/salidas en tu código? lo que empecé parece bien?
Creo que para cuando su máquina de estado esté lista para ejecutarse, el ADC ya habrá visto muchos más de 3,5 ciclos de reloj. Solo preocúpate por SECO.
No has iniciado nada . No necesita especificar todos esos retrasos de tiempo y latencia. Solo busque DRY en alto, luego almacene las 12 o 13 señales de entrada que le interesan. No tengo idea de qué quiere hacer si hay un desbordamiento, o qué sucede con los datos después de obtenerlos.
Bien gracias. ¿Cuántos estados harías por esta interfaz? Por lo que dices, parece que todo lo que necesito es solo 1 ... espera el borde ascendente DRY y eso es todo ... No estoy seguro de por qué necesito una máquina de estado para eso
Por ahora no sirve de nada. Solo quiero ver el ADC funcionando.