题解 | #非整数倍数据位宽转换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 ;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt <= 4'd0;
end
else if(valid_in)begin
if(cnt == 4'd15)
cnt <= 4'b0;
else
cnt <= cnt + 1'b1;
end
else
cnt <= cnt;
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
valid_out <= 1'b0;
end
else if(valid_in)begin
if(cnt == 'd5 || cnt == 'd10 || cnt == 'd15)
valid_out <= 1'b1;
else
valid_out <= 1'b0;
end
else
valid_out <= 1'b0;
end
reg [119:0] data_out_temp ;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
data_out_temp <= 'd0;
data_out <= 'd0;
end
else if(valid_in && cnt == 'd5)begin
data_out_temp <= {data_out_temp[119:16],data_in[15:0]};
data_out <= {data_out_temp,data_in[23-:8]};
end
else if(valid_in && cnt == 'd10)begin
data_out_temp <= {data_out_temp[119:8],data_in[7:0]};
data_out <= {data_out_temp[111:0],data_in[23-:16]};
end
else if(valid_in && cnt == 'd15)begin
data_out_temp <= {data_out_temp[119:24],data_in};
data_out <= {data_out_temp[103:0],data_in};
end
else if(valid_in)
data_out_temp <= {data_out_temp[95:0],data_in};
end
endmodule
在逻辑关系中,if_else结构下注意判断条件
查看13道真题和解析