Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція 18.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.17 Mб
Скачать

Реалізація цифрових автоматів на пліс altera de-2

Для демонстрації моделей цифрових автоматів, реалізованих на ПЛІС Altera DE2, наведено два приклади автоматів Мілі та Мура. Структурна схема автомата Мілі зображена на рис. 1.18.

Рис. 1.18. Структурна схема автомата Мілі

Вихідний сигнал автомата Мілі, залежить від текучого стану автомата і вхідного сигналу.

Структурна схема автомата Мура зображена на рис. 1.19.

Рис. 1.19. Структурна схема автомата Мура

Вихідний сигнал автомата Мура, залежить тільки від поточного стану автомата.

Як відомо, скінченний автомат може знаходитися в кожен конкретний момент часу тільки в одному стані. Кожен тактовий імпульс викликає перехід автомата з одного стану в наступний. Правила переходів і визначаються комбінаційною схемою, названою логікою переходів. Наступний стан визначається як функція текучого стану і вхідного сигналу.

Регістр активного стану представляє собою набір тактованих D-тригерів синхронізованих одним синхросигналом і використовується для зберігання коду текучого стану автомата. Очевидно, що для автомата з n станами потрібно log2(n) тригерів.

Логіка формування виходу. Вихід ЦА зазвичай представляється як функція текучого стану і вихідної позиції (у випадку автомата Мілі). Формування вихідних сигналів автомата визначається за допомогою логіки формування виходу.

Для зручності, сполучення частин логіка переходів і регістр активного стану, я зробив однаковими для обох автоматів. Діаграма переходів для автоматів Мілі та Мура зображена на рис. 1.20.

Рис. 1.20. Діаграма переходів. st0 - st4 – стани в яких може знаходитись автомат; 00 , 01, 10, 11, x1, 0x, 1x, x0, x1 – двобітні вхідні сигнали;

х – невизначене значення біта (0, або 1)

Цей граф показує. що досліджувані автомати Мілі та Мура можуть перебувати в 5-х станах, причому поточний стан перебування автомата залежить від попереднього стану автомата і вхідного сигналу попереднього такту. ЦА переходить з одного стану в наступний при кожному такті. Переходи між станами, зображені на графі, можуть бути довільними, або такими що відповідають конкретній задачі закладеній в автомат, так само і кількість станів автомата.

Апаратні засоби ПЛІС дозволяють дуже просто реалізувати будь-які логічні структури в тому числі ЦА. Для цього потрібно написати код відповідних програм і підключити входи і виходи цих програмних модулів до відповідних контактів стенду DE2. З графа бачимо, що вхідний сигнал складається з двох бітів, для цього доцільно задіяти два перемикачі, наприклад SW[0] і SW[1]. Вихідний сигнал складається лише з одного біту, для його реєстрації доцільно задіяти один з світлодіодів, наприклад LEDR[17]. Щоб процес відбувався динамічно, використовується вбудований генератор тактових сигналів CLOCK_50, з частотою 50 МГц, але пряме його використання не дасть хорошого візуального ефекту оскільки процес відбуватиметься дуже швидко і буде неможливо спостерігати за послідовністю роботи автоматів, для цього ця частота понижується за допомогою подільника частоти до 2 Гц. Для відображення поточного і наступного станів автомата використовуються два 7-сегментні індикатори HEX7 і HEX0 відповідно, на які виводиться цифра стану. Для забезпечення стабільної і безвідмовної роботи використовується скидання автомата в початковий стан, для цього було підключено кнопку KEY[0]. Таким чином завжди забезпечується ініціалізація автомата в наперед передбаченому стані при першому тактовому імпульсі. У випадку, якщо скидання не передбачається, неможливо спрогнозувати, з якого початкового стану почне функціонувати автомат, що може призвести до збоїв в роботі всієї системи. Особливо ця ситуація актуальна при включення живлення системи. Зазвичай застосовуються асинхронні схеми скидання, через те, що не потрібно використовувати дешифратор невикористовуваних (надлишкових) станів, що спрощує логіку переходів.

Блок-схема алгоритму формування вихідного сигналу для автомата Мура зображено на рис. 1.21.

Рис. 1.21. Блок-схема алгоритму блока «логіка формування виходу» автомата Мура. pres_state – регістр для зберігання активного стану автомата;

data_out – вихідні дані

Блок-схема алгоритму формування вихідного сигналу для автомата Мілі зображено на рис. 1.22.

