1.串转并(串转并就是把1位的输入放到N位reg的最低位,然后N位reg左移一位,在把1位输入放到左移后的reg的最低位,这样循环,就可以得到,以最高位开始传输,最低位传输完成的N位数据了)
输入端输入单bit数据,每当本模块接收到6个输入数据后,输出端输出拼接后的6bit数据。本模块输入端与上游的采用valid-ready双向握手机制,输出端与下游采用valid-only握手机制。数据拼接时先接收到的数据放到data_b的低位。
电路的接口如下图所示。valid_a用来指示数据输入data_a的有效性,valid_b用来指示数据输出data_b的有效性;ready_a用来指示本模块是否准备好接收上游数据
根据时序图可以看出
①valid_a拉高,data_a有效
②收到有效的六个数据后,valid_b拉高一个周期,表示输出数据有效
可以看出 data_a先进来的放在低位,所以是个右移的过程
data_reg[5:0] <= {data_a,data_reg[5:1]};
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 [2:0] cnt;
always@(posedge clk or negedge rst_n)
if(!rst_n)
cnt <= 3'd0;
else if(valid_a && ready_a)
if(cnt == 3'd5)
cnt <= 3'd0;
else
cnt <= cnt + 1'b1;
always@(posedge clk or negedge rst_n)
if(!rst_n)
valid_b <= 1'b0;
else if(cnt == 3'd5)
valid_b <= 1'b1;
else
valid_b <= 1'b0;
always@(posedge clk or negedge rst_n)
if(!rst_n)
data_reg <= 6'd0;
else if(valid_a && ready_a)
data_reg[5:0] <= {data_a,data_reg[5:1]};
2.并转串(把并行的N位数据的最高位给1位输出,然后类似的循环左移)
左移之后取最高位输出