我正在尝试在 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 和一般硬件设计非常陌生,所以如果我说一些愚蠢的话,我很抱歉。想法?