题解 | #边沿检测#
边沿检测
http://www.nowcoder.com/practice/fed4247d5ef64ac68c20283ebace11f4
`timescale 1ns/1ns
module edge_detect( //有一个缓慢变化的1bit信号a,实现检测a信号的上升沿给出指示信号rise
//下降沿,给出指示信号down,rise down应为单脉冲信号,在相应边沿出现时的下一个时钟为高,之后恢复到0;
input clk,
input rst_n,
input a,
output reg rise,
output reg down
);
reg a_previous_reg;
always@(posedge clk or negedge rst_n)begin
if(!rst_n) begin
a_previous_reg <= 1'b0;
rise <= 1'b0;
down <= 1'b0;
end
else begin
a_previous_reg <= a; //非阻塞赋值,记录a的前一个时隙的值
if(a&~a_previous_reg)
rise <= 1'b1;
else
rise <= 1'b0;
if(~a&a_previous_reg) //取反属于单目运算符,单目运算符具有最高优先级,这里的&只对一个操作数时也是一元运算符,但是在这里是二元运算符。
down <= 1'b1;
else
down <= 1'b0;
end
end
endmodule
module edge_detect( //有一个缓慢变化的1bit信号a,实现检测a信号的上升沿给出指示信号rise
//下降沿,给出指示信号down,rise down应为单脉冲信号,在相应边沿出现时的下一个时钟为高,之后恢复到0;
input clk,
input rst_n,
input a,
output reg rise,
output reg down
);
reg a_previous_reg;
always@(posedge clk or negedge rst_n)begin
if(!rst_n) begin
a_previous_reg <= 1'b0;
rise <= 1'b0;
down <= 1'b0;
end
else begin
a_previous_reg <= a; //非阻塞赋值,记录a的前一个时隙的值
if(a&~a_previous_reg)
rise <= 1'b1;
else
rise <= 1'b0;
if(~a&a_previous_reg) //取反属于单目运算符,单目运算符具有最高优先级,这里的&只对一个操作数时也是一元运算符,但是在这里是二元运算符。
down <= 1'b1;
else
down <= 1'b0;
end
end
endmodule