• valid ready握手无气泡


    题目

    牛客网刷题 31,数据累加输出
    描述
    实现串行输入数据累加输出,输入端输入8bit数据,每当模块接收到4个输入数据后,输出端输出4个接收到数据的累加结果。输入端和输出端与上下游的交互采用valid-ready双向握手机制。要求上下游均能满速传输时,数据传输无气泡,不能由于本模块的设计原因产生额外的性能损失。

    电路的接口如下图所示。valid_a用来指示数据输入data_in的有效性,valid_b用来指示数据输出data_out的有效性;ready_a用来指示本模块是否准备好接收上游数据,ready_b表示下游是否准备好接收本模块的输出数据;clk是时钟信号;rst_n是异步复位信号。
    在这里插入图片描述
    输入描述:
    input clk ,
    input rst_n ,
    input [7:0] data_in ,
    input valid_a ,
    input ready_b
    输出描述:
    output ready_a ,
    output reg valid_b ,
    output reg [9:0] data_out

    比较纠结的是输出各个信号相互纠缠,关键是理解ready_a信号的产生;

    `timescale 1ns/1ns
    
    module valid_ready(
    	input 				clk 		,   
    	input 				rst_n		,
    	input		[7:0]	data_in		,
    	input				valid_a		,
     	output		 		ready_a		,
    
    	input	 			ready_b		,
     	output	reg			valid_b		,
    	output  reg [9:0] 	data_out
    );
    
        reg[1:0] count;
        //count
        always@(posedge clk or negedge rst_n)
            if(!rst_n)
                count <= 2'd0;
            else if(valid_a && ready_a)
                count <= count+1;            //此处加1自动归0,如果接收5个数,需要给出判断条件
        
        //valid_b 
        //数据有效时1, 为1时检测到ready为1拉0,其它情况0
        always@(posedge clk or negedge rst_n)
        if(!rst_n)
            valid_b <= 1'b0;
        else if(valid_b == 1'b1 && ready_b)    //
            valid_b <= 1'b0;
        else if(valid_b == 1'b0 &&  count==3)    //
            valid_b <= 1'b1;
        
        //ready_a  无气泡体现在此,  组合逻辑判定是否 valid_b 和 !ready_b ,上级传输无气泡
        assign ready_a =  !(valid_b && !ready_b);   
        
        //data 
        //注意需要清累加和
        always@(posedge clk or negedge rst_n)
        if(!rst_n)
            data_out <= 10'd0;
        else if(valid_a && ready_a)
            if(count==0)
                data_out <= data_in;
            else
                data_out <= data_out+ data_in;
     
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
  • 相关阅读:
    史上最全详解微服务技术栈
    教你30分钟快速搭建直播间
    web3.0 会是下一代互联网的风口么?
    spdlog日志库的封装使用
    一种使用wireshark快速分析抓包文件amr音频流的思路方法
    centos 7环境部署百度开源apache doris 1.1
    http2.0/http3.0/rpc
    Android BottomSheetDialogFragment 使用详解,设置圆角、固定高度、默认全屏等
    揭秘Redis的高效失效策略,提升可用性
    SpringSecurity1: spring boot web 样例快速体验
  • 原文地址:https://blog.csdn.net/qq_40011737/article/details/126560810