2009-12-01 105 views
2

我編碼一個4位二進制加法器,蓄能器:VHDL - 問題與std_logic_vector

library ieee; 
use ieee.std_logic_1164.all; 

entity binadder is 
    port(n,clk,sh:in bit; 
     x,y:inout std_logic_vector(3 downto 0); 
     co:inout bit; 
     done:out bit); 
end binadder; 

architecture binadder of binadder is 
    signal state: integer range 0 to 3; 
    signal sum,cin:bit; 
begin 
    sum<= (x(0) xor y(0)) xor cin; 
    co<= (x(0) and y(0)) or (y(0) and cin) or (x(0) and cin); 

    process 
    begin 
     wait until clk='0'; 
     case state is 
      when 0=> 
       if(n='1') then 
        state<=1; 
       end if; 
      when 1|2|3=> 
       if(sh='1') then 
        x<= sum & x(3 downto 1); 
        y<= y(0) & y(3 downto 1); 
        cin<=co; 
       end if; 
       if(state=3) then 
        state<=0; 
       end if; 
     end case; 
    end process; 

    done<='1' when state=3 else '0'; 
end binadder; 

輸出:

-- Compiling architecture binadder of binadder

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(15):

No feasible entries for infix operator "xor".

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(15):

Type error resolving infix expression "xor" as type std.standard.bit.

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):

No feasible entries for infix operator "and".

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):

Bad expression in right operand of infix expression "or".

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):

No feasible entries for infix operator "and".

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):

Bad expression in left operand of infix expression "or".

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):

Bad expression in right operand of infix expression "or".

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):

Type error resolving infix expression "or" as type std.standard.bit.

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(28):

No feasible entries for infix operator "&".

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(28):

Type error resolving infix expression "&" as type ieee.std_logic_1164.std_logic_vector.

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(39):

VHDL Compiler exiting

我相信我不會處理std_logic_vector的正確。請告訴我如何? :(

回答

7

VHDL的一個特點是基本語言本身提供的功能非常少,大部分是通過使用包提供的,代碼的第二行就是一個例子(使用ieee.std_logic_1164這意味着你正在使用所有的std_logic_1164包,見here這個包定義的內容

當你編寫代碼時,你通常希望將你的信號存儲在std_logic或std_logic_vector中。第一個是std_logic也可以代表'0'或'1'以外的值,例如它也可以代表'Z'或'X';第二個是模擬器(比如modelsim,你是使用)經過優化,可以使用std_logic運行更快。

作爲一般慣例,最好始終將實體的輸入和輸出作爲std_logic或std_logic_vector。

您遇到的具體問題是您正在使用xor的類型位(這是VHDL標準中定義的極少數類型之一)。

最簡單的解決方案是將實體中的co輸出更改爲std_logic類型,並將sum和cin的聲明更改爲std_logic類型。

entity binadder is 
    port(n,clk,sh:in bit; 
     x,y:inout std_logic_vector(3 downto 0); 
     co:inout std_logic; 
     done:out bit); 
end binadder; 

    signal sum,cin:std_logic; 

進一步的評論是,它通常是不好的做法,讓你的港口INOUT除非你有一個很好的理由這樣做,因爲這將刪除一些是語言內置的嚴格類型檢查。最好的解決方案是在實體本身內創建一個信號並將信號直接分配給輸出。

entity binadder is 
    port(n,clk,sh:in bit; 
     x,y:inout std_logic_vector(3 downto 0); 
     co:out std_logic; 
     done:out bit); 
end binadder; 

    signal co_int:std_logic; 
begin 
    co_int<= (x(0) and y(0)) or (y(0) and cin) or (x(0) and cin); 
    co <= co_int; 

最後一點評論是,一旦狀態值爲1,它將如何變成2或3?

+0

謝謝。而且,是的,你說國家沒有增加是正確的。我修正了這一點。 (雖然我仍然沒有得到我需要的輸出:()但是,謝謝:D – Bojack

+0

如果你發佈你的更新代碼並告訴我你要找什麼輸出,我會很樂意提供更多的幫助...... – Justin

+1

我' d不同意將端口全部設置爲std_logic(_vector)是一種很好的做法。頂級pors(即真實硬件中真正的引腳)就是這種情況。但是在內部,使用與你的數據匹配的類型(所以使用整數,無符號向量,自定義類型,記錄,作品)。不要試圖強制所有東西變成std_logic類型。 避免使用'bit'類型,除非您有充分的理由使用它們 - 它們不能很好地混合使用std_logic; –

0

查看您的邏輯物理庫映射。

檢查物理庫實際上是否已經轉儲了包。

確保您沒有使用不同版本的預編譯頭與模擬器的不同版本。

如果什麼都行不通,只需製作ieee的本地副本,將std_logic_1164軟件包編譯進它,移動到工作庫,然後編譯您的設計。這工作。