2016-04-18 170 views
0

我在一個學校項目工作,我不得不設計出售門票的機器。有很多要求,我照顧了很多人,但我有一個小問題。我,設計師決定機器中的票數是多少。然後,客戶一次購買一張票後,這個數字應該減少一個單位。它不是。哪裏不對? (當談到以VHDL編寫代碼時,我是一名初學者)。這個vhdl代碼並沒有做我想做的事。我做錯了什麼?

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

entity bilete is 
    port(en1,en2: in std_logic; 
    init: in std_logic; 
    B: out std_logic_vector(15 downto 0); 
    err: out std_logic; 
    ok: out std_logic); 
end bilete; 

architecture Bil of bilete is 
    signal en : std_logic; 
    constant C: std_logic_vector(15 downto 0):=x"0002"; 
    signal M: std_logic_vector(15 downto 0); 

begin 
en<= en1 nor en2; 
P: process(en,init,M) 

variable Verr: std_logic:='0'; 
variable Vok: std_logic:='0'; 
variable K: std_logic_vector(15 downto 0):=x"0000"; 

begin 

    if init='0' then  -- inititialize the number of tickets 
     K:=C; 
     M<=K; 
     if en='0' then 
     Verr:='0'; 
     B<=K; 
     Vok:='0'; 
    else if K<0 then 
     Vok:='0'; 
     B<=x"0000"; 
     Verr:='1'; 
    else if K>0 then 
     Verr:='0'; 
     Vok:='1'; 
     B<=K-x"0001"; 
     K:=K-x"0001"; 
     M<=K; 
    end if; 
    end if; 
    end if; 


    else if init='1' then -- decrement 

    if en='0' then 
     Verr:='0'; 
     B<=M; 
     Vok:='0'; 
    else if M<0 then 
     Vok:='0'; 
     B<=x"0000"; 
     M<=x"0000"; 
     Verr:='1'; 
    else if M>0 then 
     Verr:='0'; 
     Vok:='1'; 
     B<=M-x"0001"; 
     M<=M-x"0001"; 
    end if; 
    end if; 
    end if; 

    end if; 
    end if; 
err<=Verr; 
ok<=Vok; 
end process P; 
end Bil; 
+0

如果我沒有錯,條件語法應該是'elsif'而不是'else if'?爲什麼你有這麼多'結束如果'? – annena

+0

它可以是兩個。如果對每個if語句都結束,我會結束。主要的問題是,我不知道如何在門票一個一個地出售之後更新門票的數量(以某個值初始化)。 –

+0

首先:請格式化並縮進您的代碼,請使用正確的縮進或elsif語句。其次,你的設計沒有時鐘。使用簡短標識符名稱確實會使設計更快或更小,這隻會阻礙我們理解您的代碼......我的最後一個注意事項:不要對std_logic_vector進行算術計算,使用signed或unsigned類型。 – Paebbels

回答

1

K是init='1'時沒有指定的信號。這創建了一個隱式的鎖存器,而不是一個觸發器。

+0

我知道這是其中一個問題,但我不知道如何編寫代碼以便在售出一張票後更新票數。 –

+1

您在嵌套的'if-elseif'語句中隱式鎖存與'else'不匹配。所以你的輸出端口也有一個隱式鎖存器'B'。毫不奇怪,你的產出不像預期的那樣。在嘗試調試代碼之前,您確實需要解決此問題。 – kliew

+1

代碼中沒有人字拖。沒有時鐘信號很難找到FF。 – Paebbels