牛客刷题——串并转换

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位输出,然后类似的循环左移)

左移之后取最高位输出

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值