Implementaciones de FPGA bidireccional (ADC paralelo)

1

Nuevo convertidor de FPGA aquí. Estoy tratando de interactuar con un ADC paralelo como parte de un proyecto de adquisición de datos. Los pines en el ADC se utilizan tanto para la entrada como para la salida (no simultáneamente). Por lo tanto, necesito conducir los pines cuando quiero escribir datos de control en el ADC y leer los valores de datos del ADC cuando se hace con la conversión. ¿Cuáles son las diferentes maneras de hacer eso? (Tengo un FSM que dirige las señales de escritura y lectura, así que sé que no son simultáneas).

Actualmente, voy con el primer enfoque (a partir de comentarios) de dividir las señales en versiones de entrada y salida en el nivel superior, pero no estoy contento con eso. Aquí hay un extracto de mi código y la imagen del pin IO de la familia FPGA en modo bidireccional:

inout [11:0] adc_data_pin_top

assign adc_data_pin_top = ~write_adc_data_n ? written_data_temp : 12'bz;
assign data_from_adc = converted_datas;

always @ (posedge adc_clock) begin 
  converted_datas <= adc_data_pin_top; 
  written_data_temp <= written_data_adc; 
end

Mi problema es que no puedo leer los datos del ADC. Mis líneas adc_data_pin_top 'retienen' los valores del ciclo de escritura anterior y me lo devuelven durante mi ciclo de lectura. Intenté usar dos búferes de tres estados como se muestra a continuación para asegurarme de que los valores de escritura no "pierden" en los puertos de entrada durante un ciclo de lectura, pero eso no ayudó mucho. No estoy seguro de si el búfer de tres estados tiene que ser cronometrado o no (es decir, si necesito usar un registro o solo cables). Además, ¿qué valor exacto se sintetiza una señal de estado triple (Alta Z) como en el hardware? 0V? 1.4V? 2V? 3.3V? En otras palabras, ¿qué debo esperar leer cuando no estoy en el ciclo de lectura o escritura? Puede ver un diagrama del diagrama IO de altera del pin en la página 2 del documento que se encuentra debajo del código:

assign adc_data_pin_top = (write_adc_data_n) ? 12'bZ : written_data_temp;
assign  converted_datas = (read_adc_data_n) ? 12'bZ : adc_data_pin_top;

enlace

Alerta de novato! Lo siento por toda la triple publicación.

Edit: Chris, gracias por tu ayuda! La página no me deja comentar tu comentario, lol. Así que, solo voy a comentar aquí. Las señales de lectura y escritura son de baja habilitación y deben llamarse de esa manera. Lo arreglaré ahora mismo. Añadir ese inversor a la condición probablemente sea redundante, así como leer en algún lugar que las antiguas herramientas de Altera tenían preferencia. Veo lo que está diciendo acerca de la segunda declaración: cualquier asignación alta de Z infiere un búfer de triple estado y tendría que pasar ese búfer de tres estados (convert_datas) a mi módulo interno que anula el propósito de una división.

Otras ediciones: En realidad, pensándolo bien, ¡esa es una GRAN idea! Tengo interruptores de pulsador en el kit de desarrollo que puedo usar para modelar un interruptor externo. De esa manera puedo verificar mi estructura HDL al menos. Pero no puedo leer mis señales de salida a menos que finalmente haya descubierto el conector HSMC

Edit3: Hola Chris, finalmente pude ejecutar ese experimento hoy. Puedo conducir el LED cuando el bus bidireccional no está en estado triple. Pero como no puedo ingresar una entrada en el FPGA (y un pin bidireccional) para simular una entrada de ADC de un bit, no puedo verificar que el puerto bidireccional esté en modo de lectura / estado. ¿Alguna idea sobre cómo obtener una entrada en una placa FPGA sin GPIO (excepto un conector HSMC)? Gracias!

Actualización: Yhello! Finalmente, descubrí una forma de enviar una señal al FPGA a través del conector HSMC y pude ejecutar una versión modificada del experimento de Chris. ¡Fue increíble! Ahora que sé que mi construcción bidireccional HDL funciona, es una variable menos de la que preocuparme. Me imagino que los datos que se me "escupieron" son solo la función de retención de bus de la placa FPGA que funciona a alta frecuencia para evitar la metastabilidad. Eso redujo el posible problema para controlar la temporización de la señal ya que no estaba viendo datos. Aflojar los plazos de los controles solucionó el problema. ¡Estoy extasiado de informar que mi ADC está en funcionamiento! Gracias, Chris!

    
pregunta oluishere

0 respuestas

Lea otras preguntas en las etiquetas