`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 ); // 特别要注意ready_a有点坑人,复位的时候是0,复位结束后变为1. 这一点与题目给的时序图不一致 请注意更改。 reg [3:0] COUNT ; reg [5:0] data_reg; // 移位+寄存 always@(posedge clk or negedge rst_n)begin if(!rst_n)begin valid_b <= 1'b0; ready_a <= 1'b0; COUNT <= 'd0 ; data_reg<= 'd0 ; end else if(valid_a == 1'b1)begin ready_a <= 1'b1; if(COUNT == 'd5)begin data_reg <= {data_a,data_reg[5:1]} ; valid_b <= 1'b1 ; COUNT <= 'd0 ; end else begin data_reg <= {data_a,data_reg[5:1]} ; valid_b <= 1'b0 ; COUNT <= COUNT + 1'b1 ; end end else begin data_reg <= data_reg ; valid_b <= 1'b0 ; COUNT <= COUNT ; ready_a <= 1'b1 ; end end always@(*)begin if(!rst_n) data_b = 'd0 ; else if(valid_b == 1'b1) data_b = data_reg ; else data_b = data_b ; end endmodule