高手分析下代码,仿真都不出来
编码器输出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; 看来VHDL的人不在少数阿。。。 verilog的多啊 VHDL的论坛里没多少 你得好好学下VHDL的语法基础。 一个process只能有一个边沿检测
同一个signal只能在一个process赋值,不用决断涵数的话。 回复【4楼】40130064
一个process只能有一个边沿检测
同一个signal只能在一个process赋值,不用决断涵数的话。
-----------------------------------------------------------------------
才刚学VHDL,感谢 专业课的一个分支,学的不怎么样,哈哈哈哈 不知道LZ弄出来了没?? 没有啊 不会弄 谁能给指点下啊 if (kout'event) then count_a<="000";count_b<="000";--电机转向变化时清除计数
else
if (clk_a'event and clk_a='1')
里面两个不同变量的沿,会有问题 不明白你的用意
正交信号只能做到4分频 你把意图说下我帮你写,反正现在没事,当练习练习 是这样子的, 我需要把编码器输出的2路正交脉冲各自8分频,而且要保证8分频后的2路脉冲的相位关系,明白了没 据我所知,正交信号只能做到4倍频,就是A或B的四倍,实际上就是在A的上升沿和下降沿产生一个脉冲然或上B产生的信号,得到四倍于A,或B的信号。
8倍的话数字电路分不出,不用折腾了。 我要的是8分频,不是8倍频 明白了,根本不可能。电机正反位置振动时不可能有8分频信号输出。 不是吧,我现在就是要这样做啊,以前做的只是把AB两路脉冲各8分频,这样在电机不反转的时候相位没错,但是一旦电机反转,相位关系就乱了,我分析是电机反转时有1路的脉冲少了1个,出现这样情况的几率是1/2 高手们能帮帮我么 我还是大学生,刚刚在数电课上学过VHDL语言,还有verilog,好像有点难啊,他们有C语言重要吗 40130064 人在么 回复【18楼】scfor
-----------------------------------------------------------------------
晕 在啊不过这不是QQ 我这上不了QQ 你说“电机正反位置振动时不可能有8分频信号输出。” 怎么解释呢 我知道在那个振动点脉冲不正常,但正反转稳定时脉冲占空比都为50%,而且2路是正交的,那这样子就可以8分频输出了,我现在碰到的问题是怎么样进行8分频保证2路还是正交关系? 假设目标点编码器是0 ,反转是-1,正转是1。电机在这三位置重复,编码器正反都只会输出1肪冲,8分频的话一个周期要8个编码器肪冲的时间,而现在只有一个,不可能会有8分频输出。所以一换向计数就会出错。 还有,就是电机换向时,如果编码器肪冲/分频系数不是整数,8分频输出就会出错。
所以在理论上就有问题。 在电机换向时,把计数器清0,然后重新计数8分频这样行不?
我以前做的是上升沿计数,计数4个就换一次,这样就能8分频了,但电机一换向就可能出现分频后AB的相位关系和没换向时一样 1,先把正交信号转换为脉冲和方向信号,方向信号用于下面的加减。
2,正转加计数,反转减计数,A相计数器初始值为0,B相的为4。计数值0-7输出1,8-15输出0。
这两个计数器输出的信号就是你所需要的信号。 回复【24楼】zhangalex88
1,先把正交信号转换为脉冲和方向信号,方向信号用于下面的加减。
2,正转加计数,反转减计数,a相计数器初始值为0,b相的为4。计数值0-7输出1,8-15输出0。
这两个计数器输出的信号就是你所需要的信号。
-----------------------------------------------------------------------
谢谢 我按你说的试试
页:
[1]