2014-02-14 58 views
0

作爲一個學術練習,我設計了一個具有一定約束條件的移位寄存器,其中一個就是我必須使用給定數量的d型觸發器(數量來自通用)。VHDL:參數化總線在一個過程中的分配

我怎樣才能讓輸入總線的寬度隨着我所擁有的拖鞋的數量而變化?

這是最初的計劃(使用for-loops,使用i作爲遞增值),但我們無法在進程中使用for循環!

else --SHIFT LEFT 
if (CTRL = "10") then 


internalInputBus (i+1) <= internalOutputBus(i); 
internalInputBus (0) <= SHIFT_IN; 

else --SHIFT RIGHT 
if (CTRL = "01") then 
internalInputBus (i) <= internalOutputBus(i+1); 
internalInputBus (n-1) <= SHIFT_IN; --use interesting test length thing 
+0

當然你也可以使用一個進程內循環。在進程外部,您可以使用For .. Generate語句。 –

回答

0

因爲你指定右移,我們可以援引該你表達的範圍內小尾數(DOWNTO)i+1爲左移和i-1

「寄存器」的大小可以通過泛型來分配,用於匹配端口大小和任何內部數組值大小。

signal internalInputBus: std_logic_vector (REGSIZE-1 downto 0); 

在你的進程語句,其中左移

internalInputBus <= internalInputBus(REGSIZE-2 downto 0) & right_shift_input; 

右側用連接操作最REGSIZE-1個位的移位輸入。

當右移

internalInputBus <= left_shift_input & internalInputBus(REGSIZE-1 downto 1); 

我見過的人前使用單個移位輸入,但從來沒有發現它是有道理的自己的應用程序。沒有內部三態信號,某個地方就有一個隱含的多路複用器。

循環語句允許在進程語句中使用順序語句。我想象你在結束邊界時遇到了麻煩。尋求解決方案會導致您使用串聯運算符的類比。

上述兩個級聯運算符示例的左邊界和右邊界將導致您如何使用不遍歷所有元素的循環以及額外的賦值運算符來覆蓋目標數組的所有元素。

-- LEFT 
for i in REGSIZE-2 downto 0 loop 
    internalInputBus(i+1) <= internalInputBus(i); 
end loop; 

internalInputBus(0) <= right_shift_input; 

-- RIGHT 
for i in REGIZE-1 downto 1 loop 
    internalInputBus(i-1) <= internalInputBus(i); 
end loop; 
internalInputBus(REGSIZE-1) <= left_shift_input; 

這些只是從我的頭頂完成。買者自負。

請注意,沒有插入等待的信號分配(如在循環語句中)可以讀取您剛安排更新的值的當前值。如果您使用的是變量目標,而您想要顛倒順序以防止覆蓋正在評估的下一個值。 (在這種情況下,在 - RIGHT示例中,for i in 1 to REGIZE-1 loop)。

0

您可以在一行中寫入移位器。我已經改名爲你的信號io節省打字和做的根本點更清晰的(我認爲它反正!):

i <= o(o'high-1 downto 0) & SHIFT_IN; 

這需要信號O,砍掉最高位,並提出新的位於「低」端,導致左移。

同樣,對於右移,下降的最低位,並把新的位上「高」端:

i <= SHIFT_IN & o(o'high downto 1);