我正試圖在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和硬件設計非常陌生,所以如果我說些愚蠢的話,我很抱歉。想法?
我剛剛(昨天?)聽說流水線的確如此。我對「拋棄」流水線延遲的含義非常感興趣,以避免狀態機邏輯。我真的不喜歡爲此而處理狀態機。 – 2010-07-07 06:06:50
通過放棄,我的意思是我喜歡把管道中的每種數學運算看作磚的不同顏色(例如,red = mult,white = delay,blue = add),並且lego上的每個碰撞阻塞作爲延遲的時鐘週期。然後,當我從塊中構建數據路徑時,我考慮了差距,並考慮是否可以以不同方式將數據路徑捕捉到一起,以並行執行更多部分計算,而不是放入延遲寄存器。 – Marty 2010-07-07 15:05:10
我可以理解你的思維方式,當我聽說流水線時,我想過類似的比喻。但我從來沒有見過這樣的例子。你能聯繫我一些或編輯你自己的答案嗎?我會非常感激,你的答案會更完整。 – 2010-07-07 16:27:49