Рис. 1.22. Блок-сема алгоритму блока «логіка формування виходу» автомата Мілі. pres_state – регістр для зберігання активного стану автомата;

data_in – вхідні дані; data_out – вихідні дані

Оскільки ПЛІС, виконані по архітектурі FPGA мають достатню кількість регістрів (тригерів), використання автоматних моделей дозволяє отримати достатньо швидкодіючу і, в той же час, наочну реалізацію при помірних затратах ресурсів. Мова опису пристроїв Verilog HDL, на якій були реалізовані дані автомати, має достатній набір операторів для реалізації різноманітних програм на ПЛІС. На рис.1.23 наведено приклади роботи програми:

Рис. 1.23. Приклад роботи комбінаційної схеми автоматів Мілі та Мура. Зліва зображена цифра текучого стану автомата, справа – наступного

Лістинг програми автомата Мура

module moore

(

input wire CLOCK_50,

input wire [1 : 0] SW, //data_in

input wire [0 : 0] KEY, //reset

output wire [17 : 0] LEDR, //data_out

output reg [0 : 0] LEDG, //індикатор тактових сигналів частотою 2 Гц

//7-сегментні індикатори

output reg [7 : 0] HEX0, HEX1, HEX2, HEX3, HEX4, HEX5, HEX6, HEX7

);

//провідник, негативний сигнал якого миттєво переводить автомат в початковий стан

wire reset;

//вхідні дані, які задаються перемикачами SW[0] і SW[1]

wire [1 : 0] data_in;

//вихідні дані, які фіксуються світлодіодом LEDR[17]

reg data_out;

reg [2:0] pres_state, next_state, clock;

integer timer, item;

always @(posedge CLOCK_50)

begin

//початок блоку подількика частоти

timer = timer - 1;

if(!timer)

begin

timer = 25000000;

clock = clock ? 0 : 1;

end

//кінець блоку подількика частоти

end

//вивід на 7-сегментні індикатори:

always @(posedge clock)

begin

LEDG[0] = LEDG[0] ? 0 : 1;

//...текучого стану автомата

HEX7 = pres_state == 0 ? 7'b100_0000 :

pres_state == 1 ? 7'b111_1001 :

pres_state == 2 ? 7'b010_0100 :

pres_state == 3 ? 7'b011_0000 :

pres_state == 4 ? 7'b001_1001 : 7'b011_1111;

//...наступного стану автомата

HEX0 = next_state == 0 ? 7'b100_0000 :

next_state == 1 ? 7'b111_1001 :

next_state == 2 ? 7'b010_0100 :

next_state == 3 ? 7'b011_0000 :

next_state == 4 ? 7'b001_1001 : 7'b011_1111;

end

initial

begin

timer = 25000000;

clock = 1;

pres_state = st0;

//ініціалізація всіх 7-сегментний індикаторів

//в неактивний режим

for(item = 0; item < 8; item = item + 1)

begin

HEX1[item] = 1'b1;

HEX2[item] = 1'b1;

HEX3[item] = 1'b1;

HEX4[item] = 1'b1;

HEX5[item] = 1'b1;

HEX6[item] = 1'b1;

HEX7[item] = 1'b1;

HEX0[item] = 1'b1;

end

end

assign reset = KEY[0];

assign LEDR[17] = data_out;

assign data_in = SW;

parameter st0=3'b000, st1=3'b001, st2=3'b010, st3=3'b011, st4=3'b100;

//FSM register (регістр активного стану автомата)

always @(posedge clock or negedge reset)

begin: statereg

if(!reset) //асинхронне скидання

pres_state = st0;

else

pres_state = next_state;

end // statereg

// FSM combinational block (логіка переходів)

always @(pres_state or data_in)

begin: fsm

case (pres_state)

st0: case(data_in)

2'b00: next_state=st0;

2'b01: next_state=st4;

2'b10: next_state=st1;

2'b11: next_state=st2;

endcase

st1: case(data_in)

2'b00: next_state=st0;

2'b10: next_state=st2;

default: next_state=st1;

endcase

st2: case(data_in)

2'b0x: next_state=st1;

2'b1x: next_state=st3;

endcase

st3: case(data_in)

2'bx1: next_state=st4;

default: next_state=st3;

endcase

st4: case(data_in)

2'b11: next_state=st4;

default: next_state=st0;

endcase

default: next_state=st0;

endcase

end // fsm

// логіка формування виходу автомата Мура

// використовуючи тільки pres_state

always @(pres_state)

begin: outputs

case(pres_state)

