题解 | #非整数倍数据位宽转换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 [4-1  :0]   cnt			;
reg [120-1:0]	data_out_tmp;

always@(posedge clk, negedge rst_n) begin
	if(rst_n == 1'b0 || cnt == 15) cnt <= 0;
	else if(valid_in == 1'b1) cnt <= cnt + 1'b1;
end

always@(posedge clk, negedge rst_n) begin
	if(rst_n == 1'b0) data_out_tmp <= 0;
	else if( valid_in == 1'b1) begin
		if		(cnt <= 4) 	  			data_out_tmp[(120-1-cnt*24)		-: 24] 	<= data_in; //tarns1
		else if	(cnt >= 5 && cnt <= 9 ) data_out_tmp[(120-1-(cnt-5)*24)	-: 24] 	<= data_in; //trans2
		else if	(cnt >= 10 && cnt <=14) data_out_tmp[(120-1-(cnt-10)*24)-: 24] 	<= data_in; //trans2
	end
end

// the 2*8/24 always need to be output in high bit on data_out

always@(posedge clk, negedge rst_n) begin
	if(rst_n == 1'b0) data_out <= 0;
	else if( valid_in == 1'b1 ) begin
		if(cnt == 5 ) data_out <= {data_out_tmp				  		, data_in[24-1-:8 ]};
		if(cnt == 10) data_out <= {data_out_tmp[(120-1-8 ):0]		, data_in[24-1-:16]};
		if(cnt == 15) data_out <= {data_out_tmp[(120-1-16):0]		, data_in          };
		//else data_out <= 'b0 ;
	end
end

always@(posedge clk, negedge rst_n) begin
	if(rst_n == 1'b0 ) 							 valid_out <= 1'b0;
	else if(cnt == 5 || cnt == 10 || cnt == 15)  valid_out <= 1'b1;
	else 			   							 valid_out <= 1'b0;
end

endmodule

刚开始以为第六个24bit中只要8bit,后面发现这24 bit的每个8bit都要塞在后面的128bit数据中输出出去,所以对于每次的第六个24bit,第一次128 bit里用8bit,第二次用16bit,第三次用24bit,第四次和第一次一样,如此循环

全部评论

相关推荐

不愿透露姓名的神秘牛友
今天 12:18
点赞 评论 收藏
分享
06-23 11:28
门头沟学院 Java
牛客91966197...:也有可能是点拒绝的时候自动弹的话术
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务