题目
牛客网刷题 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