Загрузка данных


module UserLogic(
    input clk_i,
    input nrst_i,
    input data_i,
    output reg trig_o);
    
    localparam S_IDLE = 2'b00,
               S_ONE  = 2'b01,
               S_ZERO = 2'b10,
               S_DONE = 2'b11;
               
    reg [1:0] state, next_state;
    
    // Регистр состояния
    always @(posedge clk_i or negedge nrst_i) begin
        if (!nrst_i)
            state <= S_IDLE;
        else
            state <= next_state;
    end
    
    // Логика выходов
     always @(posedge clk_i or negedge nrst_i) begin
        if (!nrst_i)begin
            trig_o <= 1'b0;
        end else begin
            if (next_state == S_DONE)
                trig_o = 1'b1;
            else
                trig_o = 1'b0;
        end
    end
    
    // Логика переходов
    always @(*) begin
        case(state)
            S_IDLE: next_state = data_i ? S_ONE : S_IDLE;
            S_ONE:  next_state = data_i ? S_ONE : S_ZERO;
            S_ZERO: next_state = data_i ? S_DONE : S_IDLE;
            S_DONE: next_state = data_i ? S_ONE : S_ZERO;
            default: next_state = S_IDLE;
        endcase
    end
endmodule




`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 04.05.2026 17:23:33
// Design Name: 
// Module Name: UserLogic_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module UserLogic_tb();
    reg clk;
    reg reset;
    reg in_data;
    wire out_data;
    
    UserLogic DUT (
        .clk_i(clk),
        .nrst_i(reset),
        .data_i(in_data),
        .trig_o(out_data));
    always #5 clk = ~clk;
    initial begin
        clk = 0;
        reset = 0;
        in_data = 0;
        
        //Сброс системы
        #20 reset = 1;
        
        #1000 $finish;
    end
    
    always @(posedge clk) begin
        in_data <= $random;
    end
    
    //Мониторинг в консоли
    initial begin
        $monitor("Time=%0t | State=%b | Next_State=%b | In=%b | Out=%b",
                    $time, DUT.state, DUT.next_state, in_data, out_data);
    end
endmodule