搜索
bottom↓
回复: 25

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

[复制链接]

出0入0汤圆

发表于 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 : out  STD_LOGIC;        --八分频输出
out_b : out  STD_LOGIC;        --八分频输出
k : out  STD_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;

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-7-22 18:41:47 | 显示全部楼层
看来VHDL的人不在少数阿。。。

出0入0汤圆

 楼主| 发表于 2011-7-23 08:40:34 | 显示全部楼层
verilog的多啊 VHDL的论坛里没多少

出0入0汤圆

发表于 2011-7-23 09:21:39 | 显示全部楼层
你得好好学下VHDL的语法基础。

出0入0汤圆

发表于 2011-7-23 09:25:25 | 显示全部楼层
一个process只能有一个边沿检测
同一个signal只能在一个process赋值,不用决断涵数的话。

出0入0汤圆

 楼主| 发表于 2011-7-23 10:03:15 | 显示全部楼层
回复【4楼】40130064
一个process只能有一个边沿检测
同一个signal只能在一个process赋值,不用决断涵数的话。
-----------------------------------------------------------------------

才刚学VHDL,感谢

出0入0汤圆

发表于 2011-7-23 10:09:39 | 显示全部楼层
专业课的一个分支,学的不怎么样,哈哈哈哈

出0入0汤圆

发表于 2011-7-23 10:52:09 | 显示全部楼层
不知道LZ弄出来了没??

出0入0汤圆

 楼主| 发表于 2011-7-23 11:06:42 | 显示全部楼层
没有啊 不会弄 谁能给指点下啊

出0入0汤圆

发表于 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')
里面两个不同变量的沿,会有问题

出0入0汤圆

发表于 2011-7-23 11:54:41 | 显示全部楼层
不明白你的用意  
正交信号只能做到4分频 你把意图说下我帮你写,反正现在没事,当练习练习

出0入0汤圆

 楼主| 发表于 2011-7-23 13:48:36 | 显示全部楼层
是这样子的, 我需要把编码器输出的2路正交脉冲各自8分频,而且要保证8分频后的2路脉冲的相位关系,明白了没

出0入0汤圆

发表于 2011-7-23 14:33:40 | 显示全部楼层
据我所知,正交信号只能做到4倍频,就是A或B的四倍,实际上就是在A的上升沿和下降沿产生一个脉冲然或上B产生的信号,得到四倍于A,或B的信号。

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

出0入0汤圆

 楼主| 发表于 2011-7-23 15:24:37 | 显示全部楼层
我要的是8分频,不是8倍频

出0入0汤圆

发表于 2011-7-23 15:43:49 | 显示全部楼层
明白了,根本不可能。电机正反位置振动时不可能有8分频信号输出。

出0入0汤圆

 楼主| 发表于 2011-7-23 15:54:48 | 显示全部楼层
不是吧,我现在就是要这样做啊,以前做的只是把AB两路脉冲各8分频,这样在电机不反转的时候相位没错,但是一旦电机反转,相位关系就乱了,我分析是电机反转时有1路的脉冲少了1个,出现这样情况的几率是1/2

出0入0汤圆

 楼主| 发表于 2011-7-23 15:55:58 | 显示全部楼层
高手们能帮帮我么

出0入0汤圆

发表于 2011-7-23 16:22:47 | 显示全部楼层
我还是大学生,刚刚在数电课上学过VHDL语言,还有verilog,好像有点难啊,他们有C语言重要吗

出0入0汤圆

 楼主| 发表于 2011-7-25 09:33:22 | 显示全部楼层
40130064 人在么

出0入0汤圆

发表于 2011-7-25 09:35:16 | 显示全部楼层
回复【18楼】scfor
-----------------------------------------------------------------------
晕 在啊不过这不是QQ

出0入0汤圆

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

出0入0汤圆

发表于 2011-7-25 10:15:36 | 显示全部楼层
假设目标点编码器是0 ,反转是-1,正转是1。电机在这三位置重复,编码器正反都只会输出1肪冲,8分频的话一个周期要8个编码器肪冲的时间,而现在只有一个,不可能会有8分频输出。所以一换向计数就会出错。

出0入0汤圆

发表于 2011-7-25 10:25:49 | 显示全部楼层
还有,就是电机换向时,如果编码器肪冲/分频系数不是整数,8分频输出就会出错。

所以在理论上就有问题。

出0入0汤圆

 楼主| 发表于 2011-7-25 10:41:11 | 显示全部楼层
在电机换向时,把计数器清0,然后重新计数8分频这样行不?
我以前做的是上升沿计数,计数4个就换一次,这样就能8分频了,但电机一换向就可能出现分频后AB的相位关系和没换向时一样

出0入0汤圆

发表于 2011-7-26 00:32:46 | 显示全部楼层
1,先把正交信号转换为脉冲和方向信号,方向信号用于下面的加减。
2,正转加计数,反转减计数,A相计数器初始值为0,B相的为4。计数值0-7输出1,8-15输出0。
这两个计数器输出的信号就是你所需要的信号。

出0入0汤圆

 楼主| 发表于 2011-7-26 08:38:02 | 显示全部楼层
回复【24楼】zhangalex88
1,先把正交信号转换为脉冲和方向信号,方向信号用于下面的加减。
2,正转加计数,反转减计数,a相计数器初始值为0,b相的为4。计数值0-7输出1,8-15输出0。
这两个计数器输出的信号就是你所需要的信号。

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

谢谢 我按你说的试试
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 13:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表