题解 | #非整数倍数据位宽转换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] count1;
reg [23:0] mid_reg1;
reg [23:0] mid_reg2;
reg [23:0] mid_reg3;
reg [23:0] mid_reg4;
reg [23:0] mid_reg5;
reg [23:0] mid_reg6;
reg [23:0] mid_reg7;
reg [23:0] mid_reg8;
reg [23:0] mid_reg9;
reg [23:0] mid_reg10;
reg [23:0] mid_reg11;
reg [23:0] mid_reg12;
reg [23:0] mid_reg13;
reg [23:0] mid_reg14;
reg [23:0] mid_reg15;
reg [23:0] mid_reg16;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
count1 <= 3'b0;
end
else begin
if(valid_in)begin
count1 <= count1 + 1;
end
else begin
count1 <= count1;
end
end
end
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
valid_out <= 1'b0;
end
else begin
if((count1 == 5 || count1 == 10 || count1 == 15) && valid_in)begin
valid_out <= 1'b1;
end
else begin
valid_out <= 1'b0;
end
end
end
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
mid_reg1 <= 24'b0;
mid_reg2 <= 24'b0;
mid_reg3 <= 24'b0;
mid_reg4 <= 24'b0;
mid_reg5 <= 24'b0;
mid_reg6 <= 24'b0;
mid_reg7 <= 24'b0;
mid_reg8 <= 24'b0;
mid_reg9 <= 24'b0;
mid_reg10 <= 24'b0;
mid_reg11 <= 24'b0;
mid_reg12 <= 24'b0;
mid_reg13 <= 24'b0;
mid_reg14 <= 24'b0;
mid_reg15 <= 24'b0;
mid_reg16 <= 24'b0;
end
else begin
if(valid_in)begin
case(count1)
4'b0000:mid_reg1 <= data_in;
4'b0001:mid_reg2 <= data_in;
4'b0010:mid_reg3 <= data_in;
4'b0011:mid_reg4 <= data_in;
4'b0100:mid_reg5 <= data_in;
4'b0101:mid_reg6 <= data_in;
4'b0110:mid_reg7 <= data_in;
4'b0111:mid_reg8 <= data_in;
4'b1000:mid_reg9 <= data_in;
4'b1001:mid_reg10 <= data_in;
4'b1010:mid_reg11 <= data_in;
4'b1011:mid_reg12 <= data_in;
4'b1100:mid_reg13 <= data_in;
4'b1101:mid_reg14 <= data_in;
4'b1110:mid_reg15 <= data_in;
4'b1111:mid_reg16 <= data_in;
endcase
end
else begin
mid_reg1 <= mid_reg1;
mid_reg2 <= mid_reg2;
mid_reg3 <= mid_reg3;
mid_reg4 <= mid_reg4;
mid_reg5 <= mid_reg5;
mid_reg6 <= mid_reg6;
mid_reg7 <= mid_reg7;
mid_reg8 <= mid_reg8;
mid_reg9 <= mid_reg9;
mid_reg10 <= mid_reg10;
mid_reg11 <= mid_reg11;
mid_reg12 <= mid_reg12;
mid_reg13 <= mid_reg13;
mid_reg14 <= mid_reg14;
mid_reg15 <= mid_reg15;
mid_reg16 <= mid_reg16;
end
end
end
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
data_out <= 128'b0;
end
else begin
case(count1)
4'b0101:begin
data_out <= {mid_reg1, mid_reg2, mid_reg3, mid_reg4, mid_reg5, data_in[23:16]};
end
4'b1010:begin
data_out <= {mid_reg6[15:0], mid_reg7, mid_reg8, mid_reg9, mid_reg10, data_in[23:8]};
end
4'b1111:begin
data_out <= {mid_reg11[7:0], mid_reg12, mid_reg13, mid_reg14, mid_reg15, data_in};
end
default:begin
data_out <= data_out;
end
endcase
end
end
endmodule
