题解 | #非整数倍数据位宽转换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]count_0_5; reg [127:0] data_out1; always@(posedge clk or negedge rst_n)begin if(!rst_n) count_0_5<=0; else begin if(count_0_5==15&&valid_in==1) count_0_5<=0; if(valid_in==1) count_0_5<=count_0_5+1; end //****************************** end always@(posedge clk or negedge rst_n)begin if(!rst_n) valid_out<=0; else if(count_0_5==5||count_0_5==10||count_0_5==15) valid_out<=1; else valid_out<=0; end reg [127:0]data_out2; always@(posedge clk or negedge rst_n) if(!rst_n)begin data_out1<=0; data_out<=0; data_out2<=0; end else begin if(count_0_5==5&&valid_in==1)begin data_out<={data_out2[119:0],data_in[23:16]}; data_out1<={data_out2[103:0],data_in};end else if(count_0_5==10&&valid_in==1)begin data_out<={data_out2[111:0],data_in[23:8]}; data_out1<={data_out2[103:0],data_in};end else if(count_0_5==15&&valid_in==1)begin data_out<={data_out2[103:0],data_in};end else if(count_0_5==6&&valid_in==1)begin data_out2<={data_out2[87:0],data_out1[15:0],data_in}; end else if(count_0_5==11&&valid_in==1)begin data_out2<={data_out2[95:0],data_out1[7:0],data_in};end else if(valid_in==1)begin data_out2<={data_out2[103:0],data_in};end end endmodule