搜索
bottom↓
回复: 26

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

[复制链接]

出0入0汤圆

发表于 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;
        signal  B   : 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;

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-2-23 18:31:48 | 显示全部楼层
请教,您用HDL倍频是什么思路?我从来没有见过,请赐教。

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

出0入0汤圆

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

状态机啊

出0入0汤圆

发表于 2010-2-24 16:06:47 | 显示全部楼层
我只知道倍频可以用带通滤出信号的高次谐波来实现
或者用锁相环

出0入31汤圆

发表于 2010-2-24 16:20:14 | 显示全部楼层
倍谁的频?

出0入0汤圆

发表于 2010-2-25 00:12:19 | 显示全部楼层
还是想不明白,HDL怎么倍频。

出0入0汤圆

 楼主| 发表于 2010-2-25 17:05:41 | 显示全部楼层
A,B 两路输入
相位差90°
就是编码器的输出

出0入4汤圆

发表于 2010-2-25 19:20:46 | 显示全部楼层
那么复杂?异或不就得了!

出0入0汤圆

 楼主| 发表于 2010-2-26 09:42:22 | 显示全部楼层
如何异或?

出0入0汤圆

发表于 2010-2-26 11:25:10 | 显示全部楼层
你把RTL视图 发一下

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

出0入0汤圆

 楼主| 发表于 2010-2-27 09:39:06 | 显示全部楼层
点击此处下载 ourdev_535519.htm(文件大小:7K) (原文件名:新建 Microsoft Word 文档.htm)

RTL图  太复杂 看不懂

出0入0汤圆

发表于 2010-3-1 17:20:01 | 显示全部楼层
那个word文档打开什么图都没有额。我也很好奇,倍频是什么样子的思路。

出0入0汤圆

发表于 2010-3-1 18:26:48 | 显示全部楼层
数字锁相环倍频还是可能的.
JITTER就不敢恭维了,看应用吧,要求不高,还是可以用的.

出0入0汤圆

发表于 2010-3-26 11:50:21 | 显示全部楼层
关注

出0入0汤圆

发表于 2010-4-2 22:18:11 | 显示全部楼层
如果没有相位差,FPGA貌似不能倍频,只能通过DCM PLL进行倍频,楼主写的是正交编码器吧?,标题混淆,被忽悠.

出0入0汤圆

 楼主| 发表于 2010-4-3 20:39:54 | 显示全部楼层
回复【14楼】lzg1518
-----------------------------------------------------------------------
没错啊

出0入0汤圆

发表于 2010-4-3 21:39:32 | 显示全部楼层
这个能叫倍频啊?最多也就叫正交肪冲四倍频计数的前半部份!你要真能用VHDL单肪冲四倍出来,那你就是人才啦!!!!

出0入0汤圆

发表于 2010-4-3 21:42:12 | 显示全部楼层
回复【16楼】40130064
这个能叫倍频啊?最多也就叫正交肪冲四倍频计数的前半部份!你要真能用VHDL单肪冲四倍出来,那你就是人才啦!!!!
-----------------------------------------------------------------------

XILINX FPGA中中DCM能做到呀

出0入0汤圆

发表于 2010-4-3 22:28:55 | 显示全部楼层

(原文件名:111.jpg)

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

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2010-4-4 15:54:02 | 显示全部楼层
回复【19楼】40130064
-----------------------------------------------------------------------

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

出0入0汤圆

 楼主| 发表于 2010-4-4 15:56:20 | 显示全部楼层
回复【21楼】281229961 小朱
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2010-4-4 17:17:36 | 显示全部楼层
回复【22楼】281229961 小朱
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2010-4-4 17:34:25 | 显示全部楼层
回复【22楼】281229961 小朱
-----------------------------------------------------------------------



1M A B 信号 10M CLK  波形不对啊  (原文件名:图片1.jpg)

出0入0汤圆

发表于 2010-4-6 09:15:08 | 显示全部楼层
倍頻怎麼用FPGA電路實現我還不知道怎麼弄,相信一定很復雜,也較耗資源。不如用外接阻容移相電路提供移相脉衝源來得簡單。

出0入0汤圆

 楼主| 发表于 2010-4-6 14:45:55 | 显示全部楼层
回复【24楼】40130064
-----------------------------------------------------------------------
我用单片机计数的,频率输出直接和单片机的中断连接,每个脉冲中断一次再判断方向进行加减计数
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-29 13:49

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

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