通用型非整数倍数据位宽转换如下:

`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
);
    parameter DATA_WIDTH_I = 24,
              DATA_WIDTH_O = 128,
              NUM_MAX_BUF = DATA_WIDTH_O / DATA_WIDTH_I;
   
    reg  [NUM_MAX_BUF*DATA_WIDTH_I  -1 :0] data_r;
    wire [DATA_WIDTH_I+DATA_WIDTH_O -1 :0] data_w;
    reg  [7:0] cnt_r; // width: log2(DATA_WIDTH_I+DATA_WIDTH_O)
    wire [7:0] cnt_w;
    wire [7:0] cnt_clip_w;
    wire valid_out_w;
   
    assign cnt_w = valid_in ? cnt_r + DATA_WIDTH_I : cnt_r;
    assign valid_out_w = cnt_w >= DATA_WIDTH_O;
    assign cnt_clip_w = valid_out_w ? cnt_w - DATA_WIDTH_O : cnt_w;
    assign data_w = {data_r, data_in};
    
    always @(posedge clk or negedge rst_n) begin
        if (~rst_n) begin
            valid_out <= 'd0;
            data_out <= 'd0;
            data_r <= 'd0;
            cnt_r <= 'd0 ;
        end
        else begin
            valid_out <= valid_out_w;
            if (valid_in) begin
            cnt_r <= cnt_clip_w;
            data_r <= data_w;
            if (valid_out_w)
                data_out <= data_w [cnt_clip_w +:DATA_WIDTH_O];
            end
        end
    end
    
    
    
endmodule