2015-10-10 118 views
0

下面是完整的錯誤:錯誤:HDLParsers:808 - 「C:/ Users/vROG/Desktop /.../ CacheController.vhd」第72行=不能有這樣的操作數在這方面。=在這種情況下不能有這樣的操作數

我明白如何解決這個問題,如果我使用'+'或'*',但等號?

正如你所看到的,代碼幾乎沒有完全接近,但我不明白爲什麼我的第二個嵌套如果不工作。我已經嘗試將dirtyBIT轉換爲int類型,但它仍然給我帶來了同樣的錯誤,這導致我相信我在某個地方犯了一個微不足道的錯誤。

FIXED(使用user1155120的建議)但是,如何解決偏移量和標籤的問題?

architecture Behavioral of CacheController is 

signal tagFROMCPU : STD_LOGIC_VECTOR(7 downto 0) := CPU_addr(15 downto 8); 
signal indexFROMCPU: STD_LOGIC_VECTOR(2 downto 0) := CPU_addr(7 downto 5); 
signal offsetFROMCPU: STD_LOGIC_VECTOR(4 downto 0) := CPU_addr(4 downto 0); 

TYPE STATETYPE IS (state_0, state_1, state_2, state_3); 
SIGNAL present_state : STATETYPE; 

--Variables 
signal dirtyBIT: std_logic_vector (7 downto 0); 
signal validBIT: std_logic_vector (7 downto 0); 

TYPE tag is array (7 downto 0) of STD_LOGIC_VECTOR(7 downto 0); 
TYPE offset is array (7 downto 0) of STD_LOGIC_VECTOR(4 downto 0); 

signal myTag: tag; 
signal myOFFSET : offset; 
    begin 

--STATE MACHINE 
process(clk)  
begin 
    if (present_state = state_0) then --Start State : Checks for HIT or MISS, PERFORMS HIT OPERATION or MOVES TO STATE_1 
     if ((myTag(to_integer(unsigned(indexFROMCPU)) = tagFROMCPU)) then 
     --HIT 
     else 
      present_state <= state_1; 
     end if; 
    elsIF (present_state = state_1) then --CHECKS DIRTY BIT. IF 0, LOADS DATA, MOVES TO STATE_0 ELSE move to state_2 

     if (dirtyBit(to_integer(unsigned(indexFROMCPU))) = '0') then 
      present_state <= state_0; 
     else 
      present_state <= state_2; 
     end if; 

    elsIF(present_state = state_2) then -- DIRTY BIT IS 1, SAVES DATA, goes back to STATE_1 
      present_state <= state_1; 
    end if; 
end process; 


end Behavioral; 

OLD CODE

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL; 


entity CacheController is 
Port (
     clk   : in STD_LOGIC; 
     CPU_addr : in STD_LOGIC_VECTOR (15 downto 0); 
     CPU_WR_RD : in STD_LOGIC; 
     CPU_CS  : in STD_LOGIC; 

     CPU_RDY  : out STD_LOGIC; 

     SDRAM_Addr : out STD_LOGIC_VECTOR (15 downto 0); 
     SDRAM_WR_RD : out STD_LOGIC; 
     SDRAM_MSTRB : out STD_LOGIC; 

     MUX1,MUX2 : out STD_LOGIC; 

     SRAM_Addr : out STD_LOGIC_VECTOR (7 downto 0); 
     SRAM_WEN : out STD_LOGIC 

); 

end CacheController; 

architecture Behavioral of CacheController is 

signal tagFROMCPU : STD_LOGIC_VECTOR(7 downto 0) := CPU_addr(15 downto 8); 
signal indexFROMCPU: STD_LOGIC_VECTOR(2 downto 0) := CPU_addr(7 downto 5); 
signal offsetFROMCPU: STD_LOGIC_VECTOR(4 downto 0) := CPU_addr(4 downto 0); 

TYPE STATETYPE IS (state_0, state_1, state_2, state_3); 
SIGNAL present_state : STATETYPE; 

--Variables to emulate SRAM 
TYPE dirtyBIT is array (7 downto 0) of std_logic; 
TYPE validBIT is array (7 downto 0) of std_logic; 
TYPE tag is array (7 downto 0,7 downto 0) of std_logic; 
TYPE offset is array (7 downto 0,4 downto 0) of std_logic; 

begin 

--STATE MACHINE 
process(clk)  
begin 
    if (present_state = state_0) then --Start State : Checks for HIT or MISS, PERFORMS HIT OPERATION or MOVES TO STATE_1 

    elsIF (present_state = state_1) then --CHECKS DIRTY BIT. IF 0, LOADS DATA, MOVES TO STATE_0 ELSE move to state_2 

     if (dirtyBit(to_integer(unsigned(indexFROMCPU))) = '0') then 
      present_state <= state_0; 
     else 
      present_state <= state_2; 
     end if; 

    elsIF(present_state = state_2) then -- DIRTY BIT IS 1, SAVES DATA, goes back to STATE_1 
      present_state <= state_1; 
    end if; 
end process; 


end Behavioral; 
+0

您粘貼的代碼只包含64行。哪一個應該是違規行號72? – mkrieger1

+0

這是一個XST錯誤。 @ mkrieger1 - 第52行。'dirtyBit'是一個類型的名稱。也許你想宣佈它是一個信號對象?我懷疑這將適用於所有顯示爲類型的四個' - Variables'。 – user1155120

+0

@ user1155120是否正確。用任何--Variables代替Dirtybit會給出同樣的錯誤。將嘗試將它們宣佈爲信號 –

回答

1

操作過載號決議(「=」運算符)需要一個函數具有匹配簽名(類型左和右輸入和返回類型的)中聲明。

 if (dirtyBit(to_integer(unsigned(indexFROMCPU))) = '0') then 

更改聲明dirtyBit

--Variables to emulate SRAM 
-- TYPE dirtyBIT is array (7 downto 0) of std_logic; 
signal dirtyBIT: std_logic_vector (7 downto 0); 

而且你的代碼分析。我建議其他類型的聲明(validBIT,tagoffset)應該進行類似的處理。

看起來應該有一個數組類型,其中offset被使用。類型名稱可能會更改爲保留offset作爲信號名稱。