题解 | #非整数倍数据位宽转换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 [4-1 :0] cnt ; reg [120-1:0] data_out_tmp; always@(posedge clk, negedge rst_n) begin if(rst_n == 1'b0 || cnt == 15) cnt <= 0; else if(valid_in == 1'b1) cnt <= cnt + 1'b1; end always@(posedge clk, negedge rst_n) begin if(rst_n == 1'b0) data_out_tmp <= 0; else if( valid_in == 1'b1) begin if (cnt <= 4) data_out_tmp[(120-1-cnt*24) -: 24] <= data_in; //tarns1 else if (cnt >= 5 && cnt <= 9 ) data_out_tmp[(120-1-(cnt-5)*24) -: 24] <= data_in; //trans2 else if (cnt >= 10 && cnt <=14) data_out_tmp[(120-1-(cnt-10)*24)-: 24] <= data_in; //trans2 end end // the 2*8/24 always need to be output in high bit on data_out always@(posedge clk, negedge rst_n) begin if(rst_n == 1'b0) data_out <= 0; else if( valid_in == 1'b1 ) begin if(cnt == 5 ) data_out <= {data_out_tmp , data_in[24-1-:8 ]}; if(cnt == 10) data_out <= {data_out_tmp[(120-1-8 ):0] , data_in[24-1-:16]}; if(cnt == 15) data_out <= {data_out_tmp[(120-1-16):0] , data_in }; //else data_out <= 'b0 ; end end always@(posedge clk, negedge rst_n) begin if(rst_n == 1'b0 ) valid_out <= 1'b0; else if(cnt == 5 || cnt == 10 || cnt == 15) valid_out <= 1'b1; else valid_out <= 1'b0; end endmodule
刚开始以为第六个24bit中只要8bit,后面发现这24 bit的每个8bit都要塞在后面的128bit数据中输出出去,所以对于每次的第六个24bit,第一次128 bit里用8bit,第二次用16bit,第三次用24bit,第四次和第一次一样,如此循环