guo132 发表于 2009-11-19 14:20:52

用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)

qianhng 发表于 2009-11-19 14:38:59

抛砖引玉:
感觉要一个MPU给CPLD提供一个分频计数比较值,这样的话就没问题了(只是说300-4000分频没问题)。
至于PLL,不懂!

yoko 发表于 2009-11-19 14:48:35

想法不错,帮忙顶

guo132 发表于 2009-11-19 15:11:53

这个PLL咱暂时不考虑。手头有HC4046,可惜频率上不高。后来在网上买了几片最高上到50M的PLL。这几天估计该到了。
自己先顶一下,有能做出这个的大侠吗。。。。。

usingavr 发表于 2009-11-19 15:17:01

就用CPLD或者FPGA做个数字锁相环,应该可以实现

guo132 发表于 2009-11-19 15:34:49

锁相环用成品电路了。看图中的虚线框中,其他的计数来分频功能就让CPLD来做

cqfeiyu 发表于 2009-11-19 15:39:57

1/10000:一脉冲计数器,一比较器
300-4000:一脉冲计数器,一正交编码计数器,一比较器

guo132 发表于 2009-11-19 16:16:31

楼上的是让我用分立电路来做吗?那就整的太麻烦拉

ngzhang 发表于 2009-11-19 17:16:01

完全没问题。你说的功能都能实现。

guo132 发表于 2009-11-19 17:37:33

能具体点,啊

guo132 发表于 2009-11-19 20:24:55

有朋友实际做过该电路吗?

guo132 发表于 2009-11-19 22:43:41

这个版块很冷清啊,自己再顶下////

ngzhang 发表于 2009-11-20 04:30:54

不太清楚你需要什么样的信息。只能说从原理上讲这个不难。核心就是一个计数器分频器。分频比由一个寄存器的值来定。除了这个以外,大头的工作是写一个旋转编码器的模块,按键驱动模块,防抖动,以及相应的控制逻辑等等。

这些模块(1:10000预分频器,旋转编码器驱动,控制逻辑,可变分频比的分频器)都能用CPLD或者FPGA实现。个人认为可能用FPGA实现更合适一些。理由是FPGA内部有DCM(XILINX的)或者DLL(ALTERA的),连你那个分离的PLL都省了。

guo132 发表于 2009-11-20 09:50:28

我意思是说,要是有哪个大侠做过类似的代码程序。贴个参考下。。。
FPGA暂时就省拉。现在还没到玩那个的境界呵。。。。

ngzhang 发表于 2009-11-20 18:31:14

哦,原来是求代码。我觉得这事就别想了,网上求verilog或这VHDL的代码,99%求不到。而且别人的代码,看不看得明白还是问题。有着功夫不如自己去写,还能积累几个好用的核。

guo132 发表于 2009-11-21 01:43:43

哎,盲目中。自己找到了个4位可编程的分频器TC9198,用分立的搭搭看。。。。

zhangchanggong 发表于 2009-11-22 17:09:30

给你个任意分频系数的原程序,稍微改动下就行了,但没锁相功能
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 ;

zhangchanggong 发表于 2009-11-22 17:11:44

小数分频程序以前写过,但不记得放哪了

zhangchanggong 发表于 2009-11-22 17:16:19

这是你那开关用的,一个正交信号的方向辩别程序,用开关产生正交信号,再加减计数产生分频系数。
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触发器延时.

guo132 发表于 2009-11-22 21:42:31

谢谢啊

zgq800712 发表于 2009-11-23 08:46:52

什么PLL能300-4000、分频,说下啊

guo132 发表于 2009-11-23 12:36:44

老大回贴不看贴的啊
页: [1]
查看完整版本: 用CPLD做分频器产生频率。。。。。。。