题解 | #数据累加输出#
数据累加输出
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 ); reg [2:0] data_cnt; always@(posedge clk or negedge rst_n) begin if(!rst_n) data_cnt <= 3'b0; else begin if(valid_a) begin if(data_cnt == 3'd4) data_cnt <= ready_b ? 3'b1 : data_cnt; else data_cnt <= data_cnt + 1'b1; end else data_cnt <= data_cnt; end end always@(posedge clk or negedge rst_n) begin if(!rst_n) data_out <= 10'b0; else if(valid_a) begin if(data_cnt != 3'd4) data_out <= data_out + data_in; else begin if(ready_b) data_out <= data_in; else data_out <= data_out; end end end always@(*) //观察信号图可知,其所处的长度就是一个信号的长度,而就是第一个的输入的长度,所以可以根据计数器的值进行设定,采用组合逻辑,若是采用时序,会出现一个延时 begin if(!rst_n) valid_b <= 1'b0; else begin if(data_cnt > 3'd3) //这里就能控制其刚好是第一个数据的长度,因为cnt是随着readyb变化的 valid_b <= 1'b1; else valid_b <= 1'b0; end end assign ready_a = data_cnt == 3'd4 ? ready_b : 1'b1; endmodule