VL31 数据累加输出

        

描述

实现串并转换电路,输入端输入单bit数据,每当本模块接收到6个输入数据后,输出端输出拼接后的6bit数据。本模块输入端与上游的采用valid-ready双向握手机制,输出端与下游采用valid-only握手机制。数据拼接时先接收到的数据放到data_b的低位。

电路的接口如下图所示。valid_a用来指示数据输入data_a的有效性,valid_b用来指示数据输出data_b的有效性;ready_a用来指示本模块是否准备好接收上游数据,本模块中一直拉高;clk是时钟信号;rst_n是异步复位信号。

 

理解:

          两组握手信号,分别是与上游的valid_a和ready_a、与下游的valid_b和ready_b; 需要说明的是每组的valid和ready之间没有先后关系,谁先谁后都行。

输出信号有三个:

①ready_a:为高表示我现在没啥事,告诉上游我准备好了,你可以发数据了。为低表示我现在data_out正在发送,你先别给我发新数据。

②valid_b:为高表示给下游说我发数据了。

③data_out:给下游发的数据,配合valid_b,只有valid_b为高时,发送的才是有效数据。

那么分别来处理:

①ready_a: 如果下游ready_b拉高,表示下游可以接收模块输出数据,那么此时ready_a应拉高;同时,如果valid_b为低,表示4个数据还没收完,所以也拉高继续接收。

assign ready_a=ready_b|~valid_b;

②valid_b: 当和上游正常通讯时(即valid_a和ready_a均为高),数据正常接收,但注意计数了4个就得加起来输出,num_cnt == 2'd3时拉高valid_b;而等待下游接收,即当ready_a也拉高表示接收完成,则拉低valid_b,保证只有在四个数之和的时候才拉高。

always@(posedge clk or negedge rst_n)begin
       if(!rst_n)
            valid_b<=0;
        else begin
            if(num_cnt==3&&valid_a&&ready_a)
                valid_b<=1;
            else begin
                if(ready_a)
                    valid_b<=0;
            end
        end
end

③data_out: 同理,当和上游正常通讯时(即valid_a和ready_a均为高),数据正常接收,数据累加,当计数器data_cnt == 2'd0表示需要从头再加,清零,但注意需要等到ready_b拉高,表示下游接收完成才能清空重新累加


    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            data_out<=0;
         else begin
//输出数据归零与valid_b无关,a准备好且有效,b准备好,即可
            if(num_cnt==0&&ready_b&&(valid_a&&ready_a)) 
                data_out<=data_in;
            else begin
                if(valid_a&&ready_a) //a准备好且有效和上游通讯正常
                    data_out<=data_out+data_in; 
            end
        end
    end

代码:

`timescale 1ns / 1ns

module test(
	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
);
    
    
    assign  ready_a=ready_b|~valid_b;
    
    reg [1:0]   num_cnt;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            num_cnt<=0;
        else begin
            if(ready_a&&valid_a)begin
                if(num_cnt==3)
                    num_cnt<=0;
                else
                    num_cnt<=num_cnt+1;
            end
            else
                num_cnt<=num_cnt;
        end
    end
    
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            valid_b<=0;
        else begin
            if(num_cnt==3&&valid_a&&ready_a)
                valid_b<=1;
            else
                if(ready_b&&valid_b)
                valid_b<=0;
        end
    end
    
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            data_out<=0;
         else begin
            if(num_cnt==0&&ready_b&&valid_a&&ready_a) //输出数据归零与valid_b无关,a准备好且有效,b准备好,即可
                data_out<=data_in;
            else begin
                if(valid_a&&ready_a)
                    data_out<=data_out+data_in; 
            end
        end
    end

endmodule

VL671是一款集成了丰富功能的电子元件,它具有广泛的应用领域,如通信、消费电子、工业控制和汽车电子等。VL671数据手册是为了帮助用户更好地了解和使用VL671而编写的技术资料。 VL671数据手册详细记录了VL671的各项技术规格和性能参数,以及操作说明和使用提示。手册的内容主要包括以下几个方面: 1. 产品概述:介绍了VL671的基本特性和产品结构,包括尺寸、引脚功能和电路构成等信息。 2. 电气特性:详细列出了VL671的电气参数,如工作电源电压范围、最大电流和功耗等,以及输入和输出特性,如电压范围、电流容限和开关时间等。 3. 功能描述:说明了VL671的各项功能和工作原理,包括数字信号处理、模拟信号转换和数据缓存等功能,帮助用户了解VL671的具体应用场景和优势。 4. 应用示例:给出了一些实际应用案例,展示了VL671在不同领域的应用方式和效果,以便用户参考和借鉴。 5. 使用注意事项:提供了使用VL671时需要特别注意的事项,如静电防护、温度处理和封装要求等,以确保使用过程中的安全性和稳定性。 总体而言,VL671数据手册是VL671的技术参考指南,用户可以通过学习手册中的内容,更好地了解和应用VL671,从而在自己的项目中发挥VL671的优势和功能。无论是初学者还是有经验的工程师,都可以通过VL671数据手册中的内容得到所需的技术支持和指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值