scfor 发表于 2011-7-22 16:29:06

高手分析下代码,仿真都不出来

编码器输出2路相差90°的脉冲,现需要8分频输出,在电机不停地正反转下相位关系要对
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity fenpin is
port(
clk_a:in std_logic;            --A信号
clk_b:in std_logic;            --B信号
out_a : outSTD_LOGIC;      --八分频输出
out_b : outSTD_LOGIC;      --八分频输出
k : outSTD_LOGIC             --输出相位关系
);
end fenpin;
architecture arch of fenpin is
signal        count_a :std_logic_vector(2 downto 0):="000";
signal        count_b :std_logic_vector(2 downto 0):="000";
signal kout:std_logic:='1';

begin
k<=kout;

process(clk_a,kout)
        begin
        if (kout'event) then count_a<="000";count_b<="000";--电机转向变化时清除计数
        else
          if (clk_a'event and clk_a='1')
                then
                        if (count_a="111") then
                               count_a<=(others=>'0');
                       else
                               count_a<=count_a+1;
                                  if(count_a(2)='0') then
                                       out_a<='1';
                                  else
                                       out_a<='0';
                                  end if;
                        end if;
          end if;
      end if;
end process;
-- a信号八分频

process(clk_b,kout)
        begin
          if (kout'event ) then count_a<="000";count_b<="000";--电机转向变化时清除计数
          else
             if (clk_b'event and clk_b='1')
               then
                        if (count_b="111") then
                               count_b<=(others=>'0');
                        else
                               count_b<=count_b+1;
                                  if(count_b(2)='0') then
                                       out_b<='1';
                                  else
                                       out_b<='0';
                                  end if;
                        end if;
             end if;
        end if;
end process;
-- b信号八分频

process(clk_a,clk_b)
        begin
                if (clk_a'event and clk_a='1') then
                        if clk_b='1' then
                                kout<='1';
                        else
                                kout<='0';
                        end if;
                end if;
end process;
-- ab信号相位判断
end arch;

chenming1989 发表于 2011-7-22 18:41:47

看来VHDL的人不在少数阿。。。

scfor 发表于 2011-7-23 08:40:34

verilog的多啊 VHDL的论坛里没多少

40130064 发表于 2011-7-23 09:21:39

你得好好学下VHDL的语法基础。

40130064 发表于 2011-7-23 09:25:25

一个process只能有一个边沿检测
同一个signal只能在一个process赋值,不用决断涵数的话。

scfor 发表于 2011-7-23 10:03:15

回复【4楼】40130064
一个process只能有一个边沿检测
同一个signal只能在一个process赋值,不用决断涵数的话。
-----------------------------------------------------------------------

才刚学VHDL,感谢

ICANDO 发表于 2011-7-23 10:09:39

专业课的一个分支,学的不怎么样,哈哈哈哈

zhq1989723 发表于 2011-7-23 10:52:09

不知道LZ弄出来了没??

scfor 发表于 2011-7-23 11:06:42

没有啊 不会弄 谁能给指点下啊

study_yu 发表于 2011-7-23 11:11:25

if (kout'event) then count_a<="000";count_b<="000";--电机转向变化时清除计数
else
    if (clk_a'event and clk_a='1')
里面两个不同变量的沿,会有问题

40130064 发表于 2011-7-23 11:54:41

不明白你的用意
正交信号只能做到4分频 你把意图说下我帮你写,反正现在没事,当练习练习

scfor 发表于 2011-7-23 13:48:36

是这样子的, 我需要把编码器输出的2路正交脉冲各自8分频,而且要保证8分频后的2路脉冲的相位关系,明白了没

40130064 发表于 2011-7-23 14:33:40

据我所知,正交信号只能做到4倍频,就是A或B的四倍,实际上就是在A的上升沿和下降沿产生一个脉冲然或上B产生的信号,得到四倍于A,或B的信号。

8倍的话数字电路分不出,不用折腾了。

scfor 发表于 2011-7-23 15:24:37

我要的是8分频,不是8倍频

40130064 发表于 2011-7-23 15:43:49

明白了,根本不可能。电机正反位置振动时不可能有8分频信号输出。

scfor 发表于 2011-7-23 15:54:48

不是吧,我现在就是要这样做啊,以前做的只是把AB两路脉冲各8分频,这样在电机不反转的时候相位没错,但是一旦电机反转,相位关系就乱了,我分析是电机反转时有1路的脉冲少了1个,出现这样情况的几率是1/2

scfor 发表于 2011-7-23 15:55:58

高手们能帮帮我么

tuofeilun 发表于 2011-7-23 16:22:47

我还是大学生,刚刚在数电课上学过VHDL语言,还有verilog,好像有点难啊,他们有C语言重要吗

scfor 发表于 2011-7-25 09:33:22

40130064 人在么

40130064 发表于 2011-7-25 09:35:16

回复【18楼】scfor
-----------------------------------------------------------------------
晕 在啊不过这不是QQ

scfor 发表于 2011-7-25 10:04:39

我这上不了QQ 你说“电机正反位置振动时不可能有8分频信号输出。” 怎么解释呢 我知道在那个振动点脉冲不正常,但正反转稳定时脉冲占空比都为50%,而且2路是正交的,那这样子就可以8分频输出了,我现在碰到的问题是怎么样进行8分频保证2路还是正交关系?

40130064 发表于 2011-7-25 10:15:36

假设目标点编码器是0 ,反转是-1,正转是1。电机在这三位置重复,编码器正反都只会输出1肪冲,8分频的话一个周期要8个编码器肪冲的时间,而现在只有一个,不可能会有8分频输出。所以一换向计数就会出错。

40130064 发表于 2011-7-25 10:25:49

还有,就是电机换向时,如果编码器肪冲/分频系数不是整数,8分频输出就会出错。

所以在理论上就有问题。

scfor 发表于 2011-7-25 10:41:11

在电机换向时,把计数器清0,然后重新计数8分频这样行不?
我以前做的是上升沿计数,计数4个就换一次,这样就能8分频了,但电机一换向就可能出现分频后AB的相位关系和没换向时一样

zhangalex88 发表于 2011-7-26 00:32:46

1,先把正交信号转换为脉冲和方向信号,方向信号用于下面的加减。
2,正转加计数,反转减计数,A相计数器初始值为0,B相的为4。计数值0-7输出1,8-15输出0。
这两个计数器输出的信号就是你所需要的信号。

scfor 发表于 2011-7-26 08:38:02

回复【24楼】zhangalex88
1,先把正交信号转换为脉冲和方向信号,方向信号用于下面的加减。
2,正转加计数,反转减计数,a相计数器初始值为0,b相的为4。计数值0-7输出1,8-15输出0。
这两个计数器输出的信号就是你所需要的信号。

-----------------------------------------------------------------------

谢谢 我按你说的试试
页: [1]
查看完整版本: 高手分析下代码,仿真都不出来