题解 | #非整数倍数据位宽转换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]cnt;
reg [127:0] data;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
cnt<=0;
else if(valid_in)
cnt<=cnt+1;
else if(cnt>=16)
cnt<=0;
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
data<=0;
else if(valid_in)
data<={data[103:0],data_in};
else
data<=data;
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
valid_out<=0;
else if(valid_in&&(cnt==5||cnt==10||cnt==15))
valid_out<=1;
else
valid_out<=0;
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
data_out<=0;
else if(valid_in&cnt==5)
data_out<={data[119:0],data_in[23:16]};//注意 这里前面是低位后面是高位
else if(valid_in&cnt==10)
data_out<={data[112:0],data_in[23:8]};
else if(valid_in&cnt==15)
data_out<={data[119:0],data_in[23:0]};
else
data_out<=data_out;
end
endmodule

