fpga中,一般外接的晶振是50Mhz,如果电路中一个模块需要25mhz时钟,那么进行一个2分频,这个是相当容易的,下面是一种方法,还有可以用一个二进制计数器实现。这里就不写代码了。easy.同样的原理 ,四分频也很容易。

process(clk)--clk输入时钟;
begin
  if(rst = '0') then  --rst复位信号;
     clkout <= '0';
  elsif(clk;event and clk = '1')then
     clkout <= not clk;
  end if;
end process;
但是如果实现一个三分频呢?? 是不是3分频器应该是每1.5的clock就0变1、1变0,但问题来了,哪来的1.5个clock?计数器并不能产生1.5!!正源触发与负源触发的间隔时间刚好是0.5个clock?所以我们产生两个clock,一个是posedge clk,一个是negedge clk,最后将两个clock做or,这样就可以产生出0.5个clock了。下面给出代码:::
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity clk_div_n is

    port(clk : in std_logic;
         rst : in std_logic; 
         clkout :out std_logic
         );
end clk_div_n;

architecture rtl of clk_div_n is
    
constant n   : integer range 0 to 10 := 6;  --这里的n可以是任意值,当然要大于1.
signal clk_p : std_logic;
signal clk_n : std_logic;

signal cnt_p : integer range 0 to n;
signal cnt_n : integer range 0 to n;

