2013-10-05 84 views
0

我編輯這個線程來更新我的全新項目,並使其更具可讀性: - 不是靜態信號:VHDL程序IF-THEN-ELSE-if語句

--Propagate & generate team-- 
LIBRARY ieee; 
USE ieee.std_logic_1164.all; 
USE ieee.numeric_std.all; 
ENTITY PG_team_1bit IS 
    PORT(a, b:IN STD_LOGIC; 
     p: OUT STD_LOGIC; 
     g: OUT STD_LOGIC); 
END PG_team_1bit; 
ARCHITECTURE PG_team_1bit_arch OF PG_team_1bit IS 
BEGIN 
    p <= a XOR b; 
    g <= a AND b;  
END PG_team_1bit_arch;  


--Grey Box-- 
LIBRARY ieee; 
USE ieee.std_logic_1164.all; 
USE ieee.numeric_std.all; 
ENTITY Grey_box IS 
    PORT(P, G, Gminus:IN STD_LOGIC; 
     NewG: OUT STD_LOGIC); 
END Grey_box; 
ARCHITECTURE Grey_box_arch OF Grey_box IS 
    SIGNAL temp: STD_LOGIC; 
BEGIN 
    temp <= P AND Gminus; 
    NewG <= G OR temp;  
END Grey_box_arch;  


--Black Box-- 
LIBRARY ieee; 
USE ieee.std_logic_1164.all; 
USE ieee.numeric_std.all; 
ENTITY Black_box IS 
    PORT(P, G, Pminus, Gminus:IN STD_LOGIC; 
     NewP, NewG: OUT STD_LOGIC); 
END Black_box; 
ARCHITECTURE Black_box_arch OF Black_box IS 
    SIGNAL temp: STD_LOGIC; 
BEGIN 
    NewP <= P AND Pminus; 
    temp <= P AND Gminus; 
    NewG <= G or temp;  
END Black_box_arch; 


--Full adder-- 
LIBRARY ieee; 
USE ieee.std_logic_1164.all; 
USE ieee.numeric_std.all; 
ENTITY Full_Adder IS 
    PORT(A, B, Cin:IN STD_LOGIC; 
     S, Cout: OUT STD_LOGIC); 
END Full_Adder; 
ARCHITECTURE Full_Adder_arch OF Full_Adder IS 
    SIGNAL p: STD_LOGIC; 
BEGIN 
    p <= A XOR B; 
    S <= p XOR Cin; 
    Cout <= (A AND B) OR (A AND Cin) OR (B AND Cin);  
END Full_Adder_arch; 



--SKLANSKY SPARSE TREE ADDER 32 bit-- 
LIBRARY ieee; 
USE ieee.std_logic_1164.all; 
USE ieee.numeric_std.all; 
ENTITY SSTA32 IS 
    PORT(A, B:IN STD_LOGIC_VECTOR(31 downto 0); 
     S: OUT STD_LOGIC_VECTOR(32 downto 0)); 
END SSTA32; 
ARCHITECTURE SSTA32_arch of SSTA32 IS 
    SIGNAL con: STD_LOGIC; 
    SIGNAL p: STD_LOGIC_VECTOR(31 downto 0); 
    SIGNAL g: STD_LOGIC_VECTOR(31 downto 0); 
    SIGNAL NewGG: STD_LOGIC_VECTOR(6 downto 0); 
    SIGNAL NewP: STD_LOGIC_VECTOR(6 downto 0); 
    SIGNAL NewBG: STD_LOGIC_VECTOR(6 downto 0); 
    variable j : integer := 0; 
    variable k : integer := 0; 
    variable l : integer := 0; 
    variable m : integer := 0; 
    variable d : integer := 0; 
    variable e : integer := 0; 
COMPONENT PG_team_1bit 
    PORT(a, b:IN STD_LOGIC; 
     p: OUT STD_LOGIC; 
     g: OUT STD_LOGIC); 
