`define STATE_IDLE 2'd0 `define STATE_LENGTH 2'd1 `define STATE_READ1 2'd2 `define STATE_READ2 2'd3 module READER (input clk, input clk_enable, input [7:0] uart_rx_byte, input uart_rx_signal, input uart_is_receiving, output reg active, output reg ram_we, output [12:0] ram_addr, output reg [15:0] ram_di); reg [1:0] state = `STATE_IDLE; reg [12:0] bytes_left = 0; reg [12:0] current_index = 0; assign ram_addr = current_index; always @ (posedge clk) if (clk_enable) begin if(!uart_rx_signal) ram_we <= 0; case(state) `STATE_IDLE: begin if(uart_rx_signal) begin bytes_left[12:8] <= uart_rx_byte[4:0]; bytes_left[7:0] <= 0; current_index <= -1; active <= 1; state <= `STATE_LENGTH; end else active <= 0; end `STATE_LENGTH: begin if(uart_rx_signal) begin bytes_left[7:0] <= uart_rx_byte; state <= `STATE_READ1; end end `STATE_READ1: begin if(uart_rx_signal) begin ram_di[15:8] <= uart_rx_byte; current_index <= current_index + 1; bytes_left <= bytes_left - 1; state <= `STATE_READ2; end end `STATE_READ2: begin if(uart_rx_signal) begin ram_di[7:0] <= uart_rx_byte; ram_we <= 1; state <= |bytes_left ? `STATE_READ1 : `STATE_IDLE; end end endcase end endmodule