题解 | #非整数倍数据位宽转换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数据暂存的寄存器数量

全部评论
敏感列表可能少了data_cnt和data_out,或者改成 * 也是正确的
点赞 回复 分享
发布于 2023-01-30 12:59 广东

相关推荐

07-22 13:50
门头沟学院 Java
仁者伍敌:其实能找到就很好了,当然收支能抵
点赞 评论 收藏
分享
06-04 19:53
点赞 评论 收藏
分享
06-25 09:33
厦门大学 Java
球球别拷打俺了:现在日常估计没啥hc了,等到八月多估计就慢慢有了。双九✌🏻不用焦虑的
投递快手等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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