握手处理
- 对于master来说,master发出一个数据,如果数据有效,master就会把传送给slave的valid信号拉高,即表示发出的数据有效!如果slave准备好了,slave就把传送给master的ready信号拉高,告诉master我准备好了,即可以接收数据!所以当master传输的数据有效,且slave也准备好时,数据就会在下一个周期被slave取走,master可以接着传下一个数据。
module handshake(
input clk,
input rst_n,
// as a slave
input valid_i,
input[7:0] data_i,
output ready_o,
// as a master
input ready_i,
output valid_o,
output[7:0] ready_o
);
assign ready_o = ready_i;
reg[7:0] data_tmp;
always@(posedge clk, negedge rst_n)begin
if(!rst_n)
data_tmp <= 8'd0;
else if(valid_i&ready_o)
data_tmp <= data_i;
end
always@(posedge clk, negedge rst_n)begin
if(!rst_n)
valid_o <= 1'b0;
else if(ready_o&valid_i)
valid_o <= 1'b1;
else
valid_o <= 1'b0;
end
assign data_out = valid_o? data_tmp:data_out;
endmodule