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;
Wenn ich nicht falsch liege, sollte die bedingte Syntax "elif" anstelle von "sonst wenn" sein? Und warum hast du so viele "Ende wenn"? – annena
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. –
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