2016-01-25 76 views
1

我試圖創建一個移位寄存器,通過使用乘法(* 2)將位移位一個位置。但是,當我這樣做時,ISE(賽靈思IDE)告訴我這個表達式具有x2原始信號的元素數量。無符號乘法創建一個x2大小的數組

具體而言,我有:

if rising_edge(clk) then 

    registro <= unsigned(sequence); 

    registro <= registro * 2; 

    -- Just adds into the last position the new bit, Sin (signal input) 
    registro <= registro or (Sin, others => '0'); 

    sequence <= std_logic_vector(registro); 

end if; 

而且,我已經聲明之前:

signal Sin : std_logic; 

signal sequence : std_logic_vector(0 to 14) := "100101010000000"; 
signal registro : unsigned (0 to 14); 

所以我得到的錯誤(在乘法線):

表達式有30個元素;預計15

因此,爲什麼它創建一個x2大小的向量,如果我只乘以* 2?

我在想什麼?我怎樣才能做到這一點?

預先感謝您

+1

事實上,轉移不利於乘法;它是利用移位的乘法,因爲在二進制數字系統中左移一位等於×2。 – Paebbels

+0

完全正確的@Paebbels,我犯了一個錯誤。去正確=) –

回答

3

字寬的增長,因爲你用乘法。

乘以2個16位無符號數給出了一個32位無符號,一般來說。

現在可以優化你的具體乘法乘以一個常數2,並有綜合做正確的事情。在這種情況下,錯誤信息將變爲

表達式有16個元素;預計15

但爲什麼要綜合工具打擾?

使用左移位,而不是,或者使用一個左(右?)移位運算,或明確的切片和聯接,例如:

registro <= registro(1 to registro'length-1) & '0'; 

順便提及:

  • 使用升序位順序範圍對於算術來說是非常傳統的:我只能說這是好運...
  • 你在同一個過程中有三個相同的信號分配;只有最後一個纔會生效。(有關信號分配語義的一些信息,請參閱Is process in VHDL reentrant?
  • 如果您首先將「sequence」聲明爲unsigned,那麼您將節省大量不必要的轉換,並且流程中的代碼將減少爲單個語句,像

sequence <= ('0' & sequence(0 to sequence'length-2)) or (0 => Sin, others => '0') when rising_edge(clk);

我與「南轅北轍」的運算,所以我不能擔保的轉變實際上做你想做的完全不熟悉的。

+0

我看到布賴恩,以及我使用升序導致寄存器已經被設計成這樣(方案和這東西),所以我會使用:序列<=罪&序列(0序列'長度-2);'創建我的班次+新位。非常感謝! –

相關問題