2016-06-14 320 views
-1

此代碼適用於PRBS(僞隨機二進制序列)接收器。它應該採用三個值並模擬PRBS發生器,並使用生成的值檢查獲得的值。 但代碼顯示錯誤的關鍵字等開始,其已經存在已存在關鍵字的vhdl錯誤代碼10500

library ieee; 
    use ieee.std_logic_1164.all; 
    use ieee. std_logic_arith.all; 
    use ieee. std_logic_unsigned.all; 

    entity receiver is 
    port(
     inp : in std_logic; 
     clock : in std_logic; 
     count : out std_logic_vector(4 downto 0); 
     check : out std_logic); 
    end receiver; 

    architecture rec of receiver is 
    signal P : std_logic_vector(2 downto 0); 
    signal O : std_logic_vector(2 downto 0); 

    process (clock) 
     variable cnt : integer range 0 to 3; 
     begin 
      if clock'event and clock='1' then 
       P <= inp & P(2 downto 1); 
       cnt<=cnt+1; 
      end if; 
      if (cnt = 3) then 
       O<=P; 
       elseif (cnt >3) 
       O <= inp & O(2 downto 1); 
      end if; 
      if((O(2) xor O(0)) = P(0)) 
       check <= '0'; 
      else 
       check <= '1'; 
       count <= count +1; 
      end if; 
     end process; 
    end rec; 

錯誤(10500):在receiver.vhd(18)附近的文本「過程」 VHDL語法錯誤;預期「開始」或聲明語句

錯誤(10500):receive.vhd(21)在文本「if」附近的VHDL語法錯誤;錯誤(10500):receive.vhd(21)在文本附近的VHDL語法錯誤「以及」接近「 「;」期望「(」或「'」或「。」

錯誤(10500):receive.vhd(24)附近的文本「if」處的VHDL語法錯誤;期望「;」或標識符「如果」 是保留關鍵字),或 「結構」

錯誤(10500):在receiver.vhd(25 VHDL語法錯誤)鄰近文本 「然後」;需要 「< =」

誤差(10500 ):receiver.vhd處的VHDL語法錯誤(28)接近文字「O」;期望「(」或「'」或「。」

錯誤(10500):receive.vhd(29)附近的文本「if」處的VHDL語法錯誤;期望「;」或標識符(「if 「是一個保留的關鍵字),或 」結構「

錯誤(10500):在receiver.vhd(31 VHDL語法錯誤)鄰近文本 」檢查「;需要」 < =」

錯誤(10500): receiver.vhd(32)附近的文本「else」;期待「end」,或「(」或標識符(「else」是保留關鍵字)或併發語句時的VHDL語法錯誤

錯誤(10500 ):receiver.vhd處的VHDL語法錯誤( 35)附近的文字「if」;期待「;」,或標識符(「如果」是一保留的關鍵字),或「結構」

+0

嘗試反向工作,直到它編譯完成時刪除代碼,然後添加代碼以瞭解爲什麼要將其分開。如果您不明白每個語法錯誤,那麼您可以將它發佈爲[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。另外,考慮使用ModelSim仿真器進行初始編譯,因爲週轉時間比Quartus快。 Altera ModelSim入門版是免費的。 –

+0

或者看第一個錯誤。看一個'architecture'的例子,並將它與你的代碼進行比較。查看錯誤消息中是否存在涉及任何關鍵字的差異。提示:有。 –

+0

信號聲明之後缺少保留字('begin'),它將體系結構聲明項與併發語句(如過程聲明)分開。如果else拼寫錯誤'elsif',並且缺少'then',則下一個if語句缺少'then'。 'cnt'不是一個信號,一個變量是一個不同的分隔符(':=')。 (並且約束整數不會進行模運算)。 'count'是一個模式輸出端口,無法讀取您不應該基於組合使能(在'if'中的'else',我們稱之爲一個醒目的振盪器)來增加'count'。 – user1155120

回答

0

您的實體的結構需要看起來像這樣:

entity receiver is 
    port (
    -- Your ports 
); 
end receiver; 

architecture rec of receiver is 
    -- Declarations here 
begin -- ** Your code is missing this part 

    process (clock) 
    begin 
    -- your process 
    end process; 

end rec; 

如在所提到的評論,始終以開頭錯誤你看;首先理解並解決這個問題,並且很多後來的錯誤通常會因此而消失。

您已聲明cnt作爲變量,然後嘗試使用cnt <= cnt + 1;增加它,但變量分配應使用:=而不是<=

下一個錯誤是您使用elseif;這不是一個真正的關鍵字,它看起來像你想使用elsif。該行也缺少一個then

然後你有一條線if((O(2) xor O(0)) = P(0)),這又是一個缺少then

最後,您試圖直接增加count這是一個out端口。這是不可能的,因爲您正在嘗試讀取輸出以便將其添加到它;有幾種方法可以解決這個問題,但是我個人會創建一箇中間信號(例如count_s),您可以在您的過程中使用該信號,然後將該輸出分配給該信號,並在count <= count_s之外的某個位置進行處理。

解決了所有這些問題後,您的代碼至少可以編譯。


作爲一個便箋,它會幫助你有更好的垂直對齊你的代碼;您的end process應該與其開頭的process垂直對齊,依此類推。