2015-06-01 7 views
1

Итак, у меня есть счетчик по модулю, идущий от 1-> 15, а затем постоянно обходя вокруг отдельного объекта. Я бы хотел, чтобы в выражении case, зависящем от некоторых выходов, пробовал это значение на нарастающем значении часов, но делайте это только один раз, иначе значение будет постоянно изменяться. Есть ли способ сделать это? Назначить сигнал и оставаться неподвижным? Я разместил код, который, я надеюсь, продемонстрирует, что я пытаюсь сказать немного лучше.Как «пробовать» значение в VHDL?

process(all) 
     begin --sensitivity list? 
     if(reset) then 
      playerCards <= "0000000000000000"; 
      dealerCards <= "0000000000000000"; 
     elsif rising_edge(clock) then 
     case? deal & dealTo & dealToCardSlot is 
      when "1100" => 
      playerCards(3 downto 0) <= singleCard; 
        playerCards(15 downto 4) <= (others => '0'); 
      when "1101" => 
      playerCards(7 downto 4) <= singleCard; 
        playerCards(15 downto 8) <= (others => '0'); 
      when "1110" => 
      playerCards(11 downto 8) <= singleCard; 
        playerCards(15 downto 12) <= (others => '0'); 
      when "1111" => 
      playerCards(15 downto 12) <= singleCard; 
      when "1000" => 
      dealerCards(3 downto 0) <= singleCard; --dcard1 
      dealerCards(15 downto 4) <= (others => '0'); 
      when "1001" => 
      dealerCards(7 downto 4) <= singleCard; --dcard2 
      dealerCards(15 downto 8) <= (others => '0'); 
      when "1010" => 
      dealerCards(11 downto 8) <= singleCard; --dcard3 
      dealerCards(15 downto 12) <= (others => '0'); 
      when "1011" => 
      dealerCards(15 downto 12) <= singleCard; --dcard4 
      when "0--0" => null;      --do nothing when in win/end 
      when others => --this covers the start case --sets cards to 0 
      playerCards <= "0000000000000000"; 
      dealerCards <= "0000000000000000"; 
     end case?; 
     end if; 
    end process; 

Здесь у меня есть одна карта, привязанная к выходу моего счетчика, которая увеличивает каждый край часов. Поэтому в основном я бы хотел, чтобы мой оператор case только обновлял значение playerCards один раз, а затем останавливался. Спасибо за любую помощь.

ответ

1

Ваше требование может быть указано как: процесс может быть в двух состояниях - выборка или не выборка, а также переход к выборке при выборке.

Таким образом, вы можете сделать это с переменной состояния, которая в этом случае может быть логической - это превратит ваш процесс в конечный автомат. Как говорит другой ответ, вы можете использовать здесь сигнал вместо переменной, но это разрушает инкапсуляцию, делая процессы внутренней работы видимыми.

Некоторые люди будут настаивать на том, чтобы вы отделили машину состояния от двух других (или даже трех) процессов, но я думаю, что одна форма процесса намного меньше и понятна.

process(reset,clock) -- original sens list is incorrect for a clocked process 
    variable sampling : boolean; 
    begin 
     if(reset) then 
      sampling <= true; 
      -- other reset actions 
     elsif rising_edge(clock) then 
     if sampling then -- add conditions here, or it'll sample on the first clock. 
      sampling := false; 
      case ... -- sampling process and program logic 
      end case; 
     else 
      -- if you need to turn sampling back on, set "sampling" here 
     end if; 
     end if; 
    end process; 
+0

Будет ли он быть своего рода государственной машиной внутри моего датапата? Я спрашиваю об этом, как предположительно (это для школьной лаборатории), это можно сделать, не добавляя больше сигналов между моим FSM и datapath. Мне было интересно, будет ли что-то вроде deal'event & dealTo'event & dealToCardSlot'event работать? В настоящее время мои транзисторы FSM при нажатии кнопки, где я использую очень похожий FSM к тому, который вы описали, затем обновляются значения deal/dealTo/dealToCardSlot. Спасибо за помощь, я застрял на этом уже несколько дней. – gurtn

+0

'deal'event & dealTo'event & dealToCardSlot'event' звучит как очень плохая идея для меня, обычно вы смотрите только на событие на тактовый сигнал, а объединение событий в агрегат ... странно. Зачем? –

+0

Сделка, dealTo, dealToCardSlot удерживает свои значения для нескольких тактовых циклов, оператор case постоянно присваивает singleCard моему сигналу cardCards. Мне просто интересно, возможно ли, возможно, иметь постоянный тип, который после того, как назначенный больше не может измениться? – gurtn

1

Да, вам потребуется дополнительное внутренний сигнал, который будет контролировать свой режим работы: обновляя и без обновления.

На самом деле это был вид сигнал обратной связи. Вы генерируете его в зависимости от условий ввода, а затем вы также используете его на входе для изменения поведения.

Смежные вопросы