2010-07-05 35 views
3

我正试图在Verilog/SystemVerilog中编写一个可合成的3D光栅化器。现在光栅化器不是真正的3D光栅化器:它只接收顶点位置(vertA_pos_x,vertA_pos_y,vertB_pos_x,vertB_pos_y,vertC_pos_x,vertC_pos_y)的六个32位浮点数和用于顶点着色的九个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)。Verilog中的复杂浮点时序逻辑

位置的范围是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

您是否听说过流水线?这就是数据路径经常被构建的方式。

举个例子,假设你想做(a*b) + c,其中x*y需要3个时钟周期,而x+y需要1个时钟周期。流水线简单的说就是插入一些寄存器来排列延迟。在该示例中,输入c被延迟以匹配乘法的延迟。总的来说,这个操作将会有3 + 1 = 4个时钟周期的延迟。

现在,如果您需要进行大量计算,则可以将流水线延迟“一起使用”,以便您不需要状态机逻辑来安排数学运算。这意味着你必须等待几个周期才能得到答案(即延迟) - 这在同步设计中是不可避免的。

+0

我刚刚(昨天?)听说流水线的确如此。我对“抛弃”流水线延迟的含义非常感兴趣,以避免状态机逻辑。我真的不喜欢为此而处理状态机。 – 2010-07-07 06:06:50

+0

通过放弃,我的意思是我喜欢把管道中的每种数学运算看作砖的不同颜色(例如,red = mult,white = delay,blue = add),并且lego上的每个碰撞阻塞作为延迟的时钟周期。然后,当我从块中构建数据路径时,我考虑了差距,并考虑是否可以以不同方式将数据路径捕捉到一起,以并行执行更多部分计算,而不是放入延迟寄存器。 – Marty 2010-07-07 15:05:10

+0

我可以理解你的思维方式,当我听说流水线时,我想过类似的比喻。但我从来没有见过这样的例子。你能联系我一些或编辑你自己的答案吗?我会非常感激,你的答案会更完整。 – 2010-07-07 16:27:49