2016-04-18 11 views
0

Ich arbeite an einem Schulprojekt und ich muss eine Maschine entwerfen, die Tickets verkauft. Es gibt viele Anforderungen und ich habe auf viele von ihnen aufgepasst, aber ich habe ein kleines Problem. Ich, der Designer entscheidet, wie viele Tickets es in der Maschine gibt. Und dann, nachdem die Kunden ein Ticket zu einem Zeitpunkt kaufen, sollte diese Zahl mit einer Einheit abnehmen. Es tut nicht. Was ist falsch? (Ich bin Anfänger, wenn es darum geht, Code in VHDL zu schreiben).Dieser vhdl Code tut nicht was ich will. Was mache ich falsch?

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

Wenn ich nicht falsch liege, sollte die bedingte Syntax "elif" anstelle von "sonst wenn" sein? Und warum hast du so viele "Ende wenn"? – annena

+0

Es kann beides sein. Ich habe ein Ende, wenn für jede if-Anweisung. Das Hauptproblem ist, dass ich nicht weiß, wie man die Anzahl der Tickets (die mit einem bestimmten Wert initialisiert sind) aktualisiert, nachdem die Tickets einzeln verkauft wurden. –

+0

Erstens: bitte formatieren und einrücken Sie Ihren Code, verwenden Sie entweder korrekte Einrückung oder Elsif-Anweisungen. Zweitens hat Ihr Design keine Uhr. Die Verwendung von kurzen Bezeichnern macht das Design schneller oder kleiner, es verhindert nur, dass wir Ihren Code verstehen ... meine letzte Anmerkung: Führen Sie keine arithmetischen Berechnungen für std_logic_vector durch, verwenden Sie den Typ "signed" oder "unsigned". – Paebbels

Antwort

1

K ist ein Signal ohne Zuweisung, wenn init='1'. Dies erzeugt ein implizites Latch anstelle eines Flip-Flops.

+0

Ich weiß, das ist eines der Probleme, aber ich weiß nicht, wie man Code schreibt, um die Anzahl der Tickets zu aktualisieren, nachdem eine verkauft wurde. –

+1

Sie haben implizite Zwischenspeicher in Ihren verschachtelten 'if-elseif' -Anweisungen, die nicht mit 'else' übereinstimmen. Sie haben also eine implizite Verriegelung an Ihrem Ausgang, 'B'. Es ist nicht überraschend, dass Ihre Ausgabe nicht wie erwartet ist. Sie müssen dies wirklich beheben, bevor Sie versuchen, Ihren Code zu debuggen. – kliew

+1

Im Code sind keine Flip-Flops vorhanden. Es ist schwierig, FFs ohne Taktsignal zu finden. – Paebbels