Разработка микропроцессорной системы

дипломная работа

3.2 Проектирование управляющего автомата Avt_ADC

Возможный алгоритм работы автомата Avt_Aoc блока cnt_ADС, отвечающий протоколу, необходимому для правильной работы БИС AD7892 фирмы Analog Devices, может иметь вид, соответствующий схеме переходов автомата, приведенной на рисунке 9. Схема переходов при помощи графического редактора пакета HDL Designer Series фирмы Mentor Graphics была занесена в соответствующий диаграммный файл.

Автомата Avt_ADC, управляющего считыванием данных из АЦП во временный регистр Reg_Buf и записью этих данных в память МП, и поддерживающего для этих обменов требуемое взаимодействие квитирующих сигналов.

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

Исходно (по сигналу Rst и по завершении цикла записи блока данных) автомат находится в состоянии IDLE_ST. В этом состоянии автомат формирует сигнал Busy, сигнализирующий о готовности к приему блока данных от АЦП, и сигнал Res_count, обнуляющий счетчик числа циклов записи count, и продолжает находиться в состоянии IDLE_ST до появления сигнала start, который приводит к переходу автомата в последующее состояние START_ST. В этом состоянии формируется сигнал запуска процедуры преобразования: сигнал nconvst устанавливается в 0.

В состоянии WAIT1_ST автомат остается до тех пор, пока не поступит сигнал готовности данных от ADC -- сигнал nЕОС не станет равным нулю.

В состоянии LOAD_ST формируются сигнал квитирования nRD для АЦП, сигнал запуска записи данных Load от ADC в промежуточный регистр и сигнал запроса DMА_Req к контроллеру ПДП. Одновременно с запросом подготавливается передача в МП старшего байта данных из регистра, для чего формируется сигнал ОЕ.

В состоянии WАIТ2_sт формируется сигнал ОЕ. В этом состоянии автомат остается до тех пор, пока не появится сигнал ACK_DMA, подтверждающий готовность МП к приему данных по каналу ПДП. По этому сигналу выходные данные Reg_Buf1, находящиеся на выходе мультиплексора, переписываются в ОЗУ.

В состоянии DMA_ST формируются новый сигнал запроса Req _ DMA к контроллеру ПДП и подготавливается передача в МП младших 4 -х разрядов данных из регистра Reg_Buf2, для чего снимается сигнал ОЕ.

Автомат безусловно переходит из состояния DMA_ST в состояние WAIT3_ST. В этом состоянии он остается до тех пор, пока не появится сигнал ACK_DMA, подтверждающий готовность МП к приему данных по каналу ПДП.

В состоянии ENDTR_ST анализируется сигнал End_Count. Если сигнал End_count равен 1, что соответствует завершающему 128 циклу приема оцифрованных данных от АЦП, то автомат переводится в начальное состояние IDLE_ST, в противном случае автомат переходит в состояние START_ST, запускающее новый цикл преобразования.

программный тестирование микропроцессорный схема

Рисунок 8 - Граф-схема переходов автомата управления Avt_ADC

Для автомата с помощью программы пакета HDL Designer Series фирмы Mentor Graphics была выполнена трансляция диаграммы.

hds header_start

hds header_end LIBRARY ieee;

USE ieee.std_logic_l164.all; USE ieee.std_logic_ariht.all;

ENTITY Avt_ADC IS

PORT(Clk, Start, Rst, nEOC, Ack_DMA, End_Count : in std_logic; nConvSt, Busy, Load, Req_DMA, OE, nRD, Res_Count: out std_logic); END Avt ADC;

hds interface_end LIBRARY ieee;

USE ieee.std_logic_1164.all; USE ieee.std_logic_ariht. all;

ARCHITECTURE fsm of Avt_ADC IS

-- Architecture Declarations

TYPE state_values IS (IDLE_ST, START_ST, WAIT1_ST, LOAD_ST, WAIT2_ST, DMA_ST, WAIT3_ST, ENDTR_ST,);

SIGNAL current_state, next_state: state_values; BEGIN

cloced: process (Clk, Rst) BEGIN

IF Rst = 1 THEN

current_state <= IDLE_ST; -- Reset Values ELSIF rising_edge(Clk) then

current_state <= next_state; -- Default Assignment To Internals END IF; END PROCESS cloced;

NEXTSTATE: PROCESS (current_state, Start, nEOC, Ack_DMA, End_Count) BEGIN

-- Defaults Assignment

nConvSt <= 1;

Busy <= 1; Load <= 0; ReqDMA <= 0; OE <= 0; nRD <= 0; Res_Count <= 0;

-- Combined Actions

CASE current_state IS

WHEN IDLE_ST =>

Busy <= 0;

Res_count <= 1;

IF Start = 1 THEN

next_state <= START_ST;

END IF; WHEN START_ST =>

nConvSt <= 0;

next_state <= WAIT1_ST; WHEN WAIT1 ST =>

IF nEOC = О THEN

next_state <= LOAD_ST; END IF; WHEN LOAD_ST => Load <= 1; nRD <= 0; Req_DMA <= 1; OE <= 1;

next_state <= WAIT2_ST; WHEN WAIT2_ST => OE <= 1; IF Ack_DMA = 1 THEN

next_state <= DMA_ST; END IF; WHEN DMA_ST =>

Req_DMA <= 1; next_state <= WAIT3_ST; WHEN WAIT3_ST =>

IF Ack_DMA = 1 THEN

next_state <= ENDTR_ST; END IF; WHEN ENDTR_ST =>

IF End_Count = 1 THEN

next_state <= IDLE_ST; ELSE

next_state <= START_ST; END IF; WHEN OTHERS =>

next_state <= IDLE_ST; END CASE; END PROCESS nextstate; -- Concurrent Statements END fsm;

Делись добром ;)