`timescale 1ns/1ns
module width_24to128(
input clk ,
input rst_n ,
input valid_in ,
input [23:0] data_in ,
output reg valid_out ,
output reg [127:0] data_out
);
reg [119:0] data_reg;
reg [5:0] cnt;
always@(posedge clk or negedge rst_n)
if(!rst_n)
cnt <= 6'd0;
else if(cnt==6'd15 && valid_in)
cnt <= 6'd0;
else if(valid_in)
cnt <= cnt + 1'b1; //6个数据输出一次,后续5个数据输出一次X2
always@(posedge clk or negedge rst_n)
if(!rst_n)
valid_out <= 1'b0;
else if(cnt==6'd5 && valid_in)
valid_out <= 1'b1;
else if(cnt==6'd10 && valid_in)
valid_out <= 1'b1;
else if(cnt==6'd15 && valid_in)
valid_out <= 1'b1;
else
valid_out <= 1'b0;
always@(posedge clk or negedge rst_n)
if(!rst_n)
data_reg <= 120'd0;
else if(cnt==6'd5 && valid_in)
data_reg <= data_in[15:0];
else if(cnt==6'd10 && valid_in)
data_reg <= data_in[7:0];
else if(cnt==6'd15 && valid_in)
data_reg <= 120'd0;
else if(valid_in)
data_reg <= {data_reg[95:0],data_in};
always@(posedge clk or negedge rst_n)
if(!rst_n)
data_out <= 128'd0;
else if(cnt==6'd5 && valid_in)
data_out <={data_reg,data_in[23:16]};
else if(cnt==6'd10 && valid_in)
data_out <={data_reg[111:0],data_in[23:8]};
else if(cnt==6'd15 && valid_in)
data_out <={data_reg[103:0],data_in};
else
data_out <= data_out;
endmodule