题解 | #数据累加输出#

数据累加输出

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

全部评论

相关推荐

M_bao:换个排版吧哥们,看着费劲
点赞 评论 收藏
分享
10-09 22:05
666 C++
找到工作就狠狠玩CSGO:报联合国演讲,报电子烟设计与制造
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务