题解 | #非整数倍数据位宽转换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
);
//十六拍出3个数据
reg [3:0]cnt ;
always@(posedge clk or negedge rst_n)begin
if(~rst_n)begin
cnt <= 0;
end
else if(valid_in)begin
if(cnt == 15)begin
cnt = 0;
end
else begin
cnt <= cnt + 1 ;
end
end
end
reg [127:0]data_lock ;
always@(posedge clk or negedge rst_n)begin
if(~rst_n)begin
data_lock <= 0;
end
else begin
data_lock <= valid_in ? {data_lock[103 : 0],data_in} : data_lock ;
end
end
always@(posedge clk or negedge rst_n)begin
if(~rst_n)begin
valid_out <= 0;
end
else begin
valid_out <= (cnt == 5 ||cnt == 10 || cnt == 15) && valid_in;
end
end
always@(posedge clk or negedge rst_n)begin
if(~rst_n)begin
data_out <= 0;
end
else if (cnt == 5)
data_out <= valid_in ? {data_lock[119 : 0] ,data_in[23:16]} : data_out;
else if (cnt == 10)
data_out <= valid_in ? {data_lock[111 : 0] ,data_in[23:8]} : data_out;
else if (cnt == 15)
data_out <= valid_in ? {data_lock[103 : 0] ,data_in[23:0]} : data_out;
else
data_out <= data_out;
end
endmodule
如果按照以前的思路的话,我会存够公倍数384的时候去输出,但是转念一想,其实存够五个的时候和下一次取一点来拼接也够一次输出,处于周期前提还是计数0-15,好控制一点,第三个数据的时候清空。缓存区大小减少到128,其实120也可以,取128是因为是2的整数幂次,习惯了。