END COMPONENT; 
COMPONENT Grey_box IS 
    PORT(P, G, Gminus:IN STD_LOGIC; 
     NewG: OUT STD_LOGIC); 
END COMPONENT; 
COMPONENT Black_box IS 
    PORT(P, G, Pminus, Gminus:IN STD_LOGIC; 
     NewP, NewG: OUT STD_LOGIC); 
END COMPONENT; 
COMPONENT Full_Adder IS 
    PORT(A, B, Cin:IN STD_LOGIC; 
     S, Cout: OUT STD_LOGIC); 
END COMPONENT; 
BEGIN 
    con <= '1'; 
    GENERATE_LABEL_1: 
    FOR i IN 0 TO 31 GENERATE 
     PG_team_1bit_i: PG_team_1bit PORT MAP(a(i), b(i), p(i), g(i)); 
    END GENERATE GENERATE_LABEL_1; 
    GENERATE_LABEL_2: 
    FOR i IN 0 TO 31 GENERATE 
     BEGIN 
      F0 : IF ((i=1) OR (i=5) OR (i=9) OR (i=13) OR (i=17) OR (i=21) OR (i=25) OR (i=29)) GENERATE 
      BEGIN Grey_box_i: Grey_box PORT MAP(p(i), g(i), g(i-1), NewGG(j));-- 
      j := j+1; 
      END GENERATE F0; 
      F1 : IF ((i/=1) AND (i/=5) AND (i/=9) AND (i/=13) AND (i/=17) AND (i/=21) AND (i/=25) AND (i/=29)) GENERATE 
      BEGIN Black_box_i: Black_box PORT MAP(p(i), g(i), p(i-1), g(i-1), NewP(k), NewBG(k)); 
      k := k+1; 
      END GENERATE F1; 
     END GENERATE GENERATE_LABEL_2; 
    GENERATE_LABEL_3: 
    FOR i IN 0 TO 31 GENERATE 
     BEGIN 
     F2 : IF (i=3) GENERATE 
      BEGIN Grey_box_i: Grey_box PORT MAP(NewP(m), NewBG(m), NewGG(m), DNewG); 
      m := m+1; 
      END GENERATE F2; 
     F3 : IF ((i=7) OR (i=11) OR (i=15) OR (i=19) OR (i=23) OR (i=27) OR (i=31)) GENERATE 
      BEGIN Black_box_i: Black_box PORT MAP(NewP(m), NewBG(m), con, NewBG(m), TNewP(l), TNewBG(l)); 
      l := l+1; 
      END GENERATE F3; 
     END GENERATE GENERATE_LABEL_3; 
    GENERATE_LABEL_4: 
    FOR i IN 0 TO 31 GENERATE 
     BEGIN 
     F4 : IF (i=3) GENERATE 
      BEGIN C(d) <= '0'; 
      d := d+1; 
      C(d) <= NOT DNewG; 
      d := d+1; 
      END GENERATE F4; 
     F5 : IF (i=7) GENERATE 
      BEGIN Grey_box_i: Grey_box PORT MAP(TNewP(e), TNewBG(e), DNewG, DNewG2); 
      C(d) <= NOT DNewG2; 
      d := d+1; 
      e := e+1; 
      END GENERATE F5; 
     F6 : IF (i=11) GENERATE 
      BEGIN Grey_box_i: Grey_box PORT MAP(NOT TNewP(e), NOT TNewBG(e), DNewG2, C(d)); 
      d := d+1; 
      e := e+1; 
      END GENERATE F6; 
     F7 : IF (i=15) GENERATE 
      BEGIN Black_box_i: Black_box PORT MAP(TNewP(e), TNewBG(e), TNewP(e-1), TNewBG(e-1), QNewP, QNewBG); 
      Grey_box_i: Grey_box PORT MAP(QNewP, QNewBG, DNewG2, DNewG3); 
      C(d) <= DNewG3; 
      d := d+1; 
      e := e+1; 
      END GENERATE F7; 
     F8 : IF (i=19) GENERATE 
      BEGIN Grey_box_i: Grey_box PORT MAP(NOT TNewP(e), NOT TNewBG(e), DNewG3, C(d)); 
      d := d+1; 
      e := e+1; 
      END GENERATE F8; 
     F9 : IF (i=23) GENERATE 
      BEGIN Black_box_i: Black_box PORT MAP(TNewP(e), TNewBG(e), TNewP(e-1), TNewBG(e-1), PNewP, PNewBG); 
      Grey_box_i: Grey_box PORT MAP(PNewP, PNewBG, DNewG3, C(d)); 
      d <= d+1; 
      e <= e+1; 
      END GENERATE F9; 
     F10 : IF (i=27) GENERATE 
      BEGIN Black_box_i: Black_box PORT MAP(NOT TNewP(e), NOT TNewBG(e), PNewP, PNewBG, HNewP, HNewBG); 
      Grey_box_i: Grey_box PORT MAP(HNewP, HNewBG, DNewG3, C(d)); 
      END GENERATE F10; 
     END GENERATE GENERATE_LABEL_4; 
    d := 0; 
    GENERATE_LABEL_5: 
    FOR i IN 0 TO 31 GENERATE 
     BEGIN 
     F11 : IF ((i=0) AND (d=0)) GENERATE 
      BEGIN Cin <= C(d); 
      d := d+1; 
      END GENERATE F11; 
     F12 : IF ((i=4) AND (d=1)) GENERATE 
      BEGIN Cin <= C(d); 
      d := d+1; 
      END GENERATE F12; 
     F13 : IF ((i=8) AND (d=2)) GENERATE 
      BEGIN Cin <= C(d); 
      d := d+1; 
      END GENERATE F13; 
     F14 : IF ((i=12) AND (d=3)) GENERATE 
      BEGIN Cin <= C(d); 
      d := d+1; 
      END GENERATE F14; 
     F15 : IF ((i=16) AND (d=4)) GENERATE 
      BEGIN Cin <= C(d); 
      d := d+1; 
      END GENERATE F15; 
     F16 : IF ((i=20) AND (d=5)) GENERATE 
      BEGIN Cin <= C(d); 
      d := d+1; 
      END GENERATE F16; 
     F17 : IF ((i=24) AND (d=6)) GENERATE 
      BEGIN Cin <= C(d); 
      d := d+1; 
      END GENERATE F17; 
     F18 : IF ((i=28) AND (d=7)) GENERATE 
      BEGIN Cin <= C(d); 
      d := d+1; 
      END GENERATE F18; 
     Full_Adder_i: Full_Adder PORT MAP(a(i), b(i), Cin, S(i), Cout); 
     Cin <= Cout; 
     F19 : IF (i=31) GENERATE 
      BEGIN S(32) <= Cout; 
      END GENERATE F19; 
     END GENERATE GENERATE_LABEL_5; 
