普通的cpu中,直接利用sleep之类的语句就可以直接延时去抖动
但是在cpld中,我却碰到了问题,想请教一下各位
问题如下(使用的芯片是altera公司的max7000s系列芯片,芯片型号为7128slc84):
我的程序中,clk3是按键的输入信号
clk2是一个标准的200赫兹输入信号,希望利用这个来计20ms的延时时间
我希望的判断方法:
当接受到第一个clk3=1时,延时20ms,延时以后,再判断此时clk3是否仍为1
如果此时clk3为1,则说明这个脉冲是真脉冲,加counter9
如果此时clk3不为1,则说明这个脉冲只是按键的毛刺,此时延时用的计数器清零,等待下一个clk3=1,再触发延时用的计数器。
关于这部分的程序如下:
……
architecture rtl of clk_div728 is
signal read_key:integer :=0;
signal timer_en:integer :=0 ;
signal counter4:integer:=0;
……
p2: process(clk2)
variable counter25:integer range 0 to 63;
begin
if (clk2'event and clk2='1' and timer_en=1) then
counter4<=counter4+1;
elsif (clk2'event and clk2='1' and timer_en=0) then
counter4<=0;
else
counter4<=counter4;
end if;
end process p2;
-----------------------------------------------------------------
read_key<=1 when counter4=4 else 0;
---------------------------------------------------------------
p3:process(clk3)
begin
if (counter4=4) then
timer_en<=0;
elsif (counter4/=4 and clk3'event and clk3='1') then
timer_en<=1;
else timer_en<=timer_en;
end if;
end process p3;
---------------------------------------------------------------------
p4: process(read_key)
variable counter9:integer range 0 to 16;
begin
if (read_key'event and read_key=1 and clk3='1')then
if (counter9=8)then
counter9:=1;
else
counter9:=counter9+1;
end if;
end if;
case counter9 is
……
end case;
end process p4;
-----------------------------------------------------------------
程序编译的时候通不过,报的错是“unknown problem”
请假一下各位能否指点一二,不甚感激。
另外想特别问一下
这句:
-----------------------------------------------------------------
read_key<=1 when counter4=4 else 0;
---------------------------------------------------------------
单独在进程外执行可以吗,是不是和别的进程是并行的关系?
如果不能这样使用,应该用什么方法?