2010-07-05 34 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