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

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

 

Таблиця переходів автомата

 

Таблиця виходів автомата