Лістинг програми автомата мілі
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
Стани автомата:
=0, =1, =2, =3, =4, =5, =6, =7, =8, =9.
Вхідні значення (в двійковій формі):
=000, =001, =010, =011, =100, =101, =110, =111.
Вихідні значення (в двійковій формі):
=000, =001, =010, =011, =100, =101, =110, =111.
Варіанти індивідуальних завдань
Варіант 1
Таблиця переходів автомата
Таблиця виходів автомата
Варіант 2
Таблиця переходів автомата
Таблиця виходів автомата
Варіант 3
Таблиця переходів автомата
Таблиця виходів автомата