Решение на verilog. FSM Миля. Нажатие кнопки до 6 тактов — короткое. Больше — длинное.
Сделал проверку, что нажатие более 10 тактов сразу считаем длительным.
Не сделал — возврат КА и выходов в исходное состояние, защиты от дребезга в сигнале кнопки,
менее громоздкое вычисление assign short и assign long без сравнений всего count.
FSM Mealy`timescale 1ns / 1ps
module fsm_mili(
input clk, input button, input reset,
output short,//=1 if in fsm recd short (1..5 tick) button press
output long//=1 if in fsm recd long (6..10 tick) button press
);
parameter st_start = 2'b00;
parameter st_press_on = 2'b01;
parameter st_finish = 2'b11;
reg [1:0] state = st_start;
reg [3:0] count = 4'h0;
// inc count if posedge clk and button press
// reset count if end cycle
always@(posedge clk)
if (state == st_press_on) count = count + 1;
else if (state == st_start) count = 4'h0;
always@(posedge clk)
if (reset) begin state <= st_start;
end
else
case (state)
st_start : begin
// wait button press
if (button == 1'b1) state <= st_press_on;
else state <= st_start;
end
// wait button press_off OR (count clk when button press) = 10
st_press_on : begin
if (button == 1'b0 || count == 4'hA) state <= st_finish;
else state <= st_press_on;
end
// comment condition for go fsm to start state
// now fsm in one cycle, else fsm must be infinite
st_finish : begin
//state <= st_start;
end
default : begin
state <= st_start;
end
endcase
assign short = (state == st_finish) & (count < 4'h6);
assign long = (state == st_finish) & (count >= 4'h6);
endmodule