题解 | #数据串转并电路#
数据串转并电路
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