begin 
    process(clk_p, clk_n)
    begin
        if((n mod 2) = 0)then
            clkout <= clk_p;
        else
            clkout <= clk_p or clk_n;
        end if;
    end process;

     process(clk, rst)
     begin
        if(rst = '0') then
           cnt_p <= 0;
        elsif(clk'event and clk = '1') then
          if(cnt_p = n-1) then
              cnt_p <= 0;
          else
              cnt_p <= cnt_p + 1;
          end if;
        end if;
     end process;
        
     process(clk, rst)
     begin
          if(rst = '0') then
             clk_p <= '0';
          elsif(clk'event and clk = '1')then
            if (cnt_p < (n/2)) then
                clk_p <= '1';
            else
                clk_p <= '0';
            end if ;
          end if;
     end process; 
     
     
     process(clk, rst)
     begin
        if(rst = '0') then
           cnt_n <= 0;
        elsif(clk'event and clk = '0')then
          if(cnt_n = n-1) then
              cnt_n <= 0;
          else
              cnt_n <= cnt_n + 1;
          end if;
        end if;
     end process;
     
     process(clk, rst)
     begin
          if(rst = '0') then
             clk_n <= '0';
          elsif(clk'event and clk = '0')then
            if (cnt_n < (n/2)) then
                clk_n <= '1';
            else
                clk_n <= '0';
            end if ;
          end if;
     end process; 
end rtl;             
接下来我给出对应的testbench::有兴趣可以用make a simulation in modelsim 
LIBRARY ieee  ; 
USE ieee.std_logic_1164.all  ; 
USE ieee.std_logic_arith.all  ; 
USE ieee.std_logic_unsigned.all  ; 
ENTITY clk_div_n_tb  IS 
END clk_div_n_tb; 
 
ARCHITECTURE clk_div_tb_arch OF clk_div_n_tb IS
  SIGNAL clkout   :  std_logic  ; 
  SIGNAL rst   :  std_logic := '0' ; 
  SIGNAL clk   :  std_logic := '1' ; 
  COMPONENT clk_div_n  
    PORT ( 
      clk  : in std_logic ;
      rst  : in std_logic ; 
      clkout  : out std_logic
       ); 
  END COMPONENT ; 
BEGIN
  process
    begin
    wait for 50ns;
       clk <= not clk;
  end process;
  rst <= '1' after 200ns;
    test:clk_div_n
    PORT MAP ( 
      clk    => clk,
      rst    => rst,
      clkout => clkout) ; 
END clk_div_tb_arch; 

VHDL语言实现的任意整数分频器的更多相关文章

  1. 【编程题目】有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序;(需要回头仔细研究)

    32.(数组.规划)有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序:要求:通过交换 a,b 中的元素,使[序列 a 元素的和]与[序列 b 元素的和]之间的差最小.例如: var a=[ ...

  2. 【C语言】输入一个整数N,求N以内的素数之和

    [C语言]输入一个整数N,求N以内的素数之和 /* ========================================================================== ...

  3. 点评VHDL语言

    (1)VHDL的描述风格及语法十分类似于一般的计算机高级语言,但是它是一种硬件描述语言.学好VHDL的关键是充分理解VHDL语句和硬件电路的关系.编写VHDL,就是在描述一个电路,我们写完一段程序后, ...

  4. 黑马程序员-- C语言交换两个整数变量值几种函数比较

    总结了C语言中几种交换两个整数数值的函数,欢迎交流 #include <stdio.h> 使用多种交换变量值的函数比较 方法一:使用第三方临时变量 这种函数a,b只是值传递,实质上不能修交 ...

  5. C语言课程设计大整数运算

    该大整数运算系统用于对有符号的位数不超过500位的大整数进行加.减.乘.除四则运算和计算N(0<=N<=10000)的阶乘.注意事项 :    1.操作期间,进行四则运算时若大整数为正数请 ...

  6. C语言中链表任意位置怎么插入数据?然后写入文件中?

    链表插入示意图:(图是个人所画)因为链表指针指来指去,难以理解,所以辅助画图更加方便. 插入某个学号后面图: 定义的结构体: struct student { ]; //学生学号 ]; //学生姓名 ...

  7. c语言-交换两个整数

    使用c来写一个函数来实现交换两个整数. 第一种 一般的方法,引用中间变量,方便快捷. void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = t ...

  8. C语言输出规定长度的整数,不够位数前面补零

    今天在做ACM题目的时候,遇到了这么一个问题,还真别说,这个以前真的没用过,当时就傻掉了,还好这个世界有Google,通过搜索了解了输出这种格式的C语言实现方法.但是没有找到C++的实现方法,希望知道 ...

  9. c语言例子递归与整数逆序

    例一 #include <stdio.h> //将一整数逆序后放入一数组中(要求递归实现) void convert(int *result, int n) { if(n>=10) ...

随机推荐

  1. Java线程的阻塞

    线程的阻塞 线程的优先级 线程总是存在优先级,优先级范围在1~10之间,线程默认优先级是5(数值越大优先级越高): JVM线程调度程序是基于优先级的抢先调度机制: 在大多数情况下,当前运行的线程优先级 ...

  2. epoll对poll(select)的改进

    select的几大缺点:   每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大: 每次调用select,内核需要遍历传递进来的所有fd(判断检测文件是否可用).有 ...

  3. $()与document.getElementById

    $('#a')是返回一个jquery对象 $('#a')[0]是一个element对象 document.getElementById('a') return 一个element对象

  4. 20165333 实验二 Java面向对象程序设计

    姓名:陈国超 学号:20165333 班级:1653 实验课程:JAVA程序设计 实验名称:Java面向对象程序设计 实验时间:2018.4.14 指导老师:娄家鹏 实验内容及步骤 (一) " ...

  5. hdu 5446(2015长春网络赛J题 Lucas定理+中国剩余定理)

    题意:M=p1*p2*...pk:求C(n,m)%M,pi小于10^5,n,m,M都是小于10^18. pi为质数 M不一定是质数 所以只能用Lucas定理求k次 C(n,m)%Pi最后会得到一个同余 ...

  6. js 格式化时间,可定义格式

    var format = function (time, format) { var t = new Date(time); var tf = function (i) { return (i < ...

  7. 【LOJ】#2497. 「PA 2017」Banany

    题解 一眼就是线段树维护点分树的dfs序嘛 代码debug一年(手动再见) 码力直线下降,坐等滚粗= = 很明显的我们需要一个点分树,然后求出以每个重心为根的树的dfs序,线段树维护一下每个点的价值- ...

  8. 继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

    继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的 ...

  9. 黑马程序员_java基础笔记(11)...反射

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 1,字节码.2,Constructor类.3,Field类.4,Method类.5 ...

  10. Hadoop整理二(Hadoop分布式存储系统HDFS)

    一.背景 当数据集的大小超过一台独立物理计算机的存储能力时,就有必要对它进行分区(partition) 并存储到若干台单独的计算机上.管理网络中跨多台计算机存储的文件系统称为分布式文件系统 (dist ...