st0: data_out=1'b1;

st1: data_out=1'b0;

st2: data_out=1'b1;

st3: data_out=1'b0;

st4: data_out=1'b1;

default: data_out=1'b0;

endcase

end // outputs

endmodule // Moore

Лістинг програми автомата Мілі

module mealy

(

input wire CLOCK_50,

input wire [1 : 0] SW, //data_in

input wire [0 : 0] KEY, //reset

output wire [17 : 0] LEDR, //data_out

output reg [0 : 0] LEDG, //індикатор тактових сигналів частотою 2 Гц

//7-сегментні індикатори

output reg [7 : 0] HEX0, HEX1, HEX2, HEX3, HEX4, HEX5, HEX6, HEX7

);

//провідник, негативний сигнал якого миттєво переводить автомат в початковий стан

wire reset;

//вхідні дані, які задаються перемикачами SW[0] і SW[1]

wire [1 : 0] data_in;

//вихідні дані, які фіксуються світлодіодом LEDR[17]

reg data_out;

reg [2 : 0] pres_state, next_state, clock;

integer timer, item;

always @(posedge CLOCK_50)

begin

//початок блоку подількика частоти

timer = timer - 1;

if(!timer)

begin

timer = 25000000;

clock = clock ? 0 : 1;

end

//кінець блоку подількика частоти

//вивід на 7-сегментні індикатори:

//...текучого стану автомата

HEX7 = pres_state == 0 ? 7'b100_0000 :

pres_state == 1 ? 7'b111_1001 :

pres_state == 2 ? 7'b010_0100 :

pres_state == 3 ? 7'b011_0000 :

pres_state == 4 ? 7'b001_1001 : 7'b011_1111;

//...наступного стану автомата

HEX0 = next_state == 0 ? 7'b100_0000 :

next_state == 1 ? 7'b111_1001 :

next_state == 2 ? 7'b010_0100 :

next_state == 3 ? 7'b011_0000 :

next_state == 4 ? 7'b001_1001 : 7'b011_1111;

end

//встановлення рівня логічного сигналу

//індикатора тактів 2 Гц

always @(posedge clock)

begin

LEDG[0] = LEDG[0] ? 0 : 1;

end

initial

begin

timer = 25000000;

clock = 1;

pres_state = st0;

//ініціалізація всіх 7-сегментний індикаторів

//в неактивний режим

for(item = 0; item < 8; item = item + 1)

begin

HEX1[item] = 1'b1;

HEX2[item] = 1'b1;

HEX3[item] = 1'b1;

HEX4[item] = 1'b1;

HEX5[item] = 1'b1;

HEX6[item] = 1'b1;

HEX7[item] = 1'b1;

HEX0[item] = 1'b1;

end

end

assign reset = KEY[0];

assign LEDR[17] = data_out;

assign data_in = SW;

parameter st0=3'd0, st1=3'd1, st2=3'd2, st3=3'd3, st4=3'd4;

// FSM register (регістр активного стану автомата)

always @(posedge clock or negedge reset)

begin: statereg

if(!reset)// асинхронне скидання

pres_state = st0;

else

pres_state = next_state;

end // statereg

// FSM combinational block (логіка переходів)

always @(pres_state or data_in)

begin: fsm

case (pres_state)

st0: case(data_in)

2'b00: next_state=st0;

2'b01: next_state=st4;

2'b10: next_state=st1;

2'b11: next_state=st2;

endcase

st1: case(data_in)

2'b00: next_state=st0;

2'b10: next_state=st2;

default: next_state=st1;

endcase

st2: case(data_in)

2'b0x: next_state=st1;

2'b1x: next_state=st3;

endcase

st3: case(data_in)

2'bx1: next_state=st4;

default: next_state=st3;

endcase

st4: case(data_in)

2'b11: next_state=st4;

default: next_state=st0;

endcase

default: next_state=st0;

endcase

end // fsm

// логіка формування виходу автомата Мілі за використанням pres_state w/ data_in

always @(data_in or pres_state)

begin: outputs

case (pres_state)

st0: case(data_in)

2'b00: data_out=1'b0;

default: data_out=1'b1;

endcase

st1: data_out=1'b0;

st2: case(data_in)

2'b0x: data_out=1'b0;

default: data_out=1'b1;

endcase

st3: data_out=1'b1;

st4: case(data_in)

2'b1x: data_out=1'b1;

default: data_out=1'b0;

endcase

default: data_out=1'b0;

endcase

end // outputs

endmodule