J'essaye d'écrire un rasterizer 3D synthétisable dans Verilog/SystemVerilog. Le rastériseur n'est pas vraiment un rastériseur 3D: il ne reçoit que six flottants de 32 bits pour la position des sommets (vertA_pos_x, vertA_pos_y, vertB_pos_x, vertB_pos_y, vertC_pos_x, vertC_pos_y) et neuf entiers de 8 bits pour la coloration des sommets (vertA_color_r, vertA_color_g, vertA_color_b , vertB_color_r, vertB_color_g, vertB_color_b, vertC_color_r, vertC_color_g, vertC_color_b).Logique séquentielle à virgule flottante complexe dans Verilog
Les plages de positions sont de 0,0f ~ 1,0f, 0,0f représentant le côté haut/gauche de l'écran, 0,5f le milieu de celui-ci et 1,0f le côté bas/droite.
Le travail raster consisterait, premièrement, à compter le nombre de lignes de trame requises. Étant donné que la hauteur du framebuffer est de 240 pixels, le sommet A est le sommet supérieur, B est le bas gauche, C est le bas-droit et X est le sommet le plus bas (soit B ou C, il faut le calculer), le nombre de lignes de trame est donné par (vertX_pos_y - vertA_pos_y)/240
.
Cette partie du processus de rastérisation est assez complexe pour exposer mes doutes, alors je vais arrêter d'expliquer comment je procéderais ici. Maintenant, ce que je veux savoir, c'est comment implémenter une telle logique "complexe" dans Verilog (c'est "complexe" car il est séquentiel et prend plus d'un cycle d'horloge, ce qui n'est pas exactement le genre de chose le plus agréable). conception avec un langage de description de matériel). J'utilise Quartus d'Altera et je m'intéresse donc principalement aux solutions Altera. Les mégafonctions d'opération à virgule flottante fournies avec Quartus nécessitent toutes plus d'un cycle d'horloge, donc, pour implémenter des calculs "simples" comme (vertX_pos_y - vertA_pos_y)/240
, je suppose que c'est assez ennuyeux à écrire et sujet aux erreurs. La machine d'état est nécessaire. Ma plus grande attente est que quelqu'un me dise que je n'en ai pas besoin, mais si ce n'est pas le cas, j'aimerais quand même savoir comment les gens conçoivent généralement des choses comme celles-là.
Notez également que je suis très nouveau dans la conception de matériel et de Verilog en général, donc je suis désolé si je dis quelque chose de stupide. Des idées?
Je viens tout juste (hier?) D'entendre parler de pipelining, en effet. Je m'intéresse beaucoup à ce que vous entendez par "retarder" les retards de pipeline ensemble pour éviter la logique de la machine d'état. Je n'aime vraiment pas avoir à gérer des machines d'état juste pour ça. –
Par legoing, je veux juste dire que j'aime penser à chaque type d'opération mathématique dans le pipeline comme une couleur différente de brique (par exemple, rouge = mult, blanc = retard, bleu = ajouter), et que chaque bosse sur le lego bloquer comme un cycle d'horloge de latence. Ensuite, lorsque je construis le datapath hors des blocs, je réfléchis aux lacunes et je me demande si je peux aligner le chemin de données d'une manière différente pour faire plus de parties du calcul en parallèle plutôt que de les placer dans les registres de retard. – Marty
Je peux comprendre votre façon de penser, et j'ai pensé à une analogie similaire quand j'ai entendu parler de pipelining. Mais je n'ai jamais vu un exemple de cela en action. Pourriez-vous me lier ou modifier votre réponse avec l'un de vous? Je serais très reconnaissant, et votre réponse serait plus complète. –