• https://blog.csdn.net/weixin_43950612/article/details/104687942(简介明了,奇数,偶数,小数,任意分频)
  • http://www.myexception.cn/verilog/1785373.html
  • https://blog.csdn.net/Reborn_Lee/article/details/81298123?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158928148219724845005777%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=158928148219724845005777&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-2-81298123.nonecase&utm_term=%E5%88%86%E9%A2%91%E7%94%B5%E8%B7%AFverilog

前言
虽然在实际工程中要产生分频时钟一般采用FPGA的时钟管理器来进行分频、倍频,通过设置一下IP核中的参数即可,这样做有很多别的方法(例如:直接用Verilog HDL设计分频电路)达不到的效果,产生时钟的质量也更好,因此,一般而言,也推荐这种方法,但这并非意味着直接用Verilog HDL设计分频电路一无是处,毫无用途。

由于FPGA的晶振频率都是固定值,只能产生固定频率的时序信号,但是实际工程中我们需要各种各样不同频率的信号,这时候就需要对晶振产生的频率进行分频。

如果对时钟的性能要求不高,我就自然就可以用这种方法产生分频时钟,这样就只消耗了少量的资源而实现了时钟的分频要求,我们把这种设计叫做分频器设计。

注意:分频电路可以这么设计,但倍频电路呢?恐怕写不出来吧!只能用IP核来产生。

分频器分类
分频器分为偶分频、奇分频,下面分别介绍二者的设计原理。

1)偶分频

相信大多数朋友在学习FPGA过程中接触到的第一个实验应该就是偶数分频器了,偶数分频器的设计较为简单,用一个简单的计数器就可以实现。比如要实现一个N分频(N为偶数)的分频器,可以先写一个计数器,当计数到(N/2-1)时,让输出状态翻转,并将计数器清零,这样输出的信号就是输入时钟的N分频了。

N分频(N为偶数),计数器计数到N/2-1翻转。如进行4分频,count=4/2-1=1时翻转,6分频计数器计到2翻转。程序如下,经过实测验证,正确。

//偶分频电路的Verilog HDL设计(10分频为例)
module even_freq_div(clk, rst, clk_div10,cnt);input clk;
input rst;
output clk_div10;
reg clk_div10;
output [2:0] cnt;          //输出cnt的原因是为了看到计数次数,便于分析仿真结果。
reg [2:0] cnt;always @(posedge clk)
beginif(rst)  //复位信号有效;begincnt <= 0;          //计数器清零clk_div10 <= 0;    //输出清零;endelse     //复位信号无效;beginif(cnt == 4)                //每一次时钟上升沿到来时,都检查一次计数值是否达到4;beginclk_div10 <= ~clk_div10;cnt <= 0; //计数器计数到4后,重新清零;计数值为4意味着已经计了5个周期,这时10分频时钟翻转一次;endelse     //如果计数器未计数到4,则来一个上升沿加1,同时分频时钟继续保持原值不变。begincnt <= cnt + 1;           clk_div10 <= clk_div10;  //否则继续保持;endendendendmodule

2)奇分频

奇数分频器的设计比偶数分频器复杂一些,特别是占空比为50%的奇数分频器。如果对占空比没有明确的要求,则可以直接对上升沿计数,计数到(N-1)/2 时让输出翻转,计数到(N-1)时让输出状态再次翻转,并将计数器清零,这样就可以得到一个占空比为2:3的N分频(N为奇数)的分频器。而如果要实现50%的占空比,可以通过“错位相或”的方法实现。具体方法是用刚才的方法先通过对上升沿计数产生一个占空比为不是50%的N分频器,再用同样的方法对下降沿计数产生一个占空比也不是50%的N分频器,最后将这两个分频器的输出进行“或”运算,就可以得到占空比为50%的奇数N分频器,

以5分频为例,我们写一个Verilog程序:

