chibijia的个人空间 https://blog.eetop.cn/178426 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

分频器的硬件描述语言设计

已有 2515 次阅读| 2009-10-31 19:44 |个人分类:数字IC

在数字电路中,常需要对较高频率的时钟进行分频操作,得到较低频率的时钟信号。我们知道,在硬件电路设计中时钟信号是最重要的信号之一。 下面我们介绍分频器的 Vhdl 描述,在源代码中完成对时钟信号 CLK 的 2 分频, 4 分频, 8 分频, 16 分频。 这也是最简单的分频电路,只需要一个计数器即可。

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

 

ENTITY clkdiv IS

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

SIGNAL count : 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 分频的分频器。

 

ENTITY clkdiv IS

PORT(clk : IN STD_LOGIC;

clk_div6 : OUT STD_LOGIC);

END clk_div;

ARCHITECTURE rtl OF clk_div IS

SIGNAL count : STD_LOGIC_VECTOR(1 DOWNTO 0);

SIGNAL clk_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 ,也就是说,其中高电位的脉冲宽度为输入时钟信号的一个周期。

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY clkdiv IS

PORT(clk : IN STD_LOGIC;

clk_div16 : OUT STD_LOGIC);

END clk_div;

ARCHITECTURE rtl OF clk_div IS

SIGNAL count : 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;

对于上述源代码描述的这种分频器,在硬件电路设计中应用十分广泛,设计人员常采用这种分频器来产生选通信号、中断信号和数字通信中常常用到的帧头信号等。


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 2

    粉丝
  • 0

    好友
  • 0

    获赞
  • 32

    评论
  • 1485

    访问数
关闭

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


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-22 21:45 , Processed in 0.014384 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部