Описание автомата при явном кодировании входов и выходов
Относительно кодирования состояний следует отметить, что большинство разработчиков САПР настоятельно не рекомендуют пользователям самостоятельно задавать коды состояния (а значит использовать битовые вектора для представления состояний), а использовать именно перечислительный тин для представления состояний. САПР автоматически выберет коды состояний.
Если для входа автомата предполагается большое число комбинаций, а значения отдельных источников входа слабо связаны между собой, предпочтительно представление входа в виде набора независимых логических единиц, представляемых в программе типами 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; |