题解 | #边沿检测#

边沿检测

https://www.nowcoder.com/practice/fed4247d5ef64ac68c20283ebace11f4

注意需要缓存a的值。判断上升沿和下降沿,用缓存的a_temp和a进行比较。

备注:中间出错以为&和&&不一样,其实都可以用。

具体区别:

一、&&和&的区别

1.1 相同点:

&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。

1.2不同点:

1.2.1. &&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式。

例如,对于if(str != null && !str.equals(“”))表达式。

当str为null时,后面的表达式不会执行,所以不会出现NullPointerException

如果将&&改为&,则会抛出NullPointerException异常。

再比如,If(x33 & ++y>0) y会增长,If(x33 && ++y>0)不会增长

1.2.2.&作为为运算时,&是按位与操作,参加运算的两个数据按照二进制位进行“与”运算。

如果两个相应的二进制位都为1,那该位的结果值就是1,否则为0,即0&0=0,0&1=0,1&1=1,1&0=0。

比如:3&5并不等于8,应该按位与,00000011&00000001=00000001。

二、|| 和 | 的区别

2.1 相同点 :当二者表示或的时候,二者都true则true,只有一个为true的时则true。

2.2 不同点:

2.2.1 || 也存在短路的问题,当前者为true时,则不会判断后面的表达(与上面的&&类似)

2.2.2 | 是按位或操作,参加运算的两个数据按照二进制位进行“或”运算。

如果两个相应的二进制位中只要有一个为1,则该位结果就是1,即为0|1=1、1|1=1、1|0=1、0|0=0。

||是逻辑或运算符,直接看意思,a||b,若a、b中有一个为真,则a||b结果为真。

三、~与!的区别

~ 是一个单目运算符,用来对一个二进制位按位取反,即0变成1,1变成0,比如~00001111=11110000。

!是逻辑非运算符,我们还是直接来看他的意思,!a的意思是:若a为真,则!为假,若a为假则!a为真。

参考逻辑运算符与位运算符 - WindSun - 博客园 (cnblogs.com)

`timescale 1ns/1ns
module edge_detect(
	input clk,
	input rst_n,
	input a,
	
	output reg rise,
	output reg down
);
	reg a_temp;
	always@(posedge clk or negedge rst_n)begin
		if(~rst_n)
			a_temp <= 1'b0;
		else a_temp <= a;
	end
	
	always@(posedge clk or negedge rst_n)begin
		if (!rst_n)begin
			rise <= 0;
			down <= 0;
		end
		else if(~a_temp&&a)begin
			rise <= 1;
			down <= 0;
		end
		else if(a_temp&~a)begin
			rise <= 0;
			down <= 1;
		end
		else begin
			rise <= 0;
			down <= 0;
		end
	end
endmodule

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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