HITDAQ/FPGA_firmware/sensor_algo_qsys/sts2stl.v
2024-10-11 14:49:54 +02:00

109 lines
2.9 KiB
Verilog

//a module bridge the avalon streaming interfaces with data length from 16 bit to 32bit
//short to long
//First fill [31:16] and then fill [15:0]
//ST short to ST long
//the number of ST short data_in_data has to be even
//tested by sts2stl_tb.v
module sts2stl(
//clock and reset
input wire clk,
input wire rst,
//avalon ST(Streaming) sink: 0 readlatency and 0 readallowence
input wire [15:0] data_in_data, // st.data
output wire data_in_ready, // .ready
input wire data_in_valid, // .valid
input wire data_in_empty, // .empty
input wire data_in_endofpacket, // .endofpacket
input wire data_in_startofpacket, // .startofpacket
//avalon ST(Streaming) source: 0 readlatency and 0 readallowence
output wire [31:0] data_out_data, // st.data
input wire data_out_ready, // .ready
output wire data_out_valid, // .valid
output wire [1:0] data_out_empty, // .empty
output wire data_out_endofpacket, // .endofpacket
output wire data_out_startofpacket // .startofpacket
);
reg[2:0] state;
localparam STATE_IDLE = 3'd0; //waiting for startofpacket
localparam STATE10 = 3'd1; // collecting [31:16]
localparam STATE20 = 3'd3; // collecting [15:0]
localparam STATE1 = 3'd7;
localparam STATE2 = 3'd6;
localparam STATE_LOCK = 3'd5; //Finishing streaming
reg[15:0] data_buffer; //buffer for the first and then fill [31:16]
assign data_in_ready = ((state == STATE20 || state == STATE2) && data_out_ready)? 1'b1:(state == STATE1 || state == STATE10)? 1'b1: 1'b0;
assign data_out_data = (state == STATE2 || state == STATE20)? {data_buffer, data_in_data}: 32'b0;
assign data_out_valid = (state == STATE2 || state == STATE20)? data_in_valid: 1'b0;
assign data_out_empty = 2'b0;
assign data_out_startofpacket = (state == STATE20)? 1'b1: 1'b0;
assign data_out_endofpacket = (state == STATE2)? data_in_endofpacket: 1'b0;
always @ (posedge clk or posedge rst)
begin
if (rst)
state <= STATE_IDLE;
else case(state)
STATE_IDLE:
begin
if (data_in_startofpacket)
state <= STATE10;
end
STATE10:
begin
if (data_in_valid)
begin
state <= STATE20;
data_buffer <= data_in_data;
end
end
STATE20:
begin
if (data_in_valid && data_out_ready)
begin
if (data_in_endofpacket)
state <= STATE_LOCK;
else
state <= STATE1;
end
end
STATE1:
begin
if (data_in_valid)
begin
state <= STATE2;
data_buffer <= data_in_data;
end
end
STATE2:
begin
if (data_in_valid && data_out_ready)
begin
if (data_in_endofpacket)
state <= STATE_LOCK;
else
state <= STATE1;
end
end
STATE_LOCK:
state <= STATE_IDLE;
default:
state <= STATE_IDLE;
endcase
end
endmodule