Исследование параметризованного модуля LPM_FIFO. Устройство передачи данных с FIFO, страница 4

             when q_H1 =>

                    TX_state <= q_N;

             when q_N =>

                    if (DATA_len = 0) then

                           TX_state <= q_T1;

                    elsif (DATA_len /= 0) then

                           TX_state <= q_DATA;

                    end if;

             when q_DATA =>

                    if (DATA_len /= 0) then

                           TX_state <= q_DATA;

                    elsif (DATA_len = 0) then

                           TX_state <= q_T1;

                    end if;

             when q_T1 =>

                    if (timer = '1') then

                           TX_state <= q_T1;

                    elsif (timer = '0') then

                           TX_state <= q_H1;

                    end if;

             end case;

             if (timer <= '1') then

                    COUNT_2us <= (COUNT_2us + 1) mod 24;

             else

                    COUNT_2us <= 0;

             end if;

       end if;

END PROCESS;

PROCESS (CLKtmp)

BEGIN

       if rising_edge(CLKtmp) then

             case TX_state is   

             when q_H1 =>

                    if (conv_integer(USEDW) = 0) then

                           timer <= '1';

                           DATA_len <= 0;

                    elsif (conv_integer(USEDW) < 8) then

                           DATA_len <= conv_integer(USEDW);

                           timer <= '1';

                    else

                           DATA_len <= 8;

                           timer <= '0';

                    end if;            

             when q_N =>

                    null;

             when q_DATA =>

                    DATA_len <= DATA_len - 1;

             when q_T1 =>

                    if (COUNT_2us = 23) then timer <= '0';

                    end if;

             end case;

       end if;

END PROCESS;

with TX_state select

       DATA_out <= 

       "11111111"                        when q_H1,

       conv_std_logic_vector(DATA_len,8)       when q_N,

       D_FIFO                                  when q_DATA,

       "10001111"                        when q_T1;

END TX_CONTROL_arch;

            Блок TX_CONTROL работает по следующему алгоритму, который опишем конечным автоматом.

            Формат передачи пакета:

            Заголовок (Н1) — Число байт данных (N)— Данные (DATA) — Конец пакета (T1).

            Если на момент передачи пакета данных нех, то передаем пустой пакет:

            Заголовок — Число байт данных (00)  Конец пакета.

            Так как пакет состоит из 4х частей то у КА будет 4 состояния.

            q_H1 – передача заголовка;

            q_N — число передаваемых байт данных;

            q_DATA — передача данных;

            q_T1 — передача конца пакета;


Рис. 2.4.Алгоритм работы  TX_CONTROL.

            Конечный автомат синхронный. Из состояния  q_H1 безусловный переход в состояние  q_N, если есть данные, то происходит переход в состояние передачи данных, если нет, то переход в к передаче конца пакета. Если передается меньше чем заданное число данных, по причине того, что на момент передачи пакета их не хватает в очереди, передается что есть, и КА находится в состоянии q_T1 до того как обнулится таймер, отсчитывающий 2 мкс.