`timescale 1ns / 1ps
//
// Company:
// Engineer: CSDN 李锐博恩
//
// Create Date: 2019/07/28 15:15:27
// Design Name:
// Module Name: FRE_DIV5//module FRE_DIV5(input clk,input rst_n,output clk_div5);reg [2:0] div_cnt;always@(posedge clk or negedge rst_n) beginif(~rst_n) begindiv_cnt <= 0;endelse if(div_cnt <4) begindiv_cnt <= div_cnt + 1;endelse div_cnt <= 0;endreg clk_div_r, clk_div_rr;always@(posedge clk or negedge rst_n) beginif(~rst_n) beginclk_div_r <= 1;endelse if(div_cnt == 1) beginclk_div_r <= ~clk_div_r;endelse if(div_cnt == 4) beginclk_div_r <= ~clk_div_r;endelse clk_div_r <= clk_div_r;endalways@(negedge clk or negedge rst_n) beginif(~rst_n) beginclk_div_rr <= 1;endelse clk_div_rr <= clk_div_r;endassign clk_div5 = clk_div_r | clk_div_rr;endmodule

3.半分频器(N+0.5分频)

`timescale 1ns/1ps
///
//Create Date: 2020/03/05
//Module Name: half_integer_div
//Engineer: hewen
///
module half_integer_div(input clk,input rst_n,output clk_out
);parameter N = 3;  //3.5分频reg[31:0] cnt1;
reg clk_p;
reg clk_n;
always @(posedge clk or posedge rst_n)
beginif(!rst_n)cnt1<=0;else if(cnt1 == 2*N)cnt1<= 0;elsecnt1<=cnt1+1;
endalways @(posedge clk or posedge rst_n)
begin if(!rst_n)clk_p<=0;else if(cnt1 == 2*N)clk_p<=1;else if(cnt1 == N)clk_p<=0;
endalways @(negedge clk or posedge rst_n)
beginif(!rst_n)clk_n <= 0;else if (cnt1==0)clk_n <= 0;else if(cnt1 ==N)clk_n<=1;
endassign clk_out = clk_p & clk_n;endmodule

4.任意分频

