题解 | #数据串转并电路#

数据串转并电路

https://www.nowcoder.com/practice/6134dc3c8d0741d08eb522542913583d

`timescale 1ns/1ns

module s_to_p(
	input 				clk 		,   
	input 				rst_n		,
	input				valid_a		,
	input	 			data_a		,
 
 	output	reg 		ready_a		,
 	output	reg			valid_b		,
	output  reg [5:0] 	data_b
);
	//输入端与上游采用valid_ready双向握手机制
	/*"valid_ready双向握手机制"是一种通讯协议中的握手协议,用于确保通讯的可靠性和正确性。该协议分为两个阶段:
	1. 阶段一:valid 验证。发送方向接收方发送一个"valid"消息,该消息包含了接下来要发送的数据的信息和一些验证信息,接收方收到该消息后,对验证信息进行确认,确认无误后,发送一个"ready"消息,表明接收方准备接收下一条消息。
	2. 阶段二:ready确认。接收方向发送方发送一个"ready"消息,表明接收方已经准备好接收下一条消息。发送方收到该消息后,即可发送下一条消息。
	这样的双向握手协议可以有效地确保通讯的可靠性,如在网络传输中经常使用。*/
	
	//图例中valid_a为1时表示数据正在发送,即发送的数据为(从左至右):101001,111001
	//ready_a为1表示接收方已经准备好接收下一条消息,图例中的具体由rst_n控制


	//输出端与下游采用valid_only握手机制
	/*"valid_only握手机制"是一种通讯协议中的握手协议,用于确保通讯的可靠性和正确性。和双向握手协议不同,该协议只包含一种消息类型:
	阶段一:valid 验证。发送方向接收方发送一个"valid"消息,该消息包含了接下来要发送的数据的信息和一些验证信息,接收方收到该消息后,对验证信息进行确认,确认无误后,即可接收下一条数据。
	该协议和双向握手协议相比,减少了握手次数,可以加快数据传输速度。但是相应地,若数据传输发生错误,接收方无法向发送方发出"ready"消息告知发送方错误的情况,需要另外约定应对措施。*/
	//data_b是6bit,当数据data_a发送了6bit数据时,在下一个上升沿valid_b变为1,同时将这6bit数据传递给data_b。

	always@(posedge clk or negedge rst_n) begin
		if(!rst_n) begin
			ready_a <= 0;
		end
		else begin
			ready_a <= 1;
		end
	end

	reg [5:0] data;
	always @(posedge clk or negedge rst_n) begin
		if(!rst_n) begin
			data <= 6'b000000;
		end
		else if(valid_a & ready_a) begin
			data <= {data_a,data[5:1]};
		end
		else begin
			data <= data;
		end
	end

	reg [2:0] cnt;
	always @(posedge clk or negedge rst_n) begin
		if(!rst_n) begin
			cnt <= 0;
		end
		else if(valid_a & ready_a) begin
			if(cnt>=5) begin
				cnt <= 0;
			end
			else begin
				cnt <= cnt + 1'b1;
			end
		end
		else begin
			cnt <= cnt;
		end
	end

	always@(posedge clk or negedge rst_n) begin
		if(!rst_n) begin
			valid_b <= 0;
			//data_b <= 0;
		end
		else if(cnt == 5) begin
			valid_b <= 1;
			//data_b <= data;
		end
		else begin
			valid_b <= 0;
			//data_b <= data_b;
		end
	end

	always@(posedge clk or negedge rst_n) begin
		if(!rst_n) begin
			data_b <= 0;
		end
		else if(cnt==5 & valid_a) begin
			data_b <= {data_a,data[5:1]};//需要将等于5时的data_a传递给data_b
		end
		else begin
			data_b <= data_b;
		end
	end





		




endmodule

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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