END SSTA32_arch; 

,我得到的是下面的錯誤幾乎所有我使用的信號的名稱。 -Variable聲明不允許的地方,我做到了。 -未知標識符。 - 信號分配的非法目標和 - 非法的和解聲明。

任何提示來解決它們? 也是我生成,如果現在正確?我改變了,以避免過程。 在此先感謝

回答

0

基於結構的縮進通常會顯示語法問題,所以我採取了 自由美化您的代碼。正如您在最後一部分中看到的,很多 if語句沒有正確關閉end if語句。該語法 錯誤必須固定,並且您可以考慮使用elsif作爲相互獨立的條件。

關於你的問題:

  1. 我應該把什麼在敏感列表:對於描述 觸發器(S)的過程中,靈敏度應必須在時鐘和任何異步復位 信號(S)。對於描述組合邏輯的過程,靈敏度列表必須包含在組合邏輯中使用的所有源信號。 一般而言,您編寫的任何過程都應該是這兩個過程中的任何一個,因此要麼描述觸發器的要麼是描述組合邏輯的 。 之後的問題不是這兩個問題,並且有多個問題:它不是 允許實例化模塊,Grey_box和Black_box,在一個進程內部, 並且通常不能使用k作爲變量,與:=分配,而不是 在過程中聲明它。

  2. 我該如何讓p和g全球化;我做得不夠? p和g 自從在體系結構中聲明後可用,所以問題是由於 嘗試在進程中實例化模塊,如上所述。

