Описание автомата при явном кодировании входов и выходов

Относительно кодирования состояний следует отметить, что большинство разработчиков САПР настоятельно не рекомендуют пользователям самостоятельно задавать коды состояния (а значит использовать битовые вектора для представления состояний), а использовать именно перечислительный тин для представления состояний. САПР автоматически выберет коды состояний.

Если для входа автомата предполагается большое число комбинаций, а значения отдельных источников входа слабо связаны между собой, предпочтительно представление входа в виде набора независимых логических единиц, представляемых в программе типами BIT или std_logic (при реализации это набор одноразрядных линий связи). При этом для определения действия в конкретном состоянии часто требуется анализировать не все входные линии, а лишь существенные в данном состоянии, что реально может привести к экономии оборудования. Появляется возможность принудительно устанавливать приоритеты сигналов и даже кодовых комбинаций.

Рассмотрим описание автомата, диаграмма состояний которого приведена на рис. .

ARCHITECTURE fsm OF example IS

TYPE STATE_TYPE IS (Init, Idle, Write, Read, Inc);

SIGNAL state : STATE_TYPE ;

BEGIN

clocked : PROCESS( Clk, Reset )

BEGIN

IF (Reset = '1') THEN state <= Init;

ELSIF (Clk'EVENT AND Clk = '1') THEN

CASE state IS

WHEN Init => state <= Idle;

WHEN Idle =>

IF (WR = '1') THEN state <= Write;

ELSIF (Rd = '1') THEN state <= Read; Strs<=’1’;

END IF;

WHEN Write =>

IF (Emp = '1') THEN state <= Write;;Busy_C<=’1’;

ELSIF (Ack = '1') THEN state <= Inc;Busy_C<=’0’

END IF;

WHEN Read =>

IF(Emp = '1') THEN state <= Read; Busy_R<=’1’

ELSIF (Ack = '1') THEN state <= Inc;; busy_R<=’0’; Strs<=’0’;

END IF;

WHEN Inc =>

IF (Addr7 /= '1') THEN state <= Idle;

ELSIF (Addr7 = '1') THEN state <= Init;

END IF;

END CASE;

END IF;

END PROCESS clocked;

--выходная комбинационная логика

EN<=’1’ when state=write or state=idle else ‘0’;

ClrAdr<=’1’ when state=idle else‘0’;

Ld<=’1’ when state=write else ‘0’;

EnINC<= ‘1’ when state=INC else ‘0’;

Str<=‘1’ when state=read else ‘0’;

END ARCHITECTURE fsm,

 

Пакеты

Представлены двумя модулями – первичным – декларация пакета, и вторичным – тело пакета Первый определяеи глобальные имены( в том чиле декларирует подпрограммы, детальное описание которых представляется в теле пакета

Для выяснения структуры пакета обратимся к тексту файла p_l3.vhd, представленному на рис. . В примере объявлены глобальный тактирующий сигнал p_clk и глобальные перечисляемые типы данных для представления входных сигналов и состояний автоматов, а также декларируются подпрограммы.

library IEEE; USE ieee.std_logic_1164.ALL; use ieee.util_1164.all;   PACKAGE p_l3 IS FUNCTION buffer_inv(input:std_logic_vector; en:std_logic ) RETURN std_logic_vector; signal p_clk:std_logic; type state is (s0,s1,s2,s3,s4,s5,s6,s7); type st_m_out is (y0,y1,y2,y3); type st_m_in — доопределить!!! FUNCTION input_to_vector( inp:st_m_in;k:integer) return std_logic_vector; FUNCTION Output_to_vector — доопределить!!!; END p_l3;   PACKAGE BODY p_l3 IS FUNCTION input_to_vector ( inp:st_m_in;k:integer) return std_logic_vector IS variable i,j:integer; begin i:=0; for l in st_m_in loop if inp=l then j:=i; end if; i:=i+1; end loop; return to_vector(j,k); end input_to_vector;   FUNCTION output_to_vector — доопределить!!! end p_l3;   FUNCTION buffer_inv(input:std_logic_vector; en:std_logic) return std_logic_vector IS VARIABLE result: std_logic_vector(input'range); BEGIN FOR i IN input'RANGE LOOP IF en='1'then IF input(i) = '1' THEN result(i) := '0'; ELSE result(i) := '1'; END IF; ELSE result(i):='Z'; end if; END LOOP; RETURN result; END buffer_inv;