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.