總體而言,你可以考慮入手這樣一個大項目之前得到有關VHDL概念 更好的理解,因爲它就會容易得多 理解和糾正您遇到任何語法錯誤消息。

一個好的開始是Wikipedia VHDL page,你可以在Further reading下看看。爲了得到一個好的VHDL體驗,我建議你挖掘一些資源來學習 的基本概念。

+0

爲快answer.I非常感謝了這些問題: 1.「對於描述組合邏輯的處理,靈敏度列表必須包含所有的源信號,即在組合邏輯中使用「。 由於我的邏輯是我(整數)相比,我怎麼做?因爲我試圖把整數的括號,它說我不能這樣做。 2.「嘗試實例化一個模塊我是一個過程」 我在閱讀的同時搜索。可以解釋這個原因,我不明白它的意思。 在此先感謝。 –

+0

1:問題與類型(整數)無關,但靈敏度列表中的元素必須是信號,因此必須在架構中聲明。 –

+0

1:問題與類型(整數)無關,但靈敏度列表中的元素必須是信號。 2:布賴恩Drummonds偉大的職位描述「兩個領域」,並將模塊放在錯誤的領域,因爲你不能把模塊放入一個進程。我建議你花一些時間閱讀關於VHDL的一般原理,並自己寫一些小例子,因爲它不像其他編程語言,你可以在所有代碼中使用所有語句。 VHDL是硬件描述語言(HDL),其中文字描述硬件,所以你的代碼必須是硬件。 –

1

退一步;很顯然你還不習慣VHDL;它與其他語言有所不同,坦率地說,(IMO)在許多(大多數?)書籍中都沒有很好地教授這些差異。

修復語法錯誤,不會讓你通過這一點;學會看到背後的概念錯誤。

有些文章強調VHDL是一種硬件描述語言,而不是一種編程語言:雖然這是真的,但這並不是特別有用,並可能導致您陷入糟糕的底層設計實踐。這裏有一個不同的視圖...

VHDL實際上是兩種不同的語言之一:像Pascal或C這樣的順序語言,以及像...這樣的並行處理語言我想不出一個好例子,但也許是像ML或Haskell這樣的函數式編程語言(與我一起討論這一點......),其中事情並行發生,而不是以任何特定順序發生:VHDL的真正優勢在於它的確如此safely!

在一個過程中,可以把它像一個連續的語言,用函數,過程(無效函數C程序員!),變量,循環的if/then/else和熟悉的順序語義 - 但有一個例外:Signals have different semantics,因爲他們之間的通信手段(通常是不同的)過程秒。 (一個典型的C程序是一個單一的過程:如果你編寫多線程的C程序,你會知道你需要一個非常不同的學科和像線程庫這樣的額外支持)。

VHDL的另一個方面是並行方面,您創建多個單元 - 基本上所有進程獨立操作,通過信號進行通信。外的過程中,你有一組不同的編程工具:

  • 實體/架構是圍繞一組進程包裝。

  • 組件是相同的,因爲它們只是映射到實體(通過 配置,允許您選擇不同的實體或 體系結構)。如果您不需要重新映射它們,則可以取消 組件並直接實例化設計中的實體。

  • 簡單的信號分配如 p <= A XOR B;一個流程之外是一個完整流程的縮寫,它包含了這個單一的任務。

  • 還有條件信號分配和選擇的信號分配,例如,

    p <= A when B = '1' else C;這些又是進程的簡寫。

  • 連接多個並行進程變得單調乏味:Generate語句是自動執行該作業的工具。

