通用型非整数倍数据位宽转换如下:
`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