Сложная последовательная логика с плавающей запятой в Verilog

Я пытаюсь написать синтезируемый трехмерный растеризатор в Verilog / SystemVerilog. В настоящий момент растеризатор на самом деле не является трехмерным растеризатором: он просто получает шесть 32-битных чисел с плавающей запятой для положения вершины (vertA_pos_x, vertA_pos_y, vertB_pos_x, vertB_pos_y, vertC_pos_x, vertC_pos_y) и девять 8-битных целых чисел для раскраски вершин (vertA_gol_Color_Color_r , vertB_color_r, vertB_color_g, vertB_color_b, vertC_color_r, vertC_color_g, vertC_color_b).

Диапазон позиций составляет 0,0f ~ 1,0f, 0,0f представляет верхнюю / левую часть экрана, 0,5f - середину и 1,0f - нижнюю / правую сторону.

Работа с растром состоит в том, чтобы, во-первых, подсчитать, сколько требуется линий растра. Учитывая, что высота фреймбуфера составляет 240 пикселей, вершина A - верхняя вершина, B - левая нижняя, C - правая нижняя, а X - самая нижняя вершина (либо B, либо C; это необходимо вычислить), количество строк растра равно (vertX_pos_y - vertA_pos_y) / 240.

Эта часть процесса растеризации достаточно сложна, чтобы развеять мои сомнения, поэтому я перестану объяснять, как я буду действовать здесь.

Теперь я хочу знать, как реализовать такую ​​«сложную» логику в Verilog (она «сложна», потому что она последовательна и занимает более одного тактового цикла, что не совсем приятно для проектирования с помощью оборудования. язык описания).

Я использую Quartus от Altera, поэтому меня в основном интересуют решения Altera.

Мегафункции операций с плавающей запятой, которые поставляются с Quartus, требуют для завершения более одного тактового цикла, поэтому для реализации «простых» вычислений, таких как (vertX_pos_y - vertA_pos_y) / 240, я предполагаю, что необходим довольно скучный для записи и подверженный ошибкам конечный автомат. . Мое самое большое ожидание состоит в том, что кто-то скажет мне, что мне это не нужно, но если это не так, я все равно хотел бы знать, как люди обычно проектируют такие вещи.

Также обратите внимание, что я новичок в Verilog и дизайне оборудования в целом, поэтому извините, если скажу что-то глупое. Идеи?


person Gui Prá    schedule 05.07.2010    source источник


Ответы (1)


Вы слышали о конвейерной обработке? Именно так часто строятся информационные пути.

В качестве примера предположим, что вы хотите выполнить (a*b) + c, где x*y занимает 3 тактовых цикла, а x+y - 1 тактовый цикл. Конвейерная обработка просто означает вставку банков регистров для выравнивания задержек. В этом примере ввод c задерживается, чтобы соответствовать задержке умножения. Таким образом, в целом операция будет иметь задержку 3 + 1 = 4 тактовых цикла.

Теперь, если вам нужно выполнить много вычислений, задержки конвейера могут быть объединены вместе, так что вам не нужна логика конечного автомата для планирования ваших математических операций. Это будет означать, что вам придется подождать несколько циклов, чтобы получить ответ (т.е. задержка), что действительно неизбежно в синхронных проектах.

person Marty    schedule 06.07.2010
comment
Я действительно недавно (вчера?) Слышал о конвейере. Мне очень интересно, что вы имели в виду, говоря о задержках конвейера вместе, чтобы избежать логики конечного автомата. Мне действительно не нравится иметь дело с конечными автоматами только для этого. - person Gui Prá; 07.07.2010
comment
Под лего я подразумеваю, что мне нравится думать о каждом типе математической операции в конвейере как о кирпичике разного цвета (например, красный = много, белый = задержка, синий = добавить), и что каждый удар на блоке лего как тактовый цикл задержки. Затем, когда я строю канал данных из блоков, я думаю о пробелах и решаю, могу ли я соединить канал данных другим способом, чтобы выполнять больше частей вычислений параллельно, а не помещать в регистры задержки. - person Marty; 07.07.2010
comment
Я могу понять ваш образ мыслей, и я подумал об аналогичной аналогии, когда услышал о конвейерной обработке. Но я никогда не видел такого примера в действии. Не могли бы вы связать меня с одним из них или отредактировать свой ответ на свой ответ? Буду очень признателен, и ваш ответ будет более полным. - person Gui Prá; 07.07.2010