`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 [4:0]cnt;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt<=0;
else if(valid_in)
begin if(cnt==15)
begin cnt<=0; end
else
begin cnt<=cnt+1; end end
end
reg [127:0] buff;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
buff<=0;
data_out<=0;
end
else if(valid_in)begin
if(cnt==5)
begin buff[127:112]<=data_in[15:0];
data_out<={buff[127:8],data_in[23:16]}; end
if(cnt==10)
begin buff[127:120]<=data_in[7:0];
data_out<={buff[127:16],data_in[23:8]}; end
if(cnt==15)
begin
data_out<={buff[127:24],data_in}; end
if(cnt==0)
buff[127:104]<=data_in;
if(cnt==1)
buff[103:80]<=data_in;
if(cnt==2)
buff[79:56]<=data_in;
if(cnt==3)
buff[55:32]<=data_in;
if(cnt==4)
buff[31:8]<=data_in;
if(cnt==6)
buff[111:88]<=data_in;
if(cnt==7)
buff[87:64]<=data_in;
if(cnt==8)
buff[63:40]<=data_in;
if(cnt==9)
buff[39:16]<=data_in;
if(cnt==11)
buff[119:96]<=data_in;
if(cnt==12)
buff[95:72]<=data_in;
if(cnt==13)
buff[71:48]<=data_in;
if(cnt==14)
buff[47:24]<=data_in;
end
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
valid_out<=0;
else if(valid_in&((cnt==5)|(cnt==10)|(cnt==15)))
valid_out<=1;
else valid_out<=0;
end
endmodule