检测输入信号的上跳变,偶尔失败

jshzp 2020-05-21 08:32:32
fpga的系统时钟周期为40nS,signal为IO口,输入了999Hz的3.3V幅度方波(没有干扰)。
用下面的代码检测signal信号的上跳变:
module myModule(sysclk,sysreset,signal,led);
//IO口定义
input sysclk; //系统时钟周期40nS
input sysreset; //系统复位,低电平有效
input signal; //999Hz信号
output reg led; //led灯
//内部寄存器
reg flgLow; //低电平标志

//检测信号上跳变
always @(posedge sysclk or negedge sysreset)
begin
if (!sysreset)
begin
led<=0;
flgLow<=0;
end
else
begin
if(!signal)flgLow<=1;
if(signal && flgLow )//被测信号上升沿
begin
led<=~led;//每当检测到信号上跳变时,让led亮灭变化
flgLow<=0;
end
end
end
endmodule

用示波器查看给led的波形发现,绝大多数的信号上跳变可以被检测到,但是有比例大约1~2%的上跳变没有被检测到,
会是什么原因呢?代码有什么问题吗?望指教,谢谢
...全文
434 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
米虫大人 2020-07-23
  • 打赏
  • 举报
回复
看二楼吧,信号干净是一回事,信号去抖同步又是另一回事。
jshzp 2020-05-22
  • 打赏
  • 举报
回复
引用 1 楼 行走的红茶的回复:
搞个去抖试试
信号进FPGA之前,先经过了斯密特触发器。实验室环境,信号很干净
老皮芽子 2020-05-22
  • 打赏
  • 举报
回复
看不出代码的毛病,估计是 signal 是异步的,在sysclk 下信号不是很稳定,你可以用 sysclk 将signal拍一次两次在做判断。 我一般不采用这个方法判断信号的边沿。我将我的方法贴出来供你参考
module myModule(sysclk,sysreset,signal,led);
//IO口定义
input			sysclk;        //系统时钟周期40nS
input			sysreset;  	//系统复位,低电平有效
input			signal;		//999Hz信号
output	reg		led;       //led灯
//内部寄存器
//reg				flgLow;     //低电平标志

reg				signal_r1;
reg				signal_r2;

always @(posedge sysclk or negedge sysreset)
begin
	if (!sysreset)
		begin
			signal_r1	<=0;
			signal_r1	<=0;
		end
	else
		begin
			signal_r1	<= signal;
			signal_r2	<= signal_r1;
		end
end

//检测信号上跳变
always @(posedge sysclk or negedge sysreset)
begin
	if (!sysreset)
		begin
			led<=0;
		end
//	else if(signal_r1 != signal_r2 && signal_r1 == 1'b0)		//判断下降沿
	else if(signal_r1 != signal_r2 && signal_r1 == 1'b1)		//判断上升沿
		begin
			led<=~led;//每当检测到信号上跳变时,让led亮灭变化
		end
end
endmodule
fly 100% 2020-05-22
  • 打赏
  • 举报
回复
搞个去抖试试

6,125

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 硬件设计
社区管理员
  • 硬件设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