2016-11-16 42 views
0

我希望能夠有一個移位寄存器,對另一個寄存器加載一些值進行異或運算。問題是我希望用大規模矢量來做這件事,它的寬度大約是幾千位。大型矢量最高效的VHDL?

最顯而易見的方法在VHDL做到這一點會是這樣的

generic(length : integer := 15); 

signal shiftreg : std_logic_vector(length downto 0); 


process(clk) 
begin 
    if rising_edge(clk) then 
     shiftreg<= shiftreg(length-1 downto 0) & input; 
    endif; 
end process; 

然而,如果長度在這裏被設置爲一些非常高的數字,試圖合成這將成爲一項艱鉅的任務。由於這是一個相對簡單的結構,我想它會花費很長時間,因爲它的長度遠遠超出了單個塊中寄存器的數量。

我的問題是,如果有一種方式來實現這樣一個大型矢量,將以更快的速度合成。例如,使用類似

array(length downto 0) of std_logic; 

或合成工具識別這些是否等價?

+0

您可能會考慮從一個較小的實例化的移位寄存器中構建'千位寬'移位寄存器,這是基本映射完成一次的曲奇切割器方法。你還沒有演示如何使用'shiftreg'這可能會影響地點和路線。是否有任何方式表達與'shiftreg'部分相關的操作的地點? – user1155120

+0

正如我所提到的那樣,shiftreg用於與另一個相等大小的寄存器進行XOR運算,然後將該XOR的位相加以給出不匹配位的數量。 – Zephyr

+0

您可以將兩個寄存器都作爲移位寄存器來操作,並計算移入時不匹配的位數嗎?你現在怎麼做這個總結?這個想法並沒有減少函數的複雜性。一個單一的異或門和一個計數器,而不是一些較大的求和機制。你沒有描述整個「事物」被綜合的複雜程度。 – user1155120

回答

1

合成時間在FPGA設計中通常並不相關,儘管面積利用率和時序通常都是如此。如果您的移位寄存器佔用了您的目標FPGA的大部分資源,綜合將需要很長時間才能找出使其工作的方法,同樣,在填充更大的部分時,構建需要更長的時間。對於某些球場而言,在現代中端FPGA中採用80%完整設計和緊湊定時通常需要大約30分鐘的綜合時間和3小時的時間才能完成&路線。如果您仍然描述相同的功能,這將不會受到編碼風格的顯着影響。

如果你在VHDL中使用std_logic_vector描述了一個移位寄存器(具有相同的功能特徵),它是一個你定義爲std_logic數組的類型,或者其他東西,它將合成成同樣的東西。

近肥胖型賽靈思份至少,單個LUT可以只要沒有描述復位(同步或異步)用於64深移位寄存器。您也可以用少數LUT生成一個1000深度的移位寄存器。

現在,如果您希望使用該移位寄存器的整個千位來反對其他寄存器,則不能使用SRL(LUT用作移位寄存器),因爲只有最後一位可以作爲輸出。這使得它將整個事件放在寄存器中,可能會比較大,並且可能需要比寄存器更多的寄存器。關鍵在於你必須考慮你描述的硬件的規模,以及你的目標部分是否可行。

如果你想有一個非常深的移位寄存器,塊RAM可用於在深度超過10萬像移位寄存器,但這些有同樣的問題,你只能訪問最終輸出。

+0

您對典型時序的評論與我對VHDL的一般經驗相符,但不是我看到的這個例子。根據Post-Synthesis Utilization報告,對於2^16比特的矢量,我應該使用FPGA上大約1/4的可用FF,但僅用於綜合就需要4個多小時,甚至不需要嘗試實現。 – Zephyr

+0

@Zephyr聽起來好像你可能會遇到一個合成器沒有完成它應該做的事情。除了移位寄存器外,還有其他設計嗎?我認爲它沒有被優化掉,所以必須有一些東西,而你對整個矢量做的任何事情都會消耗大量的LUT,所以你仍然可能會耗盡資源。不過,如果您需要一個64k深的移位寄存器來訪問每一位以獲得更多的邏輯,我強烈建議您重新考慮您的方法。 – QuantumRipple

+0

目前我有2個移位寄存器按照我的問題描述的方式實現,還有1個其他的std_logic_vector將保存結果。最終我會將2個移位寄存器異或併到矢量中,然後對結果矢量的各個位進行求和,但是我還沒有實現,我只用3個大矢量實現了這個大的合成時間。 – Zephyr