Введение в стандарт IEEE. Справочное руководство по языку VHDL (Пересмотр стандарта IEEE. 1076-1987), страница 15

constant Waiting : std_logic_vector(1 downto 0) := "00";

constant Ack1    : std_logic_vector(1 downto 0) := "01";

constant Ack2    : std_logic_vector(1 downto 0) := "10";

  constant Ack3    : std_logic_vector(1 downto 0) := "11";

signal current_state, next_state : std_logic_vector(1 downto 0);

Счетчики.

     Счетчики обычно представляются в виде ступенчатой последовательности состояний, у которых "спад частотной характеристики" возвращает их к начальному состоянию. В VHDL, счетчики обычно описываются с блоком регистра, который синхронизирует их с системными часами и применяет другое средство управления, типа предварительной установки или сброса. Каждый активный переход часов вызывает замену текущего индекса на следующий.



Например, см. код count_up ниже.

library ieee;

use ieee.std_logic_1164.all;

use ieee.numeric_std.all;

entity count_up is

port(reset, ck : in std_logic;

count     : out std_logic_vector(7 downto 0));

end;

architecture behavior of count_up is

signal count_n: unsigned(7 downto 0);

begin

process (reset, ck, count_n)

begin

if reset='1' then

count_n <= x"00";

elsif (ck='1' and ck'event) then

count_n <= count_n + "1";

end if;

end process;

count <= std_logic_vector(count_n);

end;

     Как только системные часы (ck) переключаются, выходной сигнал (индекс) изменяется,  увеличивая свое состояние на единицу.


     Если сигнал сброса (сброс) активен, счетчик должен обнулится. Сигнал называется асинхронным (или независимым от часов) если он находится вне логики часов. “ Стиль исходного текста" очень походит на подход, при моделировании триггеров D-типа. Счетчик загружается произвольным значением, “ встречный код загрузки “ используя набор линий данных, определенных как DATA.


dn - указывает состояние соответствующего входа при активном переходе часов.

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

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

Счетчики запускаемые положительным фронтом сигнала с дополнительным доступом к часами, и доступом к счету устанавливают, синхронную очистку, и синхронную загрузку. Следующий пример описывает 8-разрядный загружаемый счетчик обратного действия с асинхронной очисткой и доступными часами:

library IEEE;

use IEEE.STD_LOGIC_1164.all;

use WORK.EXEMPLAR_1164.all;

entity CNT_DN_AC_SL_EN is

port (CLK,CLK_EN,ACLEAR,SLOAD: in  std_logic;

DATA:                    in  std_logic_vector(7 downto 0);

Q:                       out std_logic_vector(7 downto 0));

end CNT_DN_AC_SL_EN;

architecture EX of CNT_DN_AC_SL_EN is

signal Q_INT: std_logic_vector(Q'range);

begin

    process (CLK,ACLEAR)

begin

if (ACLEAR='1') then

Q_INT <= (Q_INT'range => '0');

elsif (CLK'event and CLK'last_value='0' and CLK='1') then

if (CLK_EN='1') then

if (SLOAD='1') then

Q_INT <= DATA;

else

Q_INT <= Q_INT - "1";

end if;

            end if;

end if;

end process;

Q <= Q_INT;

end EX;

Эта модель использует пакет EXEMPLAR_1164 для оператора вычитания. Если вы хотите отмоделировать этот пример, добавьте указанный пакет к папке библиотек проекта.

Блоки регистра.