在学习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. hdu 5698 瞬间移动(排列组合)

    这题刚看完,想了想,没思路,就题解了 = = 但不得不说,找到这个题解真的很强大,链接:http://blog.csdn.net/qwb492859377/article/details/514781 ...

  2. codeforces 323A. Black-and-White Cube 构造

    输入n 1 <= n <= 100 有一个n * n * n 的立方体,由n ^ 3 个1 * 1 * 1 的单位立方体构成 要用white 和 black 2种颜色来染这n ^ 3个立方 ...

  3. 利用Mathematica计算伴随矩阵

    AdjointMatrix[M_] := Module[{Ma, B, n, i, j}, Ma = Minors[M];   B = Ma;   n = Dimensions[M][[1]];   ...

  4. RabbitMQ介绍3 - 运行和管理RabbitMQ

    安装.官方介绍:http://www.rabbitmq.com/download.html.一般产品环境会部署到Linux环境,但做为简单尝试,可以部署到Windows上(这里是部署介绍:http:/ ...

  5. 《精通SQL Server 2008》笔记

    7.3触发器的使用 7.4游标的使用 8索引/关系图/完整性 9用户管理

  6. db2删除数据库

    1.断开所有连接  db2 stop application all   force 2.停止数据库    db2stop 3.删除数据库(系统管理员权限下)db2 drop  数据库name

  7. vim使用快捷键

    vim使用快捷键 索引 1. 关于Vim 1.1 Vim的几种模式 2. 启动Vim 3. 文档操作 4. 光标的移动 4.1 基本移动 4.2 翻屏 4.3 标记 5. 插入文本 5.1 基本插入 ...

  8. 开发工具及服务年度大奖评选 I Bugtags 荣获最具成长潜力奖

    作为全球最大中文 IT 社区和服务平台.中国最大技术管理者平台的 CSDN 在中国北京总部举办了一场 2015 年开发工具及服务年度大奖评选活动,此次活动目的在于推动开发服务及工具质量的提升,提高行业 ...

  9. 自己动手搭建 Redis 环境,并建立一个 .NET HelloWorld 程序测试(转)

    关于 Redis ,下面来自百度百科: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set( ...

  10. sikuli+java实例

      新建java工程,导入sikuli-script.jar包 public class TestSikuli { public static void openPage() throws FindF ...