281229961 发表于 2010-2-23 13:43:37

四倍频程序 请大家看看是否有问题

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

-------四倍频模块---------------

entity pulse is

port(
        CLK: in std_logic ; --输入时钟
        RST_N: in std_logic ; --复位,低有效
        AA: in std_logic ; --A输入
        BB: in std_logic ; --B输入
        DIR: out std_logic ; --方向信号输出
        PUL: out std_logic); --倍频后时钟输出

end;

architecture bhv of pulse is
        type state is (s0,s1,s2,s3,s4);
        signal dir_state : state; --方向信号状态
        signal pul_state : state; --倍频时钟状态
        signal RST : std_logic; --复位信号,高有效
        signal dir_buf : std_logic; --方向信号buffer
        signal a_buf : std_logic; --A信号buffer
        signal b_buf : std_logic; --B信号buffer
        signal a_tmp : std_logic;
        signal b_tmp : std_logic;
        signal pul_buf : std_logic;
        signal count : integer range 0 to 64;
        signal         A   : std_logic;
        signalB   : std_logic;
begin
        RST <= not RST_N;
        A<=AA;
        B<=BB;
-------输入信号同步--------------       
        process(CLK,RST)
                begin
                        if RST = '1' then
                                a_buf <= '0';
                                b_buf <= '0';
                        elsif CLK'event and CLK = '1' then
                                a_buf <= a_tmp;
                                b_buf <= b_tmp;
                        end if;
                end process;
               
        process(CLK,RST)
                begin
                        if RST = '1' then
                                a_tmp <= '0';
                                b_tmp <= '0';
                        elsif CLK'event and CLK = '1' then
                                a_tmp <= A;
                                b_tmp <= B;
                        end if;
                end process;
               
---------产生方向信号-------               
      process(CLK,RST)
           begin
                if RST = '1' then
                        dir_buf <= '0';
                        dir_state <= s0;
                elsif CLK = '1' and CLK'event then
                        case dir_state is
                                when s0 =>
                              if a_buf = '0' then
                                      dir_state <= s1;
                              else
                                      dir_state <= s2;
                              end if;
                                when s1 =>
                                        if a_buf = '1' then
                                                dir_state <= s3;
                                        end if;
                                when s2 =>
                                        if a_buf = '0' then
                                                dir_state <= s4;
                                        end if;
                                when s3 =>
                                        if b_buf = '0' then
                                                dir_buf <= '1';
                                        else
                                                dir_buf <= '0';
                                        end if;
                                                dir_state <= s0;
                                when s4 =>
                                        if b_buf = '1' then
                                                dir_buf <= '1';
                                        else
                                                dir_buf <= '0';
                                        end if;
                                                dir_state <= s0;
                                when others =>
                                        dir_state <= s0;
                        end case;
               end if;
         end process;

-----------产生四倍频时钟-------------
process(RST,CLK)
        begin
                if RST = '1' then
                        pul_buf <= '0';
                        pul_state <= s0;
                elsif CLK = '1' and CLK'event then
                        case pul_state is
                                when s0 =>
                                        pul_buf <= '0';
                                        if a_buf = b_buf then
                                                pul_state <= s1;
                                        else
                                                pul_state <= s2;
                                        end if;
                                when s1 =>
                                        if a_buf /= b_buf then
                                                pul_buf <= '1';
                                                pul_state <= s3;
                                        end if;
                                when s2 =>
                                        if a_buf = b_buf then
                                                pul_buf <= '1';
                                                pul_state <= s3;
                                        end if;
                                when s3 =>
                                      count <= count + 1;
                                      if count = 63 then
                                              count <= 0;
                                              pul_state <= s0;
                                      end if;
                                when others =>
                                        pul_state <= s0;
                        end case;
                end if;
        end process;
       
       
        DIR <= dir_buf;
        PUL <= pul_buf;
end bhv;

tear086 发表于 2010-2-23 18:31:48

请教,您用HDL倍频是什么思路?我从来没有见过,请赐教。

分频倒是可以用各种方法。
我这里有篇笔记。
http://www.cnblogs.com/yuphone/archive/2010/02/08/1666130.html

281229961 发表于 2010-2-24 15:22:50

回复【1楼】tear086 .COM缺氧
请教,您用HDL倍频是什么思路?我从来没有见过,请赐教。
分频倒是可以用各种方法。
我这里有篇笔记。
http://www.cnblogs.com/yuphone/archive/2010/02/08/1666130.html
-----------------------------------------------------------------------

