¿Cómo escribir una declaración for-generate para generar múltiples instancias de este circuito de red de clasificación paralela?

Estoy tratando de implementar una red de clasificación paralela. Tengo curiosidad por saber cómo se escribiría una declaración for-generate para generar 128 instancias de este circuito de clasificación.

Se supone que ordena 256 números de 8 bits de menor a mayor sin un reloj usando solo lógica combinacional.

Este es un enlace al documento en la red de clasificación que estoy tratando de usar:

https://www.researchgate.net/publication/261152327_Zero-delay_FPGA-based_odd-even_sorting_network?enrichId=rgreq-27e12d3d7cce338ad2cbbdffa750edb4-XXX&enrichSource=Y292ZXJQYWdlOzI2MTE1MjMyNztBUzoyMzg2MDc5Njk1NTAzNDNAMTQzMzg5OTk4MTg4Nw%3D%3D&el=1_x_3&_esc=publicationCoverPdf

Los enlaces al circuito y al diagrama de la red de clasificación se encuentran a continuación.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Necesita la entidad VHDL para ese clasificador (o un contenedor VHDL para él si aún no está en VHDL), y una idea clara de cómo describir las interconexiones en y entre clasificadores como una función de la "variable de bucle" de la declaración de generación. Entonces estás listo para seguir adelante.
Comience de a poco: ¿cómo lo haría con números de 4 bits y solo dos de ellos? Luego expanda a cuatro números. Toma lo que aprendes y muévete más grande.
Se han implementado 3 algoritmos de clasificación paralelos diferentes en PoC-Library : por ejemplo, Odd-Even Merge-Sort . El tamaño de la red de clasificación se puede configurar a través de genéricos.
Espero que sea un ejercicio académico. Tendrá dificultades para obtener eso en un FPGA. Acabo de hacer un breve análisis de papel. Necesita muchos buses anchos intermedios de 8 bits. Los índices se vuelven mucho más fáciles si cambia el nombre del bus de cable superior/inferior en cada etapa impar.
Sí, esto es principalmente para fines de aprendizaje solamente.

Respuestas (1)

Me gustan los desafíos y me tomó algunos intentos, pero lo hice funcionar para datos de W bits de ancho y entradas D. (D es una potencia de dos). Hice un poco de trampa porque soy bastante más competente con Verilog. Esta es la vista RTL que Xilinx me dio:

ingrese la descripción de la imagen aquí

No voy a regalar el código aunque solo sea para evitar que este sitio web se convierta en un 'Mira: ¡código gratis!' pero puedo dar algunos consejos:

Empecé con la definición de buses de 8 bits D*(D+1). Esto hace que pueda usar el mismo nombre de bus en todas partes en mi generación.

Conecte los primeros buses D a sus entradas, los últimos buses D a sus salidas.

En alguna etapa pasas dos autobuses, lo que hace que los índices de los autobuses sean muy desagradables. Una solución simple es que en la parte superior e inferior de cada estado impar cambie el nombre del bus. Para el bus superior esto es:
assign bus[stage*d+d] = bus[stage*d];
Ahora siempre tiene D buses por etapa y todos los bucles se vuelven regulares para bucles.