2016-04-18 4 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, используйте тип подписанный или unsigned. – Paebbels

ответ

1

K - сигнал без назначения при init='1'. Это создает неявный затвор, а не триггер.

+0

Я знаю, что это одна из проблем, но я не знаю, как писать код, чтобы обновить количество билетов после того, как они были проданы. –

+1

У вас есть неявные защелки в ваших вложенных операторах 'if-elseif', которые не соответствуют' else'. Таким образом, у вас также есть неявная защелка на вашем выходном порту 'B'. Не удивительно, что ваш результат не так ожидаемый. Вам действительно нужно исправить это, прежде чем пытаться отладить ваш код. – kliew

+1

В коде нет никаких промахов. Трудно найти FF без тактового сигнала. – Paebbels