¿Hay alguna ventaja en mi optimización de circuito secuencial?

0

Estoy tratando de crear un juego de serpientes en un Xilinx Artix7 FPGA, y una de las cosas que quiero comprobar es si la serpiente ha chocado consigo misma. Necesito realizar esta comprobación entre las actualizaciones del juego para saber en la próxima actualización si el juego ha finalizado.

La serpiente en mi juego está formada por segmentos discretos, así que para verificar si la serpiente ha chocado consigo misma, solo verifico si el primer segmento (la cabeza) se superpone con el segundo, el tercero, el cuarto, etc. . Mi plan es hacer esto secuencialmente con un reloj mucho más rápido que el reloj del juego.

La cosa es que creo que solo puedo comprobar si la cabeza colisiona con cada segmento otro . Sin embargo, ¿hay realmente alguna ventaja ganada por esta "optimización"?

El juego, si se ejecuta a unos 50 FPS, tendría un período de actualización de 20 ms. El reloj que soporta la placa Basys3 es 100 Mhz, que es un período de 10 ns . Esto significa que en el intervalo entre las actualizaciones para el juego, puedo pasar por 2 segmentos millones , que es mucho más de lo que la serpiente podría tener. Dado que el juego realmente no necesita ser más rápido que 50 FPS, encontrar la respuesta dos veces más rápido no hace nada porque lo único que haría es simplemente sentarme y esperar la próxima actualización.

Otra cosa en la que pensé era que tal vez podría configurar el comando create_clock en mi archivo XDC (restricciones) para que sea más lento, pero ¿hay alguna ventaja al hacerlo? ¿Consume menos energía o algo así?

Lo último en lo que podría pensar es si utilizara una versión combinatoria de la verificación de colisiones como tal

(head == seg1) || (head == seg 2) || (head == seg3) || ... || (head == segN)

Con mi optimización, solo tomaría la mitad de hardware, pero aún más que la versión secuencial. Ya que es combinatoria, la respuesta estaría disponible casi instantáneamente, pero nuevamente, ya que tengo tiempo para matar, tampoco veo una ventaja allí.

¿Es esta una optimización inútil?

    
pregunta rcplusplus

1 respuesta

0

¿Cómo se supone que este chip hace que la serpiente sea visible? El enfoque normal sería representar la serpiente en una pantalla de mapa de bits y también mantener una lista de posiciones o direcciones, y calcular que la serpiente colisiona consigo misma si el mapa de bits está colocado en el lugar que la cabeza está a punto de alcanzar. Esto evitaría cualquier requisito de iterar a través de los segmentos de serpiente en cada fotograma si el chip realiza un seguimiento de las posiciones de cabeza y cola.

Si su objetivo es un juego que genere una cuadrícula de 80x50 en el video, debe minimizar el número de registros y la lógica de cantidad utilizada por el juego (por ejemplo, no usar 4000 bits de RAM para la pantalla), y si el máximo la longitud de la serpiente es por ejemplo 512 segmentos, puede usar un registro de desplazamiento de 512x2 para realizar un seguimiento de los segmentos de la serpiente, un registro de cambio "universal" de 80 bits (que en cada ciclo se puede borrar, girar a la izquierda, girar a la derecha o quedarse) para representar el la siguiente línea de pantalla y un registro de desplazamiento de 80 bits para almacenar en búfer los datos que salen a la pantalla. Tan poco menos de 1200 bits de almacenamiento total.

Una disposición como la que describo debería ser viable para video NTSC con un reloj de aproximadamente 2MHz. Una colisión que se produce entre la cabeza de una serpiente y otro segmento se detectaría en la línea de exploración que contiene la cabeza de la serpiente cuando el hardware intenta establecer el bit de búfer de línea para el segmento apropiado. Si uno usa un reloj que es mucho más rápido que 2MHz, podría eliminar la necesidad de parte del almacenamiento adicional, pero dado que la mayor parte del almacenamiento serían los dos bits por segmento de la serpiente, no creo que haya mucho espacio para ahorrar.

Por cierto, si uno quiere que las cosas se vean un poco más bonitas, podría usar los registros de desplazamiento de 80x5 para los búferes de línea y realizar un seguimiento de cada celda de la dirección a través de la cual se ingresó y salió. Agregue un poco de ROM y un registro de salida y uno podría animar el cuerpo de la serpiente para que parezca que se mueve sin problemas.

    
respondido por el supercat

Lea otras preguntas en las etiquetas