题解 | #数据串转并电路#
数据串转并电路
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
格力公司福利 303人发布