该模块的的核心部分在于
if clk'event and clk='1' then
x<=din; y<=x;
end if;
dout<=x and (not y);
这是一个同步整形电路,在进程中,信号不是在改变值之后立即变化的,其他语句使用的还是该信号的旧值(未执行进程时的值),所以假设y=0,那么在时钟的上升沿:
如果:
din="1"小于一个时钟宽:则有x=1,y=0(虽然进程中改变了值,但不会立即被使用);
则有dout=x and (not y)=1 and (not 0)=1;
如果:
din="1"超过一个时钟宽:则有x=1,y=1(前次执行进程后,y的值已经改变为‘1’了);
则有dout=x and (not y)=1 and (not 1)=0;
如果din在时钟周期内出现抖动,则因为不执行进程,所以输出无影响,还是被整成一个时钟宽度,所以不管是长按还是短按你的键,有效高电平宽度等于时钟。