在学习FPGA的过程中,最简单最基本的实验应该就是分频器了,

同时分频器也是FPGA设计中使用频率非常高的基本设计之一,

尽管在芯片厂家提供的IDE中集成了锁相环IP

altera 的PLLXilinx ISE的DLL或者vivado中的clock来进行时钟的分频,倍频以及相移。

但是对于时钟要求不高的逻辑,通过语言进行时钟的分频相移显得十分方便,

这种方法可以节省芯片内部的锁相环资源,再者,通过语言设计进行时钟分频,可以锻炼我们对verilog的熟练和理解程度。

  • 偶数倍分频:实现起来比较简单,这里略过;

  • 奇数倍分频

    如果不要求占空比为50%的话,也比较容易实现,

    如进行三分频,通过待分频时钟上升沿触发计数器进行模三计数,

    当计数器计数到邻近值进行两次翻转,比如可以在计数器计数到1时,

    输出时钟进行翻转,计数到2时再次进行翻转。

    即在计数值在邻近的1和2进行了两次翻转。

    这样实现的三分频占空比为1/3或者2/3。

    对于实现占空比为50%的N倍奇数分频,我们可以分解为两个通道:

    • 上升沿触发进行模N计数,计数选定到某一个值进行输出时钟翻转,

      然后经过(N-1)/2再次进行翻转得到一个占空比为非50%奇数N分频时钟
    • 下降沿触发进行模N计数,到和上升沿触发输出时钟翻转选定值相同值时,

      进行输出时钟时钟翻转,同样经过(N-1)/2时,

      输出时钟再次翻转生成占空比非50%的奇数N分频时钟

    将这两个占空比非50%的N分频时钟或运算,得到占空比为50%的奇数n分频时钟

    具体例子:5分频等占空比,可以通过待分频时钟下降沿和上升沿触发0~4计数,

    • 对于待分频时钟的上升沿,当计数器cnt1计数到1时,

      clk_p翻转;当计数器计数到3(1 + (5 - 1) / 2 = 3)时,clk_p再次反转;
    • 对于待分频时钟的下降沿,当计数器cnt2计数到1时,

      clk_n翻转;当计数器计数到3(1 + (5 - 1) / 2 = 3)时,clk_n再次反转;
    • 然后下降沿产生的5分频时钟和上升沿产生的5分频时钟进行运算,

      即可得到占空比为50%的N分频时钟。

    这种方法可以实现任意的奇数分频。

下面给出5分频的具体代码:

`timescale 1ns/1ps 

module CLK_DIV5(
input clk_i,
input rst_n,
output clk_o
); reg [2:0] cnt1,cnt2;
reg clk_p,clk_n; //*********************
//MAIN CORE
//*********************
always @(posedge clk_i,negedge rst_n)
if(!rst_n) begin
cnt1 <= 3'b0;
clk_p <= 1'b0;
end
else begin
if(cnt1 == 3'b100) begin
cnt1 <= 3'b0;
clk_p <= clk_p;
end
else begin
cnt1 <= cnt1 + 1'b1;
if(cnt1 == 3'b1 || cnt1 == 3'b11)
clk_p <= ~clk_p;
end
end always @(negedge clk_i,negedge rst_n)
if(!rst_n) begin
cnt2 <= 3'b0;
clk_n <= 1'b0;
end
else begin
if(cnt2 == 3'b100) begin
cnt2 <= 3'b0;
clk_n <= clk_n;
end
else begin
cnt2 <= cnt2 + 1'b1;
if(cnt2 == 3'b1 || cnt2 == 3'b11)
clk_n <= ~clk_n;
end
end assign clk_o = clk_p | clk_n;
endmodule

测试激励模块:

`timescale 1ns/1ps 

module TB_TOP;

    reg   rst_n  ;
reg clk ; CLK_DIV5 U_CLK_DIV5(
.clk_i(clk),
.rst_n(rst_n),
.clk_o(clk_o)
); //*********************
//MAIN CORE
//*********************
initial begin
rst_n =1'b1;
clk =1'b0; #5
rst_n = 1'b0;
#5
rst_n = 1'b1; #500
$finish;
end always #1 clk = ~clk; endmodule

modelsim仿真图:

