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

85 lines
2.4 KiB
Verilog

//a module bridge the avalon streaming interfaces with data length from 32 bit to 16 bit
//long to short
//32 bits to 16 bits [31:16] streaming out first and then [15:0]
//ST long to ST short
//tested by stl2sts_tb.v
module stl2sts(
//clock and reset
input wire clk,
input wire rst,
//avalon ST(Streaming) sink: 0 readlatency and 0 readallowence
input wire [31:0] data_in_data, // st.data
output wire data_in_ready, // .ready
input wire data_in_valid, // .valid
input wire [1:0] 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 [15:0] data_out_data, // st.data
input wire data_out_ready, // .ready
output wire data_out_valid, // .valid
output wire data_out_empty, // .empty
output wire data_out_endofpacket, // .endofpacket
output wire data_out_startofpacket // .startofpacket
);
reg[1:0] state;
localparam STATE_IDLE = 2'd0; //waiting for startofpacket
localparam STATE1 = 2'd1; //streaming [31:16]
localparam STATE2 = 2'd3; //streaming [15:0]
localparam STATE_LOCK = 2'd2; //Finishing streaming
assign data_in_ready = (state == STATE2 && data_out_ready)? 1'b1:1'b0;
assign data_out_data = (state == STATE1)? data_in_data[31:16]:(state== STATE2)? data_in_data[15:0]: 16'b0;
assign data_out_valid = (state == STATE1 || state == STATE2)?data_in_valid:1'b0;
assign data_out_empty = 1'b0;
assign data_out_startofpacket = (state == STATE1)? data_in_startofpacket: 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 <= STATE1;
end
STATE1:
begin
if (data_in_valid && data_out_ready)
state <= STATE2;
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