集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 9828|回复: 27

分频器的VHDL描述

[复制链接]
usd 发表于 2010-6-27 23:13:03 | 显示全部楼层 |阅读模式
在数字电路中,常需要对较高频率的时钟进行分频操作,得到较低频率的时钟信号。我们知道,在硬件电路设计中时钟信号时非常重要的。
  下面我们介绍分频器的VHDL描述,在源代码中完成对时钟信号CLK的2分频,4分频,8分频,16分频。
LIBRARYIEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYclkdivIS
   PORT(clk  : IN STD_LOGIC;
clk_div2  : OUT STD_LOGIC;
clk_div4  : OUT STD_LOGIC;
clk_div8  : OUT STD_LOGIC;
clk_div16 : OUT STD_LOGIC);
END clk_div;
ARCHITECTURE rtl OF clk_div IS
  SIGNALcount : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
  PROCESS(clk)
  BEGIN
   IF (clk’event AND clk=’1’) THEN
    IF(count=”1111”) THEN
    Count <= (OTHERS =>’0’);
    ELSE
    Count <= count +1;
    END IF ;
   END IF ;
END PROCESS;
  clk_div2 <= count(0);
clk_div4 <= count(1);
clk_div8 <= count(2);
clk_div16 <= count(3);
END rtl;
对于分频倍数不是2的整数次幂的情况,我们只需要对源代码中的计数器进行一下计数控制就可以了,如下面源代码描述一个对时钟信号进行6分频的分频器。

ENTITYclkdivIS
   PORT(clk  : IN STD_LOGIC;
clk_div6  : OUT STD_LOGIC);
END clk_div;
ARCHITECTURE rtl OF clk_div IS
  SIGNALcount : STD_LOGIC_VECTOR(1 DOWNTO 0);
  SIGNALclk_temp: STD_LOGIC;
BEGIN
  PROCESS(clk)
  BEGIN
   IF (clk’event AND clk=’1’) THEN
    IF(count=”10”) THEN
    count <= (OTHERS =>’0’);
clk_temp <=NOT clk_temp;
    ELSE
    count <= count +1;
    END IF ;
   END IF ;
END PROCESS;
  clk_div6 <= clk_temp;

END rtl;
  前面两个分频器的例子描述的将时钟信号进行分频,分频后得到的时钟信号的占空比为1:1。在进行硬件设计的时候,往往要求得到一个占空比不是1:1的分频信号,这时仍采用计数器的方法来产生占空比不是1:1的分频信号。下面源代码描述的是这样一个分频器:将输入的时钟信号进行16分频,分频信号的占空比为 1:15,也就是说,其中高电位的脉冲宽度为输入时钟信号的一个周期。
LIBRARYIEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYclkdivIS
   PORT(clk  : IN STD_LOGIC;
clk_div16 : OUT STD_LOGIC);
END clk_div;
ARCHITECTURE rtl OF clk_div IS
  SIGNALcount : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
  PROCESS(clk)
  BEGIN
   IF (clk’event AND clk=’1’) THEN
    IF(count=”1111”) THEN
    Count <= (OTHERS =>’0’);
    ELSE
    Count <= count +1;
    END IF ;
   END IF ;
END PROCESS;
PROCESS(clk)
  BEGIN
   IF (clk’event AND clk=’1’) THEN
    IF(count=”1111”) THEN
    Clk_div16 <= ‘1’;
    ELSE
    Clk_div <= ‘0’;
    END IF ;
   END IF ;
END PROCESS;

END rtl;
对于上述源代码描述的这种分频器,在硬件电路设计中应用十分广泛,设计人员常采用这种分频器来产生选通信号、中断信号和数字通信中常常用到的帧头信号等。
CHA 发表于 2010-6-28 00:46:59 | 显示全部楼层
多谢,支持一下。
CCIE 发表于 2010-6-28 00:52:23 | 显示全部楼层
支持,楼主,谢谢
usb 发表于 2010-6-28 02:16:19 | 显示全部楼层
路过,支持一下
ATA 发表于 2010-6-28 02:50:12 | 显示全部楼层
友情帮顶。。。。
HANG 发表于 2010-6-28 03:05:27 | 显示全部楼层
靠!是下载别人的吧?也不写个版权
HANG 发表于 2010-6-28 04:19:31 | 显示全部楼层
支持一下啦
CHAN 发表于 2010-6-28 05:13:26 | 显示全部楼层
不错啊,学习~
inter 发表于 2010-6-28 05:23:30 | 显示全部楼层
要3分频&nbsp;&nbsp;5分频的找我<br>

        betten1983@hotmail.com
inter 发表于 2010-6-28 07:05:14 | 显示全部楼层
小数分频哪?
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-12-25 13:26 , Processed in 0.064885 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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