数据累加输出
题目描述
实现串行输入数据累加输出,输入端输入8bit数据,每当模块接收到4个输入数据后,输出端输出4个接收到数据的累加结果。输入端和输出端与上下游的交互采用valid-ready双向握手机制。要求上下游均能满速传输时,数据传输无气泡,不能由于本模块的设计原因产生额外的性能损失。
电路的接口如下图所示。valid_a用来指示数据输入data_in的有效性,valid_b用来指示数据输出data_out的有效性;ready_a用来指示本模块是否准备好接收上游数据,ready_b表示下游是否准备好接收本模块的输出数据;clk是时钟信号;rst_n是异步复位信号。
`timescale 1ns/1nsmodule 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)beginif(!rst_n)cnt <= 1'b0;else if(valid_a == 1'b1 && ready_a == 1'b1)cnt <= cnt + 1'b1;elsecnt <= 1'b0; endalways@(posedge clk or negedge rst_n)beginif(!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)beginif(!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;endendmodule