题解 | #非整数倍数据位宽转换24to128#
非整数倍数据位宽转换24to128
http://www.nowcoder.com/practice/6312169e30a645bba5d832c7313c64cc
输入data_in是24bit,输出data_out是128bit.
求24与128的最小公倍数24x16=128x3。
所以当有16个输入data_in时,有三个完整的data_out输出。
声明计数器cnt,用于统计输入个数,计数最大值位15。
声明数据寄存器data_reg,用于缓存输入data_in。
cnt | data_out 128bit |
---|---|
5(六个输入data_in) | 24x6=144,144-128=16(剩余) |
10(又记了5个data_in) | 24x5=120+上面剩余16bit,本次剩余8bit |
15(又记了5个data_in) | 24x5=120+上面剩余的8bit |
`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 [127:0] data_reg;
reg [3:0] cnt ;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt <= 4'd0;
end
else if((cnt == 4'd15) && (valid_in))begin
cnt <= 4'd0;
end
else if(valid_in)begin
cnt <= cnt + 1'b1;
end
else begin
cnt <= cnt;
end
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
data_reg <= 128'd0;
end
else if(valid_in)begin
data_reg <= {data_reg[103:0],data_in};
end
else begin
data_reg <= data_reg;
end
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
data_out <= 128'd0;
end
else if((valid_in) && (cnt == 4'd5))begin
data_out <= {data_reg[119:0],data_in[23:16]};
end
else if((valid_in) && (cnt == 4'd10))begin
data_out <= {data_reg[111:0],data_in[23:8]};
end
else if((valid_in) && (cnt == 4'd15))begin
data_out <= {data_reg[103:0],data_in};
end
else begin
data_out <= data_out;
end
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
valid_out <= 1'b0;
end
else if(((cnt == 4'd5) || (cnt == 4'd10) || (cnt == 4'd15)) && (valid_in))begin
valid_out <= 1'b1;
end
else begin
valid_out <= 1'b0;
end
end
endmodule