在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4651|回复: 11

计数器误差

[复制链接]
发表于 2004-7-9 11:22:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
SPATREN 2  XC2S50    ISE6。2
异步置位计数器 长时间计数,存在多一个或少一个的现象。
1  怀疑毛刺,采用格雷码,效果一样。
2  同步置位计数器 ,效果一样。
3  干扰吗?
还有什么方法,请提供,万分感激!!!
第一次做FPGA,难道FPGA这复杂??
 楼主| 发表于 2004-7-9 11:29:11 | 显示全部楼层

计数器误差

代码如下:(太简单了)
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity XC2S151 is
Port (
    CLK:IN STD_LOGIC;
    LOAD :IN STD_LOGIC;
    PLUSEX: OUT STD_LOGIC
     );
end XC2S151;
architecture Behavioral of XC2S151 is
    SIGNAL BUFY2,SAVE3:STD_LOGIC_VECTOR (15 DOWNTO 0);--
    SIGNAL XAXA3,CLK1,RST,RST1,RST2:STD_LOGIC;
    SIGNAL QN:STD_LOGIC_VECTOR (3 DOWNTO 0);--
begin
PROCESS(CLK,RST)          --CLK  1M
  BEGIN
  IF RST='1'THEN
     QN<="0000";
  ELSIF CLK' EVENT AND CLK='1' THEN
     QN<=QN+1;
  END IF;
END PROCESS;
    RST<='1' WHEN QN=10 ELSE
        '0';
     CLK1<=QN(2);
   
PLUSEX<=XAXA3;
  PROCESS(CLK1,LOAD)        --CLK1   100K     LOAD外部随机信号
  BEGIN
        IF SAVE3="0000000000000000" THEN
IF LOAD='1' THEN
    SAVE3<="0000000000001100
           END IF;
        ELSIF CLK1' EVENT AND CLK1='1' THEN
  IF SAVE3/="0000000000000000"  THEN
        CASE SAVE3 IS
WHEN "0000000000001100"=>
                SAVE3<="0000000000000100";
                     WHEN "0000000000000100"=>
     SAVE3<="0000000000000101";
WHEN "0000000000000101"=>
     SAVE3<="0000000000000111";
WHEN "0000000000000111"=>
    SAVE3<="0000000000000110";
WHEN "0000000000000110"=>
    SAVE3<="0000000000000010";
WHEN "0000000000000010"=>
   SAVE3<="0000000000000011";
WHEN "0000000000000011"=>
   SAVE3<="0000000000000001";
           WHEN "0000000000000001"=>
   SAVE3<="0000000000000000";
                     WHEN OTHERS=>
   SAVE3<="0000000000000000";
            END CASE;
    XAXA3<=NOT XAXA3;
     END IF;
   END IF;
  END PROCESS;

end Behavioral;

发表于 2004-7-9 12:02:43 | 显示全部楼层

计数器误差

PROCESS(CLK)          --CLK  1M
BEGIN
IF CLK' EVENT AND CLK='1' THEN
    if qn=9 then
        qn = 0;
    else
        QN<=QN+1;
    end if;
END IF;
END PROCESS;

发表于 2004-7-9 12:03:18 | 显示全部楼层

计数器误差

没有全局复位信号?
 楼主| 发表于 2004-7-9 14:45:38 | 显示全部楼层

计数器误差

PROCESS(CLK)          --CLK  1M
BEGIN
IF CLK' EVENT AND CLK='1' THEN
   if qn=9 then
       qn = 0;
   else
       QN<=QN+1;
   end if;
END IF;
END PROCESS;
————————————————
这个程序有两个计数器,上面的用来分频。把1M的CLK分成100K的CLK1,CLK1为另个计数器的时钟。
另外一个计数器完成一个8计数循环。这个不准。
PLUSEX<=XAXA3;
PROCESS(CLK1,LOAD)        --CLK1   100K     LOAD外部随机信号
BEGIN
   IF SAVE3="0000000000000000" THEN
      IF LOAD='1' THEN
         SAVE3<="0000000000001100;      --格雷码   二进制 8
      END IF;
   ELSIF CLK1' EVENT AND CLK1='1' THEN
      IF SAVE3/="0000000000000000"  THEN
         CASE SAVE3 IS
             WHEN "0000000000001100"=>
               SAVE3<="0000000000000100";
             WHEN "0000000000000100"=>
               SAVE3<="0000000000000101";
             WHEN "0000000000000101"=>
               SAVE3<="0000000000000111";
             WHEN "0000000000000111"=>
               SAVE3<="0000000000000110";
             WHEN "0000000000000110"=>
               SAVE3<="0000000000000010";
             WHEN "0000000000000010"=>
               SAVE3<="0000000000000011";
             WHEN "0000000000000011"=>
               SAVE3<="0000000000000001";
             WHEN "0000000000000001"=>
               SAVE3<="0000000000000000";
             WHEN OTHERS=>
               SAVE3<="0000000000000000";
           END CASE;
             XAXA3<=NOT XAXA3;                            --XAXA3每次都翻转,通过PLUSEX<=XAXA3 输出,可以看到记了多少数。
      END IF;
  END IF;
END PROCESS;


 楼主| 发表于 2004-7-9 14:47:16 | 显示全部楼层

计数器误差

没有全局复位信号?
#########################################
没有,我只用了全局时钟。全局复位信号有什么好处???
发表于 2004-7-9 15:30:12 | 显示全部楼层

计数器误差

如果用格雷码的目的仅仅是为了防止毛刺,那建议不用,简单问题复杂化了,那么大的case语句影响时序,把两个process中的异步复位或置位改为同步,毛刺问题的影响就能排除。
 楼主| 发表于 2004-7-9 16:01:20 | 显示全部楼层

计数器误差

置位和时钟出现毛刺,那应该不会出现多一个的情况。应该多几个吧?
计数中出现毛刺,有可能?
#################################################################
把两个process中的异步复位或置位改为同步,毛刺问题的影响就能排除
#################################################################

我不是不想用同步,第二个PROCESS中的LOAD是随机的。同步没法满足要求。
但是异步也不应该有问题呀??
 楼主| 发表于 2004-7-9 16:09:39 | 显示全部楼层

计数器误差

我的程序我用MODSIM 彷过,没看出问题。会不会是干扰电源??硬件有问题?
发表于 2004-7-12 09:55:50 | 显示全部楼层

计数器误差

[这个贴子最后由bravelu在 2004/07/12 10:02am 第 1 次编辑]

我说的同步的意思是:
第一个process rst信号不要放到敏感变量表(时序要相应调整)。
第二个process load 进来以后用时钟打几拍整理一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-8 20:35 , Processed in 0.027717 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表