状态机啊

lijieamd 发表于 2010-2-24 16:06:47

我只知道倍频可以用带通滤出信号的高次谐波来实现
或者用锁相环

zchong 发表于 2010-2-24 16:20:14

倍谁的频?

tear086 发表于 2010-2-25 00:12:19

还是想不明白,HDL怎么倍频。

281229961 发表于 2010-2-25 17:05:41

A,B 两路输入
相位差90°
就是编码器的输出

gwj221 发表于 2010-2-25 19:20:46

那么复杂?异或不就得了!

281229961 发表于 2010-2-26 09:42:22

如何异或?

yuhang 发表于 2010-2-26 11:25:10

你把RTL视图 发一下

看看你写的这些优化成 什么了?

281229961 发表于 2010-2-27 09:39:06

点击此处下载 ourdev_535519.htm(文件大小:7K) (原文件名:新建 Microsoft Word 文档.htm)

RTL图太复杂 看不懂

McDeggy 发表于 2010-3-1 17:20:01

那个word文档打开什么图都没有额。我也很好奇,倍频是什么样子的思路。

suipeng70 发表于 2010-3-1 18:26:48

数字锁相环倍频还是可能的.
JITTER就不敢恭维了,看应用吧,要求不高,还是可以用的.

linxiaolong 发表于 2010-3-26 11:50:21

关注

lzg1518 发表于 2010-4-2 22:18:11

如果没有相位差,FPGA貌似不能倍频,只能通过DCM PLL进行倍频,楼主写的是正交编码器吧?,标题混淆,被忽悠.

281229961 发表于 2010-4-3 20:39:54

回复【14楼】lzg1518
-----------------------------------------------------------------------
没错啊

40130064 发表于 2010-4-3 21:39:32

这个能叫倍频啊?最多也就叫正交肪冲四倍频计数的前半部份!你要真能用VHDL单肪冲四倍出来,那你就是人才啦!!!!

NJ8888 发表于 2010-4-3 21:42:12

回复【16楼】40130064
这个能叫倍频啊?最多也就叫正交肪冲四倍频计数的前半部份!你要真能用VHDL单肪冲四倍出来,那你就是人才啦!!!!
-----------------------------------------------------------------------

XILINX FPGA中中DCM能做到呀

40130064 发表于 2010-4-3 22:28:55

http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_543529.jpg
(原文件名:111.jpg)

给楼主一个能用的功能同,前四个是D触发器
A超前B(90度)在C输出CLK周期四倍频脉冲B超前A(90度)在D输出CLK周期四倍频脉冲
完全通过硬件测试

NJ8888 发表于 2010-4-3 22:30:44

我看了DCM说明,原理是对输入的稳定时钟信号推迟相位(数字延时锁相环),这样与原始信号下一个周期比较等效相位提前了。DCM前提基于稳定的输入频率,即使模拟PLL也是这样。用于正交倍频确实不合适(它频率不稳定),我针对你说的------你要真能用VHDL单肪冲四倍出来,那你就是人才啦!!!! 回帖

281229961 发表于 2010-4-4 15:54:02

回复【19楼】40130064
-----------------------------------------------------------------------

我的 程序不管是A超前B(90度) 还是B超前A(90度)
都是DIR 输出方向
      PUL 输出四倍脉冲

281229961 发表于 2010-4-4 15:56:20

回复【21楼】281229961 小朱
-----------------------------------------------------------------------

所以可以用MCU 判断一个引脚高低就知道方向 ,

40130064 发表于 2010-4-4 17:17:36

回复【22楼】281229961 小朱
-----------------------------------------------------------------------

我还没测试你的程序 这个我以前也弄过 不过没搞对! 呵 我测试下

40130064 发表于 2010-4-4 17:34:25

回复【22楼】281229961 小朱
-----------------------------------------------------------------------


http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_543667.jpg
1M A B 信号 10M CLK波形不对啊(原文件名:图片1.jpg)

zpwang 发表于 2010-4-6 09:15:08

倍頻怎麼用FPGA電路實現我還不知道怎麼弄,相信一定很復雜,也較耗資源。不如用外接阻容移相電路提供移相脉衝源來得簡單。

281229961 发表于 2010-4-6 14:45:55

回复【24楼】40130064
-----------------------------------------------------------------------
我用单片机计数的,频率输出直接和单片机的中断连接,每个脉冲中断一次再判断方向进行加减计数
页: [1]
查看完整版本: 四倍频程序 请大家看看是否有问题