這是一個錯誤的兩個結構域混合:如使用的if/then/else或變量賦值a := b;外的方法,或對實例化的組件或使用Generate內部的一個。現在,ARCHITECTURE SSTA32_arch of SSTA32裏面可以看到這樣的錯誤......

我不打算解決你的項目,我不認爲你想要我;但這裏有幾個指針:

  • 當你可以使用變量和過程之外的變量賦值,這是通常一個錯誤:這些被稱爲「共享變量」和(C語言程序員條款)不是線程安全的,通常不會達到您的預期。使用信號(並學習它們的語義)是這裏的方法。

  • 雖然您不能在進程外使用if a then b else c;,但您可以使用if a generate b; end generate; if not a generate c; end generate;,並且可以嵌套生成語句。

  • 更好的格式化將使讀起來更容易,錯誤更容易發現。

  • 我想你可能要「ELSIF」,而不是「否則,如果」在地方:能夠解決很多缺失的「結束時,如果」問題

編輯:更新的答案更多的指針.. 。

  • 「變量聲明不允許」的架構仍然是一個問題......乍一看我不明白爲什麼你不使用的信號。

  • 在第二一目瞭然:

    F2 : IF i=3 GENERATE 
        BEGIN 
         Grey_box_i: Grey_box PORT MAP(NewP(m), NewBG(m), NewGG(m), DNewG); 
         m := m+1; 
        END GENERATE F2; 
    

在那樣的生成語句中,不能使用變量(因爲他們是一個過程之外)。我懷疑你打算讓他們的價值基本上是靜態的 - 一個確定性的功能(i)而不是國家持有者本身的權利。

編譯器不知道 - 它看到更多的狀態,它可能會在運行時發生變化(並且您無法在運行時增加更多硬件!),因此它拒絕這個想法。例如有沒有訂購Generate生成的硬件,因此生成「i = 3」的情況下,最後是完全合法的,你有沒有保證的價值米。你可能不會喜歡結果!

解決方法很簡單:消除m作爲變量,使成爲(i)的函數。

function m(x : integer) return integer is 
begin 
    case x is 
     when 3  => return 0; 
     when others => return 1; 
    end case; 
end m; 

... PORT MAP(NewP(m(i)), ... 

該函數屬於架構中的其他聲明。因爲i在生成語句的任何實例中都是固定的(static),所以f(i) - 這裏m(i) - 也是靜態的,儘管我沒有測試過這種方法,但我希望它能夠工作。

  • 至於未知的標識符,我看到各種名稱,如DNEWG在上面的代碼片段中,我找不到聲明;這是微不足道的解決。

  • 你可以在if-expressions周圍丟失多餘的括號;他們只是通過雜亂路過的C程序員離開

+0

嗨,感謝您的答案。 「更好的格式將使閱讀更容易,錯誤更容易發現。」你的意思是如果我之後如果我選項卡?如果我沒有選項卡,我期待看到如果我沒有語法錯誤,這就是爲什麼我沒有解決這個問題。有人爲我編輯它,我會糾正我的項目。 2.關於elsif,是的,我也會糾正。我錯過了他們。 3.我會試着理解你所說的關於最終生成的東西,並會回來。 非常感謝您的快速幫助。 –

+0

如果您現在可以重新檢查編碼部分,我試圖修復它。感謝 –

+0

1.我是否需要聲明每個信號,即使它作爲輸出出來的組件的PORT MAP? 2.在你添加的解決方案中,返回的值將會轉到x變量上嗎?那麼它如何與PORT MAP中的「i」連接? 此外,我不知道我的代碼是否清楚,但我試圖使用所有變量作爲指標,有時即使「我」達到了31的值,指標也會停止,比如說7因爲只在如果陳述他的價值會上升。 3.我會修正括號。 很多人都非常感謝您的幫助。 –