3

我正在尝试在 Verilog/SystemVerilog 中编写一个可合成的 3D 光栅化器。现在的光栅化器并不是真正的 3D 光栅化器:它只接收 6 个 32 位浮点数用于顶点位置(vertA_pos_x、vertA_pos_y、vertB_pos_x、vertB_pos_y、vertC_pos_x、vertC_pos_y)和 9 个 8 位整数用于顶点着色(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)。

位置的范围是 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 中实现这种“复杂”的逻辑(它是“复杂的”,因为它是连续的并且需要多个时钟周期,这并不是用硬件设计的最令人愉快的事情描述语言)。

我正在使用 Altera 的 Quartus,所以我主要对 Altera 解决方案感兴趣。

Quartus 附带的浮点运算宏功能都需要一个以上的时钟周期才能完成,因此,为了实现类似的“简单”计算(vertX_pos_y - vertA_pos_y) / 240,我假设需要一个相当无聊且容易出错的状态机。我最大的期望是有人会告诉我我不需要那个,但如果不是这样,我仍然想知道人们通常如何设计这样的东西。

另请注意,我对 Verilog 和一般硬件设计非常陌生,所以如果我说一些愚蠢的话,我很抱歉。想法?

4

1 回答 1

4

你听说过流水线吗?这就是通常构建数据路径的方式。

举个例子,假设你想做(a*b) + cx*y需要 3 个时钟周期和x+y1 个时钟周期。流水线只是意味着插入寄存器组来排列延迟。在示例中,输入c被延迟以匹配乘法的延迟。因此,总体而言,该操作将有 3 + 1 = 4 个时钟周期的延迟。

现在,如果您需要进行大量计算,可以将管道延迟“乐高”在一起,这样您就不需要状态机逻辑来安排数学运算。这意味着您必须等待几个周期才能得到答案(即延迟)——这在同步设计中确实是不可避免的。

于 2010-07-06T09:43:24.683 回答