题解 | #非整数倍数据位宽转换24to128#
非整数倍数据位宽转换24to128
http://www.nowcoder.com/practice/6312169e30a645bba5d832c7313c64cc
24和128的最小公倍数为384,16组data_in可以输出3个128比特数,可以用状态机的思想解决问题。
- S0: 已输入5组data_in,共120bit,需要加上下一个data_in的高8位组成一个128bit数,剩余16位,可进入S1态,此时计数值为5(从0开始);
- S1:已输入16bit+4组data_in,共112bit,需要加上下一个data_in的高16位组成一个128bit数,剩余8位,可进入S2态,此时计数值为5+4+1=10;
- S2:已输入8bit+4组data_in,共104bit,需要加上下一个data_in的全部数组成一个128bit数,剩余0,可进入S0态,此时计数值为10+4+1=15; 另外根据波形,valid_out的似乎只持续一个周期。
`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 [119:0] tmp_data_o;
always @(posedge clk, negedge rst_n) begin
if (!rst_n)
cnt <= 4'd0;
else if(cnt==4'd15)
cnt <= 4'd0;
else if (valid_in)
cnt <= cnt + 1'b1;
else
cnt <= cnt;
end
always @(posedge clk, negedge rst_n) begin
if (!rst_n)
tmp_data_o <= 119'd0;
else if(valid_in) begin
tmp_data_o <= {tmp_data_o[95:0],data_in};
end
else
tmp_data_o <= tmp_data_o;
end
always @(posedge clk, negedge rst_n) begin
if (!rst_n) begin
valid_out <= 1'b0;
data_out <= 128'b0;
end
else if(cnt==4'd5) begin
valid_out <= valid_out?1'b0:1'b1;
data_out <= {tmp_data_o[119:0],data_in[23:16]};
end
else if(cnt==4'd10) begin
valid_out <= valid_out?1'b0:1'b1;
data_out <= {tmp_data_o[111:0],data_in[23:8]};
end
else if(cnt==4'd15) begin
valid_out <= valid_out?1'b0:1'b1;
data_out <= {tmp_data_o[103:0],data_in};
end
else begin
valid_out <= 1'b0;
data_out <= data_out;
end
end
endmodule