首页 > 其他分享 >牛客题目进阶7:数据累加输出

牛客题目进阶7:数据累加输出

时间:2023-01-05 22:45:30浏览次数:40  
标签:进阶 握手 累加 牛客 valid ready input 接收数据 data

代码头ready_a声明为了wire型,所以是暗示用组合逻辑。

对于三个输出信号,分别来看

ready_a:用来和valid_a握手,表示当前模块可以从上游模块接收数据进行累加。所以就要判断在什么情况下,当前模块是可以接收数据的。

当输入数据不足四个时,此时可以继续接收数据,标识信号是valid_b还未拉高。

当输入数据已经四个时,就要看下游是否准备好接收结果,如果下游ready_b为高,则表示结果可以送出,当前模块可以接收数据,标识信号是ready_b为高。

valid_b:在输入第四个数并且握成功的下一拍拉高,在与ready_b握手成功后拉低。

data_out:每次握手成功,上次结果与当前输入进行相加。注意在valid_b与ready_b握手成功后,data_out要接收新的数据,此时需判断valid_a与ready_a是否握手成功。

由于valid_b明确性的要在第四个数输入后就拉高,握手成功后才拉低,因此需要一个计数器进行指示第四个数据输入

`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[1:0] state_cnt ;

always @(posedge clk or negedge rst_n) begin
	if(!rst_n)
		state_cnt <= 'd0 ;
	else if(valid_a & ready_a )
		state_cnt <= state_cnt + 1 ;
	else
		state_cnt <= state_cnt ;
end

always @(posedge clk or negedge rst_n) begin
	if(!rst_n) 
		data_out <= 'd0 ;
	else if(valid_a & ready_a & valid_b & ready_b)
		data_out <= data_in ;
	else if(valid_a & ready_a)
		data_out <= data_in + data_out ;
	else
		data_out <= data_out ;
end

assign ready_a = (ready_b) | (!valid_b);

always @(posedge clk or negedge rst_n) begin
	if(!rst_n)
		valid_b <= 1'b0 ;
	else if(state_cnt == 2'd3 & valid_a & ready_a)
		valid_b <= 1'b1 ;
	else if(valid_b & ready_b)
		valid_b <= 1'b0 ;
	else
		valid_b <= valid_b ;
end


endmodule

标签:进阶,握手,累加,牛客,valid,ready,input,接收数据,data
From: https://www.cnblogs.com/icwangpu/p/17029040.html

相关文章

  • 牛客进阶题目6:数据串并转换电路
    接收6个bit之后下一拍输出一个6bit宽的data,注意此时如果valid_a拉高,也要接收新进来的数据这里用移位寄存器计数不太行,不太好让data_b在新数据出来前保持不变,虽然功能一样,......
  • 手工测试如何进阶中高级软件测试工程师?
    在软件测试行业,也有简单的测试,譬如手工测试,这种测试基本上没有什么技术水平,学1—2个月基本上就能做简单的测试工作,但是这类测试薪资待遇比较低,也没什么发展前景,随着互......
  • 《Kubernetes Operator 开发进阶》- 作者絮絮叨
    今天聊啥昨晚在京东上试着搜索关键字“KubernetesOperator开发进阶”,看到我的书终于上架了,百感交集。(没有老泪纵横。你以为是我没有眼眶湿润?不,我说的是我没有老!)这本书......
  • Netty进阶
    1.Netty问题TCP协议都存在着黏包和半包问题,但是UDP没有1.粘包现象发送方分10次发送,接收方一次接受了10次发送的消息2.半包现象调整服务器的接受缓冲区大小(调小)半包......
  • 牛客进阶题目5:信号发生器
    这个题目有点离谱,题里什么也没给,需要去题解中才知道方波、锯齿波和三角波最大值都为20,方波周期20,锯齿波周期21,三角波周期40对三种波形具体分析方波:周期为20且最大值也为2......
  • 牛客小白月赛 64 D题
    https://ac.nowcoder.com/acm/problem/247496 1#include<bits/stdc++.h>2usingnamespacestd;34constintN=3e5+10;56typedeflonglongLL;......
  • 牛客进阶题目4:输入序列不连续的序列检测
    跟上一题基本类似,多了个valid判定当前输入数据是否有效`timescale1ns/1nsmodulesequence_detect( inputclk, inputrst_n, inputdata, inputdata_valid, outpu......
  • 将0.1累加100次也得不到10
    首先,我们来看一个计算机运算错误(无法得到正确结果)的例子。下图是将0.1累加100次,然后将结果输出到显示器上的C语言程序。 运行过程是这样的:首先把0赋值给变量sum,然后......
  • 牛客小白月赛 64 C题
    https://ac.nowcoder.com/acm/contest/50044/C 1#include<bits/stdc++.h>2usingnamespacestd;3//贪心构造我认为思路是其一,然后模拟这个过程还是比较重......
  • 牛客进阶题目3:不重叠序列检测
    还是移位寄存器,加一个计数器来限制周期题目要求状态机,懒得画了,移位寄存器可根据时序图直接写`timescale1ns/1nsmodulesequence_detect( inputclk, inputrst_n, i......