用CPLD做分频器产生频率。。。。。。。
现在手头有现成的几块CPLD IC型号为 XC9572(PLCC44封装的),业余学习下。想用CPLD做个分频器.思路是这样的,先把4.096Mhz晶振分频为409.6Hz,然后用CPLD做个可变化的300-4000的分频比,
买了个带按键的那种5脚的编码开关,顺转为脉冲加,反转为脉冲减,按下中间按键为步进,
步进值定为1/10/100/1000倍这个值可以从最小到最大循环的。输入到锁相环端构成个频率合成电路,
从而最终输出产生频率范围为(300-4000)X 409.6 HZ 占空比为50%的方波信号/
原来没接触过CPLD,不知道一块该IC能否实现该图中虚线框里的所有功能?有能做的方法啊
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_504975.JPG
(原文件名:未命名2.JPG)
编码开关图:
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_504979.JPG
(原文件名:5脚带按键编码开关.JPG) 抛砖引玉:
感觉要一个MPU给CPLD提供一个分频计数比较值,这样的话就没问题了(只是说300-4000分频没问题)。
至于PLL,不懂! 想法不错,帮忙顶 这个PLL咱暂时不考虑。手头有HC4046,可惜频率上不高。后来在网上买了几片最高上到50M的PLL。这几天估计该到了。
自己先顶一下,有能做出这个的大侠吗。。。。。 就用CPLD或者FPGA做个数字锁相环,应该可以实现 锁相环用成品电路了。看图中的虚线框中,其他的计数来分频功能就让CPLD来做 1/10000:一脉冲计数器,一比较器
300-4000:一脉冲计数器,一正交编码计数器,一比较器 楼上的是让我用分立电路来做吗?那就整的太麻烦拉 完全没问题。你说的功能都能实现。 能具体点,啊 有朋友实际做过该电路吗? 这个版块很冷清啊,自己再顶下//// 不太清楚你需要什么样的信息。只能说从原理上讲这个不难。核心就是一个计数器分频器。分频比由一个寄存器的值来定。除了这个以外,大头的工作是写一个旋转编码器的模块,按键驱动模块,防抖动,以及相应的控制逻辑等等。
这些模块(1:10000预分频器,旋转编码器驱动,控制逻辑,可变分频比的分频器)都能用CPLD或者FPGA实现。个人认为可能用FPGA实现更合适一些。理由是FPGA内部有DCM(XILINX的)或者DLL(ALTERA的),连你那个分离的PLL都省了。 我意思是说,要是有哪个大侠做过类似的代码程序。贴个参考下。。。
FPGA暂时就省拉。现在还没到玩那个的境界呵。。。。 哦,原来是求代码。我觉得这事就别想了,网上求verilog或这VHDL的代码,99%求不到。而且别人的代码,看不看得明白还是问题。有着功夫不如自己去写,还能积累几个好用的核。 哎,盲目中。自己找到了个4位可编程的分频器TC9198,用分立的搭搭看。。。。 给你个任意分频系数的原程序,稍微改动下就行了,但没锁相功能
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity any_div is
generic(n:integer:=4);------------设置分频系数
port(clk: in std_logic;-----------时钟
clkdiv:out std_logic);----分频信号
end;
architecture a of any_div is
signal cnt1:integer:=0;----计数器1
signal cnt2:integer:=0;----计数器2
signal clk_temp:std_logic;---脉冲控制信号
signal clkdiv1: std_logic;
begin
-------------------------------上升沿触发的计数器进程
process(clk)
begin
if clk'event and clk='1'then
if cnt1=n-1 then
cnt1<=0;
else
cnt1<=cnt1+1;
end if;
end if;
end process;
-------------------------------下降沿触发的计数器进程
process(clk)
begin
if clk'event and clk='0'then
if cnt2=n-1 then
cnt2<=0;
else
cnt2<=cnt2+1;
end if;
end if;
end process;
-------------------------------判断分频系数n是否为奇数,并分别控制计数器的计数
process(cnt1,cnt2 )
begin
if ((n mod 2)=1) then------n为奇数的情况
if cnt1=1 then
if cnt2=0 then
clk_temp<='1';
else clk_temp<='0';
end if;
elsif cnt1=(n+1)/2 then
if cnt2=(n+1)/2 then
clk_temp<='1';
else clk_temp<='0';
end if;
else
clk_temp<='0';
end if;
else-----------------------n为偶数的情况
if cnt1=1 then
clk_temp<='1';
elsif (cnt1=(n/2+1)) then
clk_temp<='1';
else
clk_temp<='0';
end if;
end if;
end process;
--------讨论n=1和2的情况,并通过脉冲控制信号的上升沿来控制分频信号的输出
process(clk_temp,clk)
begin
if((n/=2) and (n/=1)) then
if clk_temp'event and clk_temp='1' then
clkdiv1<=not clkdiv1;
end if;
elsif(n=2) then
if clk'event and clk='1' then
clkdiv1<=not clkdiv1;
end if;
else
clkdiv1<=clk;
end if;
end process;
clkdiv<=clkdiv1;
end ; 小数分频程序以前写过,但不记得放哪了 这是你那开关用的,一个正交信号的方向辩别程序,用开关产生正交信号,再加减计数产生分频系数。
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY ERT IS
PORT (j,k : IN STD_LOGIC;
l: OUT STD_LOGIC);
END ERT;
ARCHITECTURE YY OF ERT IS
signal S: STD_LOGIC;
BEGIN
PROCESS( j,K )
BEGIN
IF j'EVENT AND j='1' THEN
s<=k;
END IF;
END PROCESS ;
L<='0' WHEN(S='0')ELSE
'1';
END YY;
--A,B信号先或再输入,否则有一个方向信号会滞后于计数脉冲.前面A,B信号可以用D触发器延时. 谢谢啊 什么PLL能300-4000、分频,说下啊 老大回贴不看贴的啊
页:
[1]