私は学校のプロジェクトで働いており、チケットを販売するマシンを設計しなければなりません。多くの要件があり、私はそれらの多くを世話しましたが、私は小さな問題があります。私は、デザイナーがマシンの最初のチケット数を決定します。そして、クライアントが一度に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;
もし私が間違っていないなら、条件付き構文は 'else if'の代わりに' elsif'でしょうか?なぜあなたはそんなに多くの「終わり」を持っていますか? – annena
どちらでもかまいません。 if文ごとに終わりがあります。主な問題は、チケットが1枚ずつ販売された後に、チケットの数を更新する方法(特定の値で初期化)を知らないことです。 –
最初に、コードを書式設定してインデントしてください。正しいインデントまたはelsifステートメントを使用してください。第二に、あなたのデザインは時計がありません。短い識別子の名前を使うと、設計がより速くなったり小さくなったりするので、コードを理解するのが妨げられます。私の最後の注意:std_logic_vectorで算術演算をしないで、符号付きまたは符号なしの型を使用してください。 – Paebbels