计数计数模块设计遇到的问题

2012年06月13日 08:19    发布者:woshaogang123
我正在用CPLD设计一个计时计数模块:按下reset清零,按一下start开始计时,按一下stop停止计时把结果传给单片机,现在就是控制不了stop,就是仿真时start为高电平1时计数器工作,为0时停止计数,stop控制不了,请问应该怎样才能控制呢

网友评论

asyou 2012年06月13日
最好不用电平控制,而用沿控制!检测start,stop的沿!
woshaogang123 2012年06月13日
但是在一个进程中好像不能有超过两个以上的边沿检测
szaeia 2012年06月13日
最好不用电平控制,而用沿控制!检测start,stop的沿!
汽车电子
woshaogang123 2012年06月14日
程序是
entity count  is
   port(
            clk,start,stop,reset : in std_logic;
             cout :out  std_logic_vector(7 downto 0)
          );
end count;
architecture behav of count
begin
process(clk,start,stop,reset)
  variable c : std_logic_vector(7 downto 0);
begin
if reset='1' then
c:="00000000";
if clk'event and clk='1'  then
if start'event and start='1'  then
c:=c+1
elsif stop'event and stop='1'  then
cout<=c;
end if;
end if;
cout<=c;
end process;
end behav
编译后出现错误:can't infer register for "c" at count.vhd,because it does not hold its value outside the clock edge
asyou 2012年06月14日
回复5楼woshaogang123:

你不能这样检测沿,用两个D触发器缓存,当前一个信号为高,后一个信号为低的时候就是下降沿到来了!
woshaogang123 2012年06月15日
我做的是一个激光测距仪,用CPLD作时间间隔测量,就是测量激光从发射出去到碰到目标反射回来的时间,start是一PWM信号,作启动计数器的开门信号.stop就是回波信号,作关闭计数器的关门信号,我的思路是检测start信号的第一个上升沿作开门信号,stop的第一个上升沿作关门信号
asyou 2012年06月15日
回复7楼woshaogang123:

这很简单啊!你先搞清楚怎么检测信号的上升沿吧,用一个参考时钟加两个D触发器就可以了!
woshaogang123 2012年06月15日
还是不明白,两个D触发器怎么用啊,能举个例子吗
joywyc 2012年06月17日
主要的问题不在于是电平触发还是边沿触发,问题是按键的动作会引起触点一连串的电平跳变。按一次机械触点,跳变大约持续十几毫秒时间,相当于许多个随机的高低电平或上下边沿的变化。在一次按动中,是无法确定最后一次被取到的是高还是低、上沿还是下沿。特别是对CPLD等高速逻辑电路,要真正处理掉这一问题,就要采取延时加多点采样判别技术,来消除手动启停控制的准确性问题。
klhchz 2012年07月08日
同意10楼意见,此类现象在别的场合也经常遇到。