zl程序教程

您现在的位置是:首页 >  其他

当前栏目

数据累加输出

输出数据 累加
2023-09-14 09:10:03 时间

数据累加输出

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

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

`timescale 1ns/1ns

module valid_ready(
	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
);
    
    reg [1:0] cnt;
    always@(posedge clk or negedge  rst_n)
        begin
            if(!rst_n)
                cnt <= 1'b0;
            else if(valid_a == 1'b1 && ready_a == 1'b1)
                cnt <= cnt + 1'b1;
            else
                cnt <= 1'b0;                
        end

    always@(posedge clk or negedge rst_n)
        begin
            if(!rst_n)
                valid_b <= 1'b0;
            else if(cnt == 2'd3 && valid_a == 1'b1 && ready_a == 1'b1)
                valid_b <= 1'b1;
            else if(cnt == 2'd0 && valid_a == 1'b1 && ready_a == 1'b1 && ready_b == 1'b1)
                valid_b <= 1'b0;
        end
    //同时为高或同时为低时,考虑组合逻辑
    assign ready_a = !valid_b | ready_b;


    always@(posedge clk or negedge rst_n)
        begin
            if(!rst_n)
                data_out <= 10'b0;
            else if(cnt == 2'd0 && valid_a == 1'b1 && ready_a == 1'b1 && ready_b == 1'b1)//表示导入第一个数
                data_out <= data_in;
            else if(valid_a == 1'b1 && ready_a)//表示啥时加
                data_out  <= data_out + data_in;
        end
    
endmodule