2017-05-25 36 views
0

我正在從編譯器這個messege所有 「busreg」 位:無法處理註冊多司機

topld:busshift.vhd:(E463) 'busreg(7)' - 能」處理註冊的多驅動程序。

topld:busshift.vhd:(E446)無法在所選設備中處理'busreg(7)'的多個驅動程序。

我被要求做移位rigister,我可以放在從兩邊放,因爲我選擇取決於DIR。

我的代碼:

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 
use ieee.std_logic_arith.all; 

ENTITY shiftbus IS 
    PORT 
     (
     busreg  : inout std_logic_vector(7 downto 0); 
     dir,clk : IN std_logic; 
     pinL,pinR : inout std_logic 
     ); 
END shiftbus; 

ARCHITECTURE behavioral OF shiftbus IS 
BEGIN 
    busreg<="00000000"; 
    process(clk,dir) 
    begin 
     if (rising_edge(clk)) then 
      if(dir='1') then --1 we input from right 
       busreg<=busreg(6 downto 0)&pinR; 
      else-- else is 0 and we input from left 
       busreg<=pinL & busreg(7 downto 1); 
      end if; 
     end if; 
    end process; 
END behavioral; 

回答

1

你有下面這行:

busreg <= "00000000"; 

如果你要驅動這個信號低的時候,有什麼其他邏輯的意義呢?

1

您正在從兩個進程驅動信號busreg:顯式進程和隱式進程busreg <= "00000000";。換句話說,你有一個短路。

一個過程是一些軟件模擬一點硬件。

因此,當您從多個進程中驅動一個信號時,您正在建模一個由多個硬件驅動的信號。通常,如果你想從兩個或更多的硬件驅動信號,你需要使用三態邏輯。我認爲錯誤信息告訴你,你選擇的FPGA器件不能實現三態邏輯,所以你從一個地方驅動信號是錯誤的。

那麼,爲什麼你寫的行busreg <= "00000000";?如果你希望重置你的移位寄存器,你還沒有;你創造了一個短路。

順便說一句:你的過程是一個順序過程。順序進程的靈敏度列表應該只包含時鐘,或者如果存在異步復位,則只包含時鐘和異步復位。 dir不應在您的敏感度列表中。