题解 | #非整数倍数据位宽转换8to12#

非整数倍数据位宽转换8to12

https://www.nowcoder.com/practice/11dfedff55fd4c24b7f696bed86190b1

`timescale 1ns/1ns

module width_8to12(
	input 				   clk 		,   
	input 			      rst_n		,
	input				      valid_in	,
	input	[7:0]			   data_in	,
 
 	output  reg			   valid_out,
	output  reg [11:0]   data_out
);
reg [1:0]cnt;
reg [11:0]temp;
always@(posedge clk or negedge rst_n)begin
	if(~rst_n)
	cnt<=0;
	else if(valid_in)
	  if(cnt==2)
	   cnt<=0;
	  else
	  cnt<=cnt+1;
	else
	cnt<=cnt;
end


always@(posedge clk or negedge rst_n)begin
	if(~rst_n)
	temp<=0;
	else if(valid_in)
	temp<={temp[3:0],data_in};
	else 
	temp<=temp;
end


always@(posedge clk or negedge rst_n)begin
	if(~rst_n)
	data_out<=0;
	else if(valid_in)
	  if(cnt==1)
	  data_out<={temp[7:0],data_in[7:4]};
	  else if(cnt==2)
	   data_out<={temp[3:0],data_in};
    else 
	data_out<=data_out;
end

always@(posedge clk or negedge rst_n)begin
	if(~rst_n)
	valid_out<=0;
	else if(valid_in&&(cnt==1||cnt==2))
	   valid_out<=1;
	else
	   valid_out<=0;

end


endmodule

与前一题较为类似,首先计算一下数据的吞吐率,8*3=12*2,因此每进来3个数据,可以输出2次。构造一个temp数组,每次移入8bit,计数·为·1的时候,temp里放的是4个0加第一个数据,计数为2是第一个数据低四位+第二个数据。因此在计数为1的时候,输出为temp低八位(完整的第一个数据)+data_in高四位(第二个数据高四位),cnt为2时因为第二个数据的高四位刚才已经输出了所以移走,此时temp低4位(完整的第一个数据)+data_in,即第三个数据+第二个数据低四位。完成一次输出

全部评论

相关推荐

宇算唯航:目测实缴资本不超100W的小公司
点赞 评论 收藏
分享
06-28 22:48
已编辑
广东金融学院 Java
小浪_Coding:学院本+这俩项目不是buff叠满了嘛
点赞 评论 收藏
分享
废物一个0offer:认真的吗二本本科找人工智能岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-09 13:05
TMD找工作本来就烦,这东西什么素质啊😡
Beeee0927:hr是超雄了,不过也是有道理的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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