因爲你指定右移,我們可以援引該你表達的範圍內小尾數(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
)。
當然你也可以使用一個進程內循環。在進程外部,您可以使用For .. Generate語句。 –