搜索
bottom↓
回复: 21

用CPLD做分频器产生频率。。。。。。。

[复制链接]

出0入0汤圆

发表于 2009-11-19 14:20:52 | 显示全部楼层 |阅读模式
现在手头有现成的几块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能否实现该图中虚线框里的所有功能?有能做的方法啊


(原文件名:未命名2.JPG)

编码开关图:

(原文件名:5脚带按键编码开关.JPG)

出0入0汤圆

发表于 2009-11-19 14:38:59 | 显示全部楼层
抛砖引玉:
感觉要一个MPU给CPLD提供一个分频计数比较值,这样的话就没问题了(只是说300-4000分频没问题)。
至于PLL,不懂!

出0入0汤圆

发表于 2009-11-19 14:48:35 | 显示全部楼层
想法不错,帮忙顶

出0入0汤圆

 楼主| 发表于 2009-11-19 15:11:53 | 显示全部楼层
这个PLL咱暂时不考虑。手头有HC4046,可惜频率上不高。后来在网上买了几片最高上到50M的PLL。这几天估计该到了。
自己先顶一下,有能做出这个的大侠吗。。。。。

出0入0汤圆

发表于 2009-11-19 15:17:01 | 显示全部楼层
就用CPLD或者FPGA做个数字锁相环,应该可以实现

出0入0汤圆

 楼主| 发表于 2009-11-19 15:34:49 | 显示全部楼层
锁相环用成品电路了。看图中的虚线框中,其他的计数来分频功能就让CPLD来做

出0入0汤圆

发表于 2009-11-19 15:39:57 | 显示全部楼层
1/10000:一脉冲计数器,一比较器
300-4000:一脉冲计数器,一正交编码计数器,一比较器

出0入0汤圆

 楼主| 发表于 2009-11-19 16:16:31 | 显示全部楼层
楼上的是让我用分立电路来做吗?那就整的太麻烦拉

出0入0汤圆

发表于 2009-11-19 17:16:01 | 显示全部楼层
完全没问题。你说的功能都能实现。

出0入0汤圆

 楼主| 发表于 2009-11-19 17:37:33 | 显示全部楼层
能具体点,啊

出0入0汤圆

 楼主| 发表于 2009-11-19 20:24:55 | 显示全部楼层
有朋友实际做过该电路吗?

出0入0汤圆

 楼主| 发表于 2009-11-19 22:43:41 | 显示全部楼层
这个版块很冷清啊,自己再顶下////

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2009-11-20 09:50:28 | 显示全部楼层
我意思是说,要是有哪个大侠做过类似的代码程序。贴个参考下。。。
FPGA暂时就省拉。现在还没到玩那个的境界呵。。。。

出0入0汤圆

发表于 2009-11-20 18:31:14 | 显示全部楼层
哦,原来是求代码。我觉得这事就别想了,网上求verilog或这VHDL的代码,99%求不到。而且别人的代码,看不看得明白还是问题。有着功夫不如自己去写,还能积累几个好用的核。

出0入0汤圆

 楼主| 发表于 2009-11-21 01:43:43 | 显示全部楼层
哎,盲目中。自己找到了个4位可编程的分频器TC9198,用分立的搭搭看。。。。

出0入0汤圆

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

出0入0汤圆

发表于 2009-11-22 17:11:44 | 显示全部楼层
小数分频程序以前写过,但不记得放哪了

出0入0汤圆

发表于 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触发器延时.

出0入0汤圆

 楼主| 发表于 2009-11-22 21:42:31 | 显示全部楼层
谢谢啊

出0入0汤圆

发表于 2009-11-23 08:46:52 | 显示全部楼层
什么PLL能300-4000、分频,说下啊

出0入0汤圆

 楼主| 发表于 2009-11-23 12:36:44 | 显示全部楼层
老大回贴不看贴的啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-3 15:31

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

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