题解 | #数据累加输出#
数据累加输出
https://www.nowcoder.com/practice/956fa4fa03e4441d85262dc1ec46a3bd
`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 ); // 输入 // valid_a: 输入有效 // ready_b: 下游要数据 // 输出 // valid_b: 输出有效,4个数累加完(cnt=3 && valid_a = 1),下游接收没完成(ready_a = 0) // ready_a: 向上游要数据:1)4个数没加完时(valid_b = 0),需要上游持续输出; // 2)加完了,下游要数据(ready_b = 1),赶紧拉高 // data_out: 累加上游给的数据,条件是上游给的数据有效,且我想要(valid_a = 1 && ready_a = 1) // 中间量 // cnt: 数据有效(valid_a = 1)且我要数据(ready_a = 1)的时候才循环加1,否则保持 // cnt reg [1:0] cnt; always @(posedge clk, negedge rst_n) begin if(!rst_n) begin cnt <= 0; end else begin cnt <= (valid_a && ready_a)? cnt + 1 : cnt; end end // ready_a assign ready_a = (~valid_b | ready_b); // valid_b always @(posedge clk, negedge rst_n) begin if(!rst_n) begin valid_b <= 0; end else if((cnt == 3 && valid_a) | (ready_a == 0)) begin valid_b <= 1; end else begin valid_b <= 0; end end // accumulate always @(posedge clk, negedge rst_n) begin if(!rst_n) begin data_out <= 0; end else begin data_out <= ~(valid_a && ready_a)? data_out : (cnt == 0)? data_in : data_out + data_in; end end endmodule