四倍频程序 请大家看看是否有问题
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; 请教,您用HDL倍频是什么思路?我从来没有见过,请赐教。
分频倒是可以用各种方法。
我这里有篇笔记。
http://www.cnblogs.com/yuphone/archive/2010/02/08/1666130.html 回复【1楼】tear086 .COM缺氧
请教,您用HDL倍频是什么思路?我从来没有见过,请赐教。
分频倒是可以用各种方法。
我这里有篇笔记。
http://www.cnblogs.com/yuphone/archive/2010/02/08/1666130.html
-----------------------------------------------------------------------
状态机啊 我只知道倍频可以用带通滤出信号的高次谐波来实现
或者用锁相环 倍谁的频? 还是想不明白,HDL怎么倍频。 A,B 两路输入
相位差90°
就是编码器的输出 那么复杂?异或不就得了! 如何异或? 你把RTL视图 发一下
看看你写的这些优化成 什么了? 点击此处下载 ourdev_535519.htm(文件大小:7K) (原文件名:新建 Microsoft Word 文档.htm)
RTL图太复杂 看不懂 那个word文档打开什么图都没有额。我也很好奇,倍频是什么样子的思路。 数字锁相环倍频还是可能的.
JITTER就不敢恭维了,看应用吧,要求不高,还是可以用的. 关注 如果没有相位差,FPGA貌似不能倍频,只能通过DCM PLL进行倍频,楼主写的是正交编码器吧?,标题混淆,被忽悠. 回复【14楼】lzg1518
-----------------------------------------------------------------------
没错啊 这个能叫倍频啊?最多也就叫正交肪冲四倍频计数的前半部份!你要真能用VHDL单肪冲四倍出来,那你就是人才啦!!!! 回复【16楼】40130064
这个能叫倍频啊?最多也就叫正交肪冲四倍频计数的前半部份!你要真能用VHDL单肪冲四倍出来,那你就是人才啦!!!!
-----------------------------------------------------------------------
XILINX FPGA中中DCM能做到呀 http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_543529.jpg
(原文件名:111.jpg)
给楼主一个能用的功能同,前四个是D触发器
A超前B(90度)在C输出CLK周期四倍频脉冲B超前A(90度)在D输出CLK周期四倍频脉冲
完全通过硬件测试 我看了DCM说明,原理是对输入的稳定时钟信号推迟相位(数字延时锁相环),这样与原始信号下一个周期比较等效相位提前了。DCM前提基于稳定的输入频率,即使模拟PLL也是这样。用于正交倍频确实不合适(它频率不稳定),我针对你说的------你要真能用VHDL单肪冲四倍出来,那你就是人才啦!!!! 回帖 回复【19楼】40130064
-----------------------------------------------------------------------
我的 程序不管是A超前B(90度) 还是B超前A(90度)
都是DIR 输出方向
PUL 输出四倍脉冲 回复【21楼】281229961 小朱
-----------------------------------------------------------------------
所以可以用MCU 判断一个引脚高低就知道方向 , 回复【22楼】281229961 小朱
-----------------------------------------------------------------------
我还没测试你的程序 这个我以前也弄过 不过没搞对! 呵 我测试下 回复【22楼】281229961 小朱
-----------------------------------------------------------------------
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_543667.jpg
1M A B 信号 10M CLK波形不对啊(原文件名:图片1.jpg) 倍頻怎麼用FPGA電路實現我還不知道怎麼弄,相信一定很復雜,也較耗資源。不如用外接阻容移相電路提供移相脉衝源來得簡單。 回复【24楼】40130064
-----------------------------------------------------------------------
我用单片机计数的,频率输出直接和单片机的中断连接,每个脉冲中断一次再判断方向进行加减计数
页:
[1]