题解 | #非整数倍数据位宽转换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
);
//data_in_old
reg [23:0] data_in_old;
always@(posedge clk or negedge rst_n) begin
if(!rst_n) data_in_old <= 0;
else if(valid_in)
data_in_old <= (data_cnt==4'd5 || data_cnt==4'd10)? data_in : data_in_old;
end
//data_out
reg [127:0] data_out_reg;
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
data_out_reg <= 0;
else if(valid_in)
data_out_reg <= (data_cnt==4'd5)? {data_out_reg[119:0],data_in[23:16]}
: ((data_cnt==4'd10)? {data_in_old[15:0],data_out_reg[95:0],data_in[23:8]}
: ((data_cnt==4'd15)? {data_in_old[7:0],data_out_reg[95:0],data_in}
: {data_out_reg[103:0],data_in}
)
);
end
// assign data_out = (data_cnt==4'd0 || data_cnt==4'd6 || data_cnt==4'd11)? data_out_reg : data_out;
always@(data_out_reg, rst_n) begin
if(!rst_n) data_out = 0;
else if (data_cnt==4'd0 || data_cnt==4'd6 || data_cnt==4'd11)
data_out = data_out_reg;
else data_out = data_out;
end
//cnt
reg [3:0] data_cnt;
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
data_cnt <= 0;
else if(valid_in)
data_cnt <= data_cnt+1;
end
//valid_out
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
valid_out <= 0;
else if ((data_cnt==4'd5 || data_cnt==4'd10 || data_cnt==4'd15) && valid_in)
valid_out <= 1;
else valid_out <= 0;
end
endmodule
对比网友们公布的解题思路,减少了data_lock数据暂存的寄存器数量
