题解 | #数据累加输出#

数据累加输出

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

全部评论

相关推荐

10-13 22:56
门头沟学院 C++
rt,鼠鼠的浪潮网签明天过期,鼠鼠是山东人,好像自己也能接受。之前的面试大厂基本挂干净了,剩下小米二面后在泡,问了下面试官没有挂,但要泡。还有海信似乎也通过了,不过在深圳,鼠鼠也不是很想去。其它还有一些公司应该陆陆续续还有一些面试,现在有些纠结是直接签了还是再等再面呢?大佬们能不能给鼠鼠提一些意见,万分感谢!!!
牛客78696106...:浪潮可不是开摆,当初我还是开发的时候我组长跟我说他们组有段时间天天1,2点走,早上5点就来,全组肝出来心肌炎,浪潮挣钱省立花可不是说说,当然也看部门,但是浪潮普遍就那dio样,而且你算下时薪就知道不高,没事也是9点半走,不然算你旷工
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
10-10 01:10
已编辑
深圳大学 测试开发
面了100年面试不知...:六月到九月,四个项目一个实习,是魔丸吗
投了多少份简历才上岸
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务