109 lines
2.9 KiB
Coq
109 lines
2.9 KiB
Coq
|
//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
|
||
|
|