Floating point Verilog中的复杂浮点顺序逻辑

Floating point Verilog中的复杂浮点顺序逻辑,floating-point,verilog,intel-fpga,Floating Point,Verilog,Intel Fpga,我正在尝试用Verilog/SystemVerilog编写一个可合成的三维光栅器。现在的光栅化器并不是真正的3D光栅化器:它只接收六个32位浮点值作为顶点位置(vertA_pos_x,vertA_pos_y,vertB_pos_x,vertB_pos_y,vertC_pos_x,vertC_pos_y)和九个用于顶点着色的8位整数(顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜

我正在尝试用Verilog/SystemVerilog编写一个可合成的三维光栅器。现在的光栅化器并不是真正的3D光栅化器:它只接收六个32位浮点值作为顶点位置(vertA_pos_x,vertA_pos_y,vertB_pos_x,vertB_pos_y,vertC_pos_x,vertC_pos_y)和九个用于顶点着色的8位整数(顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色、顶点颜色)

位置范围为0.0f~1.0f,0.0f表示屏幕的顶部/左侧,0.5f表示屏幕的中部,1.0f表示屏幕的底部/右侧

光栅工作将首先计算需要多少光栅线。假设帧缓冲区高度为240像素,顶点A为顶部顶点,B为左下角顶点,C为右下角顶点,X为最底部顶点(必须计算B或C),光栅线的数量由
(垂直方向-垂直方向)/240

光栅化过程的这一部分非常复杂,足以暴露我的疑虑,因此我将不再在这里解释我将如何继续

现在我想知道的是如何在Verilog中实现这种“复杂”逻辑(它是“复杂”的,因为它是顺序的,并且需要一个以上的时钟周期,这对于用硬件描述语言设计来说并不是最令人愉快的事情)

我正在使用Altera的Quartus,因此我主要对Altera解决方案感兴趣

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


还请注意,我对Verilog和硬件设计一般来说都是新手,所以如果我说了一些愚蠢的话,我很抱歉。想法?

你听说过流水线吗?数据路径通常就是这样构造的

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


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

我最近(昨天)才有确实听说过流水线。我对你所说的“legoing”流水线延迟是什么意思很感兴趣,以避免状态机逻辑。我真的不喜欢为了这个而必须处理状态机。legoing的意思是,我喜欢把流水线中的每种数学运算都看作是不同颜色的砖块(例如,红色=mult,白色=延迟,蓝色=添加)在乐高块中的每一个凸点都是一个延迟的时钟周期。然后,当我在块中建立数据路径时,我想到了这些间隙,并考虑我是否可以以不同的方式将数据路径以一种不同的方式组合在一起,而不是把它们放在延迟寄存器中。我可以理解你们的思维方式,而我是你们。当我听说管道的时候,我也有过类似的类比。但是我从来没有见过这样的例子。你能把我的一些联系起来,或者把你的答案和你自己的一个联系起来吗?我非常感激,你的答案会更完整。