查看: 4407|回复: 10

[提问] 计数计数模块设计遇到的问题

[复制链接]
发表于 2012-6-13 08:19:05 | 显示全部楼层 |阅读模式
关键词: 计数
我正在用CPLD设计一个计时计数模块:按下reset清零,按一下start开始计时,按一下stop停止计时把结果传给单片机,现在就是控制不了stop,就是仿真时start为高电平1时计数器工作,为0时停止计数,stop控制不了,请问应该怎样才能控制呢
发表于 2012-6-13 11:05:24 | 显示全部楼层
最好不用电平控制,而用沿控制!检测start,stop的沿!
 楼主| 发表于 2012-6-13 15:02:48 | 显示全部楼层
但是在一个进程中好像不能有超过两个以上的边沿检测
发表于 2012-6-13 15:37:25 | 显示全部楼层
最好不用电平控制,而用沿控制!检测start,stop的沿!
汽车电子
 楼主| 发表于 2012-6-14 10:19:43 | 显示全部楼层
程序是
entity count  is
   port(
            clk,start,stop,reset : in std_logic;
             cout ut  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[0]" at count.vhd,because it does not hold its value outside the clock edge
发表于 2012-6-14 16:33:11 | 显示全部楼层
回复5楼woshaogang123

你不能这样检测沿,用两个D触发器缓存,当前一个信号为高,后一个信号为低的时候就是下降沿到来了!
 楼主| 发表于 2012-6-15 09:50:14 | 显示全部楼层
我做的是一个激光测距仪,用CPLD作时间间隔测量,就是测量激光从发射出去到碰到目标反射回来的时间,start是一PWM信号,作启动计数器的开门信号.stop就是回波信号,作关闭计数器的关门信号,我的思路是检测start信号的第一个上升沿作开门信号,stop的第一个上升沿作关门信号
发表于 2012-6-15 11:59:18 | 显示全部楼层
回复7楼woshaogang123

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

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表