`timescale 1ns/1ps
///
//Create Date: 2020/03/05
//Module Name: divide
//Engineer: hewen
///
module divide #
(
parameter WIDTH = 24, //计数器的位数,计数的最大值为 2**(WIDTH-1)
parameter N = 5  //分频系数,请确保 N<2**(WIDTH-1),否则计数会溢出
)
(input clk,  //clk连接到FPGA的C1脚,频率为12MHz
input rst_n,  //复位信号,低有效,
output clkout  //输出信号,可以连接到LED观察分频的时钟
); reg [WIDTH-1:0] cnt_p,cnt_n; reg clk_p,clk_n;    /**********上升沿触发部分************/
//上升沿触发时计数器的控制
always @(posedge clk or negedge rst_n)
begin     if(!rst_n)cnt_p <= 1'b0;    else if(cnt_p == (N-1))cnt_p <= 1'b0;    else cnt_p <= cnt_p + 1'b1;
end //上升沿触发的分频时钟输出,如果N为奇数得到的时钟占空比不是50%;如果N为偶数得到的时钟占空比为50%
always @(posedge clk or negedge rst_n)
begin    if(!rst_n)clk_p <= 1'b0;    else if(cnt_p < (N>>1))  clk_p <= 1'b0;else clk_p <= 1'b1;
end/***********下降沿触发部分*************/
//下降沿触发时计数器的控制
always @(negedge clk or negedge rst_n)
begin    if(!rst_n)cnt_n <= 1'b0;    else if(cnt_n == (N-1))cnt_n <= 1'b0;    else cnt_n <= cnt_n + 1'b1;
end
//下降沿触发的分频时钟输出,和clk_p相差半个clk时钟
always @(negedge clk or negedge rst_n)
begin    if(!rst_n)clk_n <= 1'b0;    else if(cnt_n < (N>>1))  clk_n <= 1'b0;   else clk_n <= 1'b1;
end
wire clk1 = clk;  //当N=1时,直接输出clk
wire clk2 = clk_p;  //当N为偶数也就是N[0]=0,输出clk_p
wire clk3 = clk_p & clk_n;  //当N为奇数也就是N[0]=1,输出clk_p&clk_n。正周期多所以是相与
assign clkout = (N==1)? clk1:(N[0]? clk3:clk2);
endmodule

FPGA分频电路实现(奇数,偶数,小数半分频,任意分频)相关推荐

  1. 一看就会的奇偶分频电路

    目录 前言 题目 二分频电路 第一步:画波形图 第二步:写状态机 三分频电路--1/3占空比 第一步:画波形图 第二步:写状态机 三分频电路--1/2占空比 第一步:画波形图 第二步:写状态机 4/5 ...

  2. 分频电路的实现:奇数分频、偶数分频和小数分频

    目录 偶数分频 奇数分频 N+0.5分频 任意小数分频 偶数分频 偶数分频是最简单的,N分频需要计数到(N-1),并在(N/2 -  1)和(N - 1)处更改输出的取值即可,只需要单一时钟沿计数.下 ...

  3. 4种FPGA时钟分频 【附源码】:1.偶数分频;2.奇数分频(占空比50%);3.奇数分频(任意无占空比);4.小数分频;

    题目来源于牛客网,完整工程源码:https://github.com/ningbo99128/verilog 目录 VL37 偶数分频 VL40 奇数分频(占空比50%) VL42 奇数分频(任意无占 ...

  4. 奇数偶数分频电路(占空比50%)

    数字电路中经常会遇到需要将时钟信号进行分频,一般分为奇数分频和偶数分频,同时对占空比的要求也不一样,常见的是需要保持占空比仍为50%.本文通过Verilog代码实现简单的分频电路.文末附上所有代码和仿 ...

  5. FPGA三分频电路的实现

    最近刚开始学习FPGA,准备使用verlog实现一些分频电路,偶数倍分频比较好操作,奇数倍分频相对来说要复杂一点点,我在网上查阅了一些资料,我来用我自己的话总结下. 1.最简单最好理解的实现(不推荐) ...

  6. IC/FPGA面试之任意时钟分频电路的产生

    IC/FPGA面试之任意时钟分频电路的产生 #题目分析 第一步:确定输入输出,输入时钟,复位信号,分频选择信号,输出分频信号. 第二步:偶数分频实现通过计数即可.奇数分频,首先产生分频电路,其次使用始 ...

  7. 奇数分频电路—5分频(verilog实现)

    文章目录 前言 占空比不为50%的奇数分频 占空比为50%的5分频电路 扩展 前言 前文我们讲到,可以通过计数器的方法实现偶数分频,实现方式可以参考4分频电路实现 那么对于奇数分频电路应该如何实现呢? ...

  8. IC/FPGA校招笔试题分析(二)任意切换的时钟分频电路

    今天的笔试题是某芸科技的现场笔试题,数字前端的笔试题,要求很简单,就是现场写出代码实现: 任意切换1-8分频,且无论奇分频还是偶分频,占空比均为50%,我至今仍然认为,在那种紧张且时间有限的情况下(本 ...

  9. FPGA笔试题解析(五):串并转换与奇分频电路

    题目:使用状态机实现序列检测器? 序列检测器的状态机实现,以前的博文写的很多,这里贴出两个简单易懂的,看需要的部分即可: 序列检测器的Moore状态机实现 序列检测器的Mealy状态机实现 题目:用V ...

最新文章

  1. python源码_Python爬虫入门之获取网页源码
  2. 一篇真正教会你开发移动端页面的文章(一)
  3. 单片机c语言 课程设计报告,单片机课程设计心得体会精选
  4. 通达信指标转python_python转换通达信股票数据
  5. Python之XML解析
  6. 三创赛优秀作品_厉害了!珠海这所学校的大学生夺得“三创赛”全国总决赛一等奖...
  7. Apache Calcite: 初窥门径
  8. matlab提取电压基波分量,有源电力滤波器三种基波提取方法的对比分析
  9. kubernetes Pod 污点与容忍
  10. js字符串的拼接,用逗号隔开
  11. Security+知识点
  12. 马克思主义哲学笔记(二)
  13. react中onClick点击事件
  14. 11.深入浅出:深度负反馈及放大倍数——参考《模拟电子技术基础》清华大学华成英主讲
  15. 家族关系查询系统程序设计算法思路_数据结构课程设计--
  16. H5页面开发怎么做?分析H5页面开发令人期待的 5 项功能。
  17. 工具 | 使用 CLion 编译调试 MySQL 8.0
  18. 根据地址生成客户地图及热力图(百度地图API)
  19. 阿拉伯数字 和汉字的相互转换
  20. 墨尔本大学 计算机科学,墨尔本大学计算机科学硕士专业详解 成为IT大神的必经之路...

热门文章

  1. manjaro KDE 安装微信
  2. 数据分析专题报告范文6篇_【2018最新】数据分析报告范文-优秀word范文 (5页)
  3. 李白打酒 c语言,C语言递归调用1:李白打酒
  4. Xshell 下载及安装
  5. 禅道----产品经理创建项目集和产品线
  6. 分分钟穿透手机,实现远程控制
  7. 大白菜Ghost备份还原系统-人人都会重装系统
  8. 苹果cms模板_苹果cms怎么做seo?
  9. LSL-- Events
  10. 山东养殖业稳中有升,饲料企业较乐观