verilog实现奇数倍分频的更多相关文章

  1. 【Verilog】verilog实现奇数次分频

    实现占空比为50%的N倍奇数分频:首先进行上升沿触发进行模N计数,计数到某一个值时进行输出时钟翻转,然后经过(N-1)/2再次进行翻转得到一个占空比非50%的奇数n分频时钟.再者 同时进行下降沿触发的 ...

  2. 每天进步一点点------verilog语言实现的分频

    一 .占空比50%的任意奇数分频 如果要实现占空比为50%的三分频时钟,可以通过待分频时钟下降沿触发计数,和上升沿同样的方法计数进行三分频,然后下降沿产生的三分频时钟和上升沿产生的时钟进行相或运算,即 ...

  3. 基于Verilog的奇数偶数小数分频器设计

    今天呢,由泡泡鱼工作室发布的微信公共号“硬件为王”(微信号:king_hardware)正式上线啦,关注有惊喜哦.在这个普天同庆的美好日子里,小编脑洞大开,决定写一首诗赞美一下我们背后伟大的团队,虽然 ...

  4. 续x奇数倍(n+2*x)暴力算法是冠军的算法结合数量

    // 续6单a,a+2,a+4,a+6,a+8,a+10是共同的数.最低要求a // 暴力解决方案 首先对结果,后面将代码粘贴: 1次连续n=9,连续值个数: 1;耗时: 0ms,总计: 0ms 2次 ...

  5. FPGA奇数分频

    在FPGA设计中,分频是很常用的一个基本功能,一般来说,如果需要偶数分频即2次幂的整数倍,这个就很简单了,如2.4.8.16.32.64等这些以2的整数倍的. 这里说的是奇数倍分频,如时钟是100MH ...

  6. 基于verilog的分频器设计(半整数分频,小数分频:下)

    第二种方法:对进行奇数倍n分频时钟,首先进行n/2分频(带小数,即等于(n-1)/2+0.5),然后再进行二分频得到.得到占空比为50%的奇数倍分频.下面讲讲进行小数分频的设计方法. 小数分频:首先讲 ...

  7. 基于verilog的分频器设计(奇偶分频原理及其电路实现:上)

    在一个数字系统中往往需要多种频率的时钟脉冲作为驱动源,这样就需要对FPGA的系统时钟(频率太高)进行分频.分频器主要分为奇数分频,偶数分频,半整数分频和小数分频,在对时钟要求不是很严格的FPGA系统中 ...

  8. 关于分频器的FPGA实现整理思路

    分频器是用的最广的一种FPGA电路了,我最初使用的是crazybingo的一个任意分频器,可以实现高精度任意分频的一个通用模块,他的思想在于首先指定计数器的位宽比如32位,那么这个计数器的最大值就是2 ...

  9. System Generator入门

      System generator 安装之后会在Simulin模块库中添加一些Xilinx FPGA专用的模块库,包括Basic Element,Communication,Control Logi ...

随机推荐

  1. SOA_环境安装系列3_Oracle Weblogic安装和环境搭建(案例)

    2014-01-03 Created By BaoXinjian

  2. NeHe OpenGL教程 第十四课:图形字体

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. R-S触发器

    下面是触发器的电路,这个电路上下对称,分别都是一个或门连着一个非门,特别之处在于,它们各自的输出又分别是对方的输入. 合上R,上面的或门输入时1.0,经过上面的非门,Q=0,Q不发光.Q的结果会被反馈 ...

  4. bug_ _小心android-support-v4.jar版本混乱造成的NoClassDefFoundError

    当你的项目出现以下红色提示的时候,要小心了, 因为很可能因为这个错误而导致解释不通的异常出现. Found 2 versions of android-support-v4.jar in the de ...

  5. Ubuntu14.10 更新源,现在很多源已经停用了建议使用ubuntu15以上

    http://cdimage.ubuntu.com/ubuntukylin/releases/15.10/release/ 不同的网络状况连接以下源的速度不同, 建议在添加前手动验证以下源的连接速度( ...

  6. Group by与having理解

    注意:select 后的字段,必须要么包含在group by中,要么包含在having 后的聚合函数里. 1. GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使用 group ...

  7. repo安装

    repo是使用python开发的一个用于多版本管理的工具,可以和git协作,简化git的多版本管理. repo安装: 1.新建~/bin,并将此目录包含在path变量中(如果已存在,且已在path变量 ...

  8. tar.gz和rpm安装文件(转载)

    from:http://bbs.chinaunix.net/thread-2277750-1-1.html Linux软件的二进制分发是指事先已经编译好二进制形式的软件包的发布形式,其优点是安装使用容 ...

  9. iOS 数字字符串的直接运算 + - * /

    NSDecimalNumber *d1 = [NSDecimalNumber decimalNumberWithString:@"3.14"]; NSDecimalNumber * ...

  10. [Java] 读写字节数据,过滤流DataOutputStream和DataInputStream

    package test.stream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io ...