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

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

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

`timescale 1ns/1ns

//串转并的方式有很多种:
//(1)单比特转多比特。这个比较容易,只需使用移位寄存器寄存,然后计数,在相同同的计数值输出结果即可。

//(2)多比特转多比特有两种可能,一种可能输出是输入的倍数,另一种可能是输出不是输入的倍数。

//(3)输出是输入的倍数,只需使用移位寄存器寄存,然后计数,在相同的计数值输出结果。

//(4)输出不是输入的倍数,使用移位寄存器寄存,找到输入和输出的最小公倍数,然后计数,在不同的计数值输出结果。

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
);

// 8bit to 12bit ; 8*3==12*2
reg[1:0 ]   cnt;
reg[11:0]	data_reg;

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)
		data_reg <=0;
	else if(valid_in)
			data_reg <= {data_reg[11:8],data_in};
	else
		data_reg <= data_reg;

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

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

endmodule

全部评论

相关推荐

美团 后端开发 总包n(15%是股票)
点赞 评论 收藏
分享
ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
尊嘟假嘟点击就送:加v细说,问题很大
点赞 评论 收藏
分享
评论
点赞
2
分享
牛客网
牛客企业服务