¿Problema de sincronización / almacenamiento en búfer con el EPP de Digilent en Basys2?

0

Tengo un FPGA Basys2 de Digilent y estoy implementando la interfaz EPP descrita en enlace . Esto permite que un programa llamado Adepto envíe y reciba bytes desde un diseño FPGA a través del cable USB.

Después de seguir esas instrucciones tuve algo que parecía funcionar. Podría enviar bytes desde Adepto y se mostrarían correctamente en la pantalla de siete segmentos. Desafortunadamente, cuando envié un archivo de 100 bytes para ser almacenado en la matriz de registro, solo llegaron 83 bytes. (Es un poco difícil de depurar en esta situación, porque solo hay muchos resultados simples en el FPGA, y el uso de Adept para leer los bytes del FPGA abre la posibilidad de que sea la implementación de lectura la que tenga errores. Terminé agregando el capacidad de recorrer la matriz mostrando cada byte a su vez.)

Reescribí mi implementación varias veces y miré los ejemplos de otras personas (la mayoría estaban en VHDL) pero aún no es confiable. Algunas escrituras, incluso los bytes individuales uno a la vez, simplemente no son recogidos por el diseño, aunque Adept no informa de ningún error.

Actualización: se probó el diseño de muestra VHDL

Ahora he logrado ejecutar el código y el diseño aquí: enlace

Funciona, pero un simple contador que agregué muestra un poco más se realizan escrituras de lo esperado, en algunas pruebas repetidas que ejecuté (recargo el diseño, luego envío un archivo con el Adepto):

Expected    Got
  50        51 to 55
 100        105 to 108
 200        206 to 215

Para el programa C ++ compilado de ese tutorial, se enviaron 1440000 = 0 (mod 256) bytes, pero el número escrito era 32 (mod 256) (¡Sólo tengo 8 LED!). En otro, los números fueron 1430000 = 240 (mod 256) vs 253 (mod 256).

Así que sigo pensando que hay una cuestión de tiempo. ¿Puede alguien con un Basys 2 intentar el mismo experimento? Mi VHDL ligeramente alterada se encuentra en enlace

Pequeño testcase antes de que aprendiera VHDL

Terminé con un pequeño caso de prueba para la señal WRITE de EPP:

input wire usb_write;  // in constraints file: NET "usb_write" LOC = "C2";
reg prev_write = 1;    // assume initially high
reg [9:0] write_count = 0;

always @(posedge mclk) begin
    if (usb_write != prev_write) begin
        write_count <= write_count + 1;
    end
    prev_write <= usb_write;
end

// display write_count on SSD
// display prev_write on LED 0

Generalmente, cuando envío un byte con un adepto, write_count se incrementa en 2, como se esperaba. (ESCRIBE baja para escribir un byte de dirección y un byte de datos, luego vuelve a alto). El LED permanece encendido entre las operaciones, lo que indica que prev_write es alto.

Pero a veces, el recuento solo se incrementa en 1, mientras que el led aún vuelve a ser alto. Es como si diferentes partes de mi bloque always @(posedge mclk) estuvieran usando diferentes valores de usb_write .

¿Hay algún tipo de búfer que debo hacer en estos cables de entrada / salida? No he encontrado ningún ejemplo para esto.

Más tarde, hoy, actualizaré la pregunta con algunos de los códigos EPP reales con los que estoy trabajando. También quiero probar uno de los ejemplos de VHDL, aunque soy nuevo en VHDL.

    
pregunta Edmund

1 respuesta

0

Siguiendo esta página enlace

Agregué buffering a las señales de control enviadas por el host. No estaban en mi pregunta original, ya que estaba teniendo resultados extraños incluso con solo usb_write .

always @(posedge clk) begin
    astb_buf <= usb_astb;
    dstb_buf <= usb_dstb;
end

El almacenamiento en búfer solo de estos dos ha solucionado los problemas de datos. Las otras señales son usb_write y usb_data[7:0] , pero no parece que necesiten un búfer en este punto.

He podido enviar 100 y recibir 100 bytes sin adiciones, pérdidas o mutaciones, en lo que estoy aliviado, ya que ahora no necesito implementar un protocolo de corrección de errores.

    
respondido por el Edmund

Lea otras preguntas en las etiquetas