Ответы пользователя по тегу Математика
  • Синтез конечного и структурного автомата

    @parilov
    Решение на 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
    
    Ответ написан