题解 | #非整数倍数据位宽转换24to128#
非整数倍数据位宽转换24to128
https://www.nowcoder.com/practice/6312169e30a645bba5d832c7313c64cc
`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 [3:0] cnt_10;
reg [23:0] men[15:0];
integer i;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt_10 <= 0;
for(i=0;i<=15;i=i+1)begin
men[i] <= 0;
end
end
else if(valid_in)begin
men[cnt_10] <= data_in;
cnt_10 <= cnt_10 + 1'b1;
end
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
valid_out <= 0;
data_out <= 0;
end
if(valid_in)begin
case(cnt_10)
4'd5 : begin
valid_out <= 1;
// data_out <= {men[0],men[1],men[2],men[3],men[4],men[5][23:16]};
data_out <= {men[0],men[1],men[2],men[3],men[4],data_in[23:16]};
end
4'd10 : begin
valid_out <= 1;
// data_out <= {men[5][15:0],men[6],men[7],men[8],men[9],men[10][23:8]};
data_out <= {men[5][15:0],men[6],men[7],men[8],men[9],data_in[23:8]};
end
4'd15 : begin
valid_out <= 1;
// data_out <= {men[10][7:0],men[11],men[12],men[13],men[14],men[15]};
data_out <= {men[10][7:0],men[11],men[12],men[13],men[14],data_in};
end
default : begin valid_out <= 0; end
endcase
end
else begin
valid_out <= 0;
end
end
*/
reg [127:0] data_out_temp;
reg [3:0] cnt_10;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt_10 <= 0;
data_out_temp <= 0;
end
else if(valid_in)begin
data_out_temp <= {data_out_temp[103:0],data_in};
cnt_10 <= cnt_10 + 1'b1;
end
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
valid_out <= 0;
data_out <= 0;
end
if(valid_in)begin
case(cnt_10)
4'd5 : begin
valid_out <= 1;
data_out <= {data_out_temp[119:0],data_in[23:16]};
end
4'd10 : begin
valid_out <= 1;
data_out <= {data_out_temp[111:0],data_in[23:8]};
end
4'd15 : begin
valid_out <= 1;
data_out <= {data_out_temp[103:0],data_in};
end
default : begin valid_out <= 0; end
endcase
end
else begin
valid_out <= 0;
end
end
endmodule
海康威视公司福利 1137人发布