一种解题思路
`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
);
reg [5:0] data_reg0;
reg [3:0] count;
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
ready_a<=0;
valid_b<=0;
count<='d0;
data_b<='d0;
data_reg0<='d0;
end
else if(valid_a) begin
ready_a<=1; //题干要求准备信号始终拉高
if(count<5) begin //输入数据有效时
count<=count+1;
data_reg0<={data_a,data_reg0[5:1]}; //移位寄存器,进来的数放高位,这样保证先进的数据始终在低位
valid_b<=0;
end
else if(count==5) begin
count<='d0;
valid_b<=1; //根据题干的波形,输出数据有效位只需拉高一个时钟周期
data_b<={data_a,data_reg0[5:1]}; //最后一次数据不用放入寄存器,直接在下一个计数开始时输出即可
end
end
else begin //这个分支用于判断输出数据无效时该怎么处理
ready_a<=1;
data_reg0<=data_reg0; //根据题干的波形,有效数据不会清零,但无效信号下的输入数据不存入寄存器
end
end
endmodule