VHDL语言实现的任意整数分频器
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语言实现的任意整数分频器的更多相关文章
- 【编程题目】有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序;(需要回头仔细研究)
32.(数组.规划)有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序:要求:通过交换 a,b 中的元素,使[序列 a 元素的和]与[序列 b 元素的和]之间的差最小.例如: var a=[ ...
- 【C语言】输入一个整数N,求N以内的素数之和
[C语言]输入一个整数N,求N以内的素数之和 /* ========================================================================== ...
- 点评VHDL语言
(1)VHDL的描述风格及语法十分类似于一般的计算机高级语言,但是它是一种硬件描述语言.学好VHDL的关键是充分理解VHDL语句和硬件电路的关系.编写VHDL,就是在描述一个电路,我们写完一段程序后, ...
- 黑马程序员-- C语言交换两个整数变量值几种函数比较
总结了C语言中几种交换两个整数数值的函数,欢迎交流 #include <stdio.h> 使用多种交换变量值的函数比较 方法一:使用第三方临时变量 这种函数a,b只是值传递,实质上不能修交 ...
- C语言课程设计大整数运算
该大整数运算系统用于对有符号的位数不超过500位的大整数进行加.减.乘.除四则运算和计算N(0<=N<=10000)的阶乘.注意事项 : 1.操作期间,进行四则运算时若大整数为正数请 ...
- C语言中链表任意位置怎么插入数据?然后写入文件中?
链表插入示意图:(图是个人所画)因为链表指针指来指去,难以理解,所以辅助画图更加方便. 插入某个学号后面图: 定义的结构体: struct student { ]; //学生学号 ]; //学生姓名 ...
- c语言-交换两个整数
使用c来写一个函数来实现交换两个整数. 第一种 一般的方法,引用中间变量,方便快捷. void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = t ...
- C语言输出规定长度的整数,不够位数前面补零
今天在做ACM题目的时候,遇到了这么一个问题,还真别说,这个以前真的没用过,当时就傻掉了,还好这个世界有Google,通过搜索了解了输出这种格式的C语言实现方法.但是没有找到C++的实现方法,希望知道 ...
- c语言例子递归与整数逆序
例一 #include <stdio.h> //将一整数逆序后放入一数组中(要求递归实现) void convert(int *result, int n) { if(n>=10) ...
随机推荐
- 如何提高PHP执行效率
用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说 ...
- 浅谈js设计模式之策略模式
策略模式有着广泛的应用.本节我们就以年终奖的计算为例进行介绍. 很多公司的年终奖是根据员工的工资基数和年底绩效情况来发放的.例如,绩效为 S的人年终奖有 4倍工资,绩效为 A的人年终奖有 3倍工资,而 ...
- ubuntu 创建容器 并ssh 连接容器
1.下载镜像:docker search ubuntu docker pull ubuntu 2. 创建容器 docker run --name spider_frame -p 8888:8888 - ...
- TObject、TPersisent 、TComponent、TControl、TGraphicControl、TWinControl 关系图
VCL的类图结构 TObject | TPersisent | ...
- XML文件解析-SaxReader
一.前言 java解析xml文件有几种方式,这里介绍一下用SaxReader来解析Xml的方法. 二.准备 如果用SaxReader的话,需要引入jar包dom4j, 版本的话官网下载一个就好,这里用 ...
- Activity总结练习
package com.example.wang.myapplication; import android.content.Intent; import android.os.Bundle; imp ...
- 1926: [Sdoi2010]粟粟的书架
大概就是分情况乱搞.. 经典维护二维前缀和暴力+莫队算法 垫底QAQ #include <bits/stdc++.h> using namespace std; namespace my_ ...
- day6面向对象
面向对象介绍(http://www.cnblogs.com/alex3714/articles/5188179.htm) 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就 ...
- 简单实现textview文本每隔两秒就改变一次
//这个方法可以实现文本每隔两秒就改变一次, public void textTask(){ final android.os.Handler handler=new android.os.Handl ...
- Python 入门之基本数据类型
为什么我要学习Python这门语言呢?其实很简单,我想拓展技术面的同时,尝试更多的方向,可能最后会不了了之,谁知道呢?有可能的话,我会向爬虫和数据分析这个方向走.所以也就开始了我的Python学习之旅 ...
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;
32.(数组.规划)有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序:要求:通过交换 a,b 中的元素,使[序列 a 元素的和]与[序列 b 元素的和]之间的差最小.例如: var a=[ ...
[C语言]输入一个整数N,求N以内的素数之和 /* ========================================================================== ...
(1)VHDL的描述风格及语法十分类似于一般的计算机高级语言,但是它是一种硬件描述语言.学好VHDL的关键是充分理解VHDL语句和硬件电路的关系.编写VHDL,就是在描述一个电路,我们写完一段程序后, ...
总结了C语言中几种交换两个整数数值的函数,欢迎交流 #include <stdio.h> 使用多种交换变量值的函数比较 方法一:使用第三方临时变量 这种函数a,b只是值传递,实质上不能修交 ...
该大整数运算系统用于对有符号的位数不超过500位的大整数进行加.减.乘.除四则运算和计算N(0<=N<=10000)的阶乘.注意事项 : 1.操作期间,进行四则运算时若大整数为正数请 ...
链表插入示意图:(图是个人所画)因为链表指针指来指去,难以理解,所以辅助画图更加方便. 插入某个学号后面图: 定义的结构体: struct student { ]; //学生学号 ]; //学生姓名 ...
使用c来写一个函数来实现交换两个整数. 第一种 一般的方法,引用中间变量,方便快捷. void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = t ...
今天在做ACM题目的时候,遇到了这么一个问题,还真别说,这个以前真的没用过,当时就傻掉了,还好这个世界有Google,通过搜索了解了输出这种格式的C语言实现方法.但是没有找到C++的实现方法,希望知道 ...
例一 #include <stdio.h> //将一整数逆序后放入一数组中(要求递归实现) void convert(int *result, int n) { if(n>=10) ...
用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说 ...
策略模式有着广泛的应用.本节我们就以年终奖的计算为例进行介绍. 很多公司的年终奖是根据员工的工资基数和年底绩效情况来发放的.例如,绩效为 S的人年终奖有 4倍工资,绩效为 A的人年终奖有 3倍工资,而 ...
1.下载镜像:docker search ubuntu docker pull ubuntu 2. 创建容器 docker run --name spider_frame -p 8888:8888 - ...
VCL的类图结构 TObject | TPersisent | ...
一.前言 java解析xml文件有几种方式,这里介绍一下用SaxReader来解析Xml的方法. 二.准备 如果用SaxReader的话,需要引入jar包dom4j, 版本的话官网下载一个就好,这里用 ...
package com.example.wang.myapplication; import android.content.Intent; import android.os.Bundle; imp ...
大概就是分情况乱搞.. 经典维护二维前缀和暴力+莫队算法 垫底QAQ #include <bits/stdc++.h> using namespace std; namespace my_ ...
面向对象介绍(http://www.cnblogs.com/alex3714/articles/5188179.htm) 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就 ...
//这个方法可以实现文本每隔两秒就改变一次, public void textTask(){ final android.os.Handler handler=new android.os.Handl ...
为什么我要学习Python这门语言呢?其实很简单,我想拓展技术面的同时,尝试更多的方向,可能最后会不了了之,谁知道呢?有可能的话,我会向爬虫和数据分析这个方向走.所以也就开始了我的Python学习之旅 ...