2016-04-18 15 views
0

私は学校のプロジェクトで働いており、チケットを販売するマシンを設計しなければなりません。多くの要件があり、私はそれらの多くを世話しましたが、私は小さな問題があります。私は、デザイナーがマシンの最初のチケット数を決定します。そして、クライアントが一度に1枚のチケットを購入した後、この数は1単位で減少するはずです。それはしません。なにが問題ですか? (私は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

もし私が間違っていないなら、条件付き構文は 'else if'の代わりに' elsif'でしょうか?なぜあなたはそんなに多くの「終わり」を持っていますか? – annena

+0

どちらでもかまいません。 if文ごとに終わりがあります。主な問題は、チケットが1枚ずつ販売された後に、チケットの数を更新する方法(特定の値で初期化)を知らないことです。 –

+0

最初に、コードを書式設定してインデントしてください。正しいインデントまたはelsifステートメントを使用してください。第二に、あなたのデザインは時計がありません。短い識別子の名前を使うと、設計がより速くなったり小さくなったりするので、コードを理解するのが妨げられます。私の最後の注意:std_logic_vectorで算術演算をしないで、符号付きまたは符号なしの型を使用してください。 – Paebbels

答えて

1

init='1'の場合、Kは割り当てのない信号です。これは、フリップフロップではなく暗黙のラッチを作成します。

+0

私はそれが問題の一つであることは知っていますが、チケットを販売した後にチケットの数を更新するためにコードを書く方法はわかりません。 –

+1

ネストされた 'if-elseif'ステートメントに' else'でマッチしない暗黙的なラッチがあります。したがって、あなたは出力ポート 'B'に暗黙的なラッチを持っています。あなたの出力が期待どおりではないことは驚くことではありません。コードをデバッグする前に、これを修正する必要があります。 – kliew

+1

コードにはフリップフロップはありません。クロック信号なしでFFを見つけるのは難しいです。 – Paebbels

関連する問題