zoukankan      html  css  js  c++  java
  • 分频器VHDL描述

    在数字电路中,常需要对较高频率的时钟进行分频操作,得到较低频率的时钟信号。我们知道,在硬件电路设计中时钟信号时非常重要的。
        下面我们介绍分频器的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;

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

  • 相关阅读:
    008. redis 主从复制原理、断点续传、无磁盘化复制、过期 key 处理
    007.redis replication 以及 master 持久化对主从架构的安全意义
    006. redis 如何通过读写分离来承载读请求 QPS 超过 10 万 +?
    005.在项目中部署 redis 企业级数据备份方案以及各种踩坑的数据恢复容灾演练
    人月神话---向进度落后的项目中增加人手,只会使进度更加落后
    人月神话---空泛的估算
    人月神话---不为系统测试安排足够的时间简直就是一场灾难
    人月神话---成本的确随开发产品的人数和时间的不同,有着很大的变化,进度却不是如此
    springmvc其他类获取request记得web.xml
    gson转换问题
  • 原文地址:https://www.cnblogs.com/shangdawei/p/4532097.html
Copyright © 2011-2022 走看看