计数器误差
异步置位计数器 长时间计数,存在多一个或少一个的现象。
1怀疑毛刺,采用格雷码,效果一样。
2同步置位计数器 ,效果一样。
3干扰吗?
还有什么方法,请提供,万分感激!
第一次做FPGA,难道FPGA这复杂?
计数器误差
代码如下:(太简单了)
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)--CLK1M
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)--CLK1100KLOAD外部随机信号
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;
计数器误差
PROCESS(CLK)--CLK1M
BEGIN
IF CLK' EVENT AND CLK='1' THEN
if qn=9 then
qn = 0;
else
QN<=QN+1;
end if;
END IF;
END PROCESS;
计数器误差
没有全局复位信号?
计数器误差
PROCESS(CLK)--CLK1M
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)--CLK1100KLOAD外部随机信号
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;
计数器误差
没有全局复位信号?
#########################################
没有,我只用了全局时钟。全局复位信号有什么好处?
计数器误差
如果用格雷码的目的仅仅是为了防止毛刺,那建议不用,简单问题复杂化了,那么大的case语句影响时序,把两个process中的异步复位或置位改为同步,毛刺问题的影响就能排除。
计数器误差
置位和时钟出现毛刺,那应该不会出现多一个的情况。应该多几个吧?
计数中出现毛刺,有可能?
#################################################################
把两个process中的异步复位或置位改为同步,毛刺问题的影响就能排除
#################################################################
我不是不想用同步,第二个PROCESS中的LOAD是随机的。同步没法满足要求。
但是异步也不应该有问题呀?
计数器误差
我的程序我用MODSIM 彷过,没看出问题。会不会是干扰电源?硬件有问题?
计数器误差
[这个贴子最后由bravelu在 2004/07/12 10:02am 第 1 次编辑]
我说的同步的意思是:
第一个process rst信号不要放到敏感变量表(时序要相应调整)。
第二个process load 进来以后用时钟打几拍整理一下。
明白。
我用同步置位,问题搞定。只不过我的要把外部送来的异步数据同步一下。
异步和同步差别很大。
也碰到这个问题:
第二个process load 进来以后用时钟打几拍整理一下是什么意思啊
我说的同步的意思是:
第一个process rst信号不要放到敏感变量表(时序要相应调整)。
第二个process load 进来以后用时钟打几拍整理一下。 [/quote]