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

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

偶分频

偶分频电路,一般做法是通过计数器计数。如要实现10分频(计数器从0开始计数),则计数上限为(10 - 1)= 9,达到计数值(10/2 - 1)= 4,后输出时钟取反同时计数器继续累加1,知道计数器达到(10 - 1)= 9,输出时钟再次取反。(也可在计数器到4时清零,计数上限为4)

例如N分频(N为偶数),用计数器计数基准时钟周期个数cnt(cnt初值为0),计数上限为(N/2- 1 ),当cnt为(N/2- 1 )时候,分频时钟翻转一次,同时cnt清零,继续计数。

 //偶分频always @ (posedge clk or negedge rst_n) begin if(!rst_n) beginclk_even_cnt <= 0;clk_even <= 1'b0;endelse if(clk_even_cnt == CLK_DIV/2 - 1) begin clk_even_cnt <= clk_even_cnt + 1'b1;clk_even <= ~ clk_even;endelse if(clk_even_cnt == CLK_DIV - 1) begin clk_even_cnt <= 0;clk_even <= ~ clk_even;endelse begin clk_even_cnt <= clk_even_cnt + 1'b1;clk_even <= clk_even;endend

奇分频

占空比为50%的奇分频

首先看占空比为50%的奇分频,也就分频后的时钟的占空比为50%,高低电平持续时间一致。

由于奇分频需要保持分频后的时钟占空比为50%,所以不能想偶分频直接在分频系数的一般时使时钟信号翻转,接下来设计一个5分频的模块,设计思路如下:

采用计数器cnt1对时钟上升沿计数,计数从0开始。计数值为0、1时,输出时钟信号clk1_div为高电平,计数值为2、3、4时,输出时钟信号clk1_div 为低电平,计数器计到4时清零。得到占空比为2/5的波形clk1_div 。

采用计数器cnt2对时钟下降沿计数,计数从0开始。计数值为0、1时,输出时钟信号clk2_div为高电平,计数值为2、3、4时,输出时钟信号clk2_div 为低电平,计数器计到4时清零。得到占空比为2/5的波形clk2_div 。

clk1_div和clk2_div的上升沿时间间隔为半个时钟周期,将两个时钟信号进行或运算,即可得到占空比为50%的分频时钟。

//奇分频——clk1:上升沿触发
always @(posedge clk or negedge rst_n) beginif(!rst_n)beginclk1_odd_cnt    <= 0    ;r_clk_1        <= 1'b0    ;endelse if(clk1_odd_cnt == (CLK_DIV - 1) / 2)        //计数到一半时翻转,计数器继续加beginclk1_odd_cnt   <= clk1_odd_cnt + 1'b1    ;   r_clk_1     <= ~r_clk_1         ;end    else if(clk1_odd_cnt == CLK_DIV - 1)          //计数满时翻转,计数器清零beginclk1_odd_cnt <= 0        ;r_clk_1        <= ~r_clk_1 ;end        elsebeginclk1_odd_cnt   <= clk1_odd_cnt + 1'b1    ;   r_clk_1     <= r_clk_1          ;end
end//奇分频——clk2:下降沿触发always @(negedge clk or negedge rst_n) beginif(!rst_n)beginclk2_odd_cnt <= 0    ;r_clk_2        <= 1'b0    ;endelse if(clk2_odd_cnt == (CLK_DIV - 1) / 2)        //计数到一半时翻转,计数器继续加beginclk2_odd_cnt   <= clk2_odd_cnt + 1'b1    ;   r_clk_2     <= ~r_clk_2         ;end    else if(clk2_odd_cnt == CLK_DIV - 1)          //计数满时翻转,计数器清零beginclk2_odd_cnt <= 0        ;r_clk_2        <= ~r_clk_2 ;end        elsebeginclk2_odd_cnt   <= clk2_odd_cnt + 1'b1    ;   r_clk_2     <= r_clk_2          ;endend

实现任意奇、偶分频的分频器

`timescale 1ns / 1ps
//
// Company:
// Engineer: //module divier
#(parameter CLK_DIV= 8'd5,        //分频数CNT_WIDTH  = 4'd5        //分频位宽
)
(input           clk,      input           rst_n,output         out_clk,output          clk_1,output            clk_2,output reg    [CNT_WIDTH - 1 : 0]     clk_even_cnt    ,output reg [CNT_WIDTH - 1 : 0]     clk1_odd_cnt    ,output reg [CNT_WIDTH - 1 : 0]     clk2_odd_cnt
);//偶分频reg                                  clk_even            ;
//  reg [CNT_WIDTH - 1 : 0]     clk_even_cnt    ;//奇分频wire                                  clk_odd         ;reg                                    r_clk_1             ;reg                                    r_clk_2             ;
//  reg [CNT_WIDTH - 1 : 0]     clk1_odd_cnt    ;
//  reg [CNT_WIDTH - 1 : 0]     clk2_odd_cnt    ;assign out_clk = (!CLK_DIV) ? clk : (CLK_DIV[0] ? clk_odd : clk_even);assign clk_odd = clk_1 | clk_2;//偶分频always @ (posedge clk or negedge rst_n) begin if(!rst_n) beginclk_even_cnt <= 0;clk_even <= 1'b0;endelse if(clk_even_cnt == CLK_DIV/2 - 1) begin clk_even_cnt <= clk_even_cnt + 1'b1;clk_even <= ~ clk_even;endelse if(clk_even_cnt == CLK_DIV - 1) begin clk_even_cnt <= 0;clk_even <= ~ clk_even;endelse begin clk_even_cnt <= clk_even_cnt + 1'b1;clk_even <= clk_even;endend//奇分频--clk1:上升沿触发
always @(posedge clk or negedge rst_n) beginif(!rst_n)beginclk1_odd_cnt    <= 0    ;r_clk_1        <= 1'b0    ;endelse if(clk1_odd_cnt == (CLK_DIV - 1) / 2)        //计数到一半时翻转,计数器继续加beginclk1_odd_cnt   <= clk1_odd_cnt + 1'b1    ;   r_clk_1     <= ~r_clk_1         ;end    else if(clk1_odd_cnt == CLK_DIV - 1)          //计数满时翻转,计数器清零beginclk1_odd_cnt <= 0        ;r_clk_1        <= ~r_clk_1 ;end        elsebeginclk1_odd_cnt   <= clk1_odd_cnt + 1'b1    ;   r_clk_1     <= r_clk_1          ;end
end//奇分频--clk2:下降沿触发always @(negedge clk or negedge rst_n) beginif(!rst_n)beginclk2_odd_cnt <= 0    ;r_clk_2        <= 1'b0    ;endelse if(clk2_odd_cnt == (CLK_DIV - 1) / 2)        //计数到一半时翻转,计数器继续加beginclk2_odd_cnt   <= clk2_odd_cnt + 1'b1    ;   r_clk_2     <= ~r_clk_2         ;end    else if(clk2_odd_cnt == CLK_DIV - 1)          //计数满时翻转,计数器清零beginclk2_odd_cnt <= 0        ;r_clk_2        <= ~r_clk_2 ;end        elsebeginclk2_odd_cnt   <= clk2_odd_cnt + 1'b1    ;   r_clk_2     <= r_clk_2          ;endendassign clk_1 = r_clk_1;assign clk_2 = r_clk_2;
endmodule       

testbench

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//module divier_testbench();reg clk;
reg rst_n;
// wires
wire out_clk;
wire clk_1;
wire clk_2;//wire [2:0] cnt;wire    [5 - 1 : 0]     clk_even_cnt    ;wire   [5 - 1 : 0]     clk1_odd_cnt    ;wire   [5 - 1 : 0]     clk2_odd_cnt    ;divier i1 (
// port map - connection between master ports and signals/registers   .clk(clk),.out_clk(out_clk),.rst_n(rst_n),.clk_1(clk_1),.clk_2(clk_2),.clk_even_cnt(clk_even_cnt),.clk1_odd_cnt(clk1_odd_cnt),.clk2_odd_cnt(clk2_odd_cnt)
);
initial
begin                                                                           clk = 1;rst_n  = 0;#10 rst_n = 1;
end
always
begin                                                                           #10 clk = ~clk;
end
endmodule

Verilog 任意分频器设计相关推荐

  1. FPGA 任意分频器设计

    结合网上的经验,自己写了写偶.奇.任意分频器的程序. 偶分频器 /************************* Date:2018.8.14*************************** ...

  2. 【FPGA教程案例8】基于verilog的分频器设计与实现

    FPGA教程目录 MATLAB教程目录 -------------------------------------------------------------------------------- ...

  3. verilog将100mhz分频为1hz_50m 分频器设计——50MHZ(含verilog程序)

    50m 分频器设计--50MHZ(含verilog程序) 分频器设计 一.实验目的 1.熟悉分频器的原理: 2.掌握采用Verilog HDL语言设计分频器的方法: 3.进一步学习利用VerilogH ...

  4. (96)分频器设计(任意分频器)

    (96)分频器设计(任意分频器) 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)分频器设计(任意分频器) 5)技术交流 6)参考资料 2 FPGA入门与提升课程介绍 ...

  5. 数字分频器设计(偶数分频、奇数分频、小数分频、半整数分频、状态机分频|verilog代码|Testbench|仿真结果)

    数字分频器设计 一.前言 二.偶数分频 2.1 触发器级联法 2.2 计数器法 2.3 verilog代码 2.4 Testbench 2.5 仿真结果 三.奇数分频 3.1 占空比非50%奇数分频 ...

  6. Verilog任意整数分频器

    Verilog任意整数分频器 Verilog任意整数分频器 偶数分频 奇数分频 两种情况结合一下 在实际设计中有的时候需要简单的任意整数分频器,整数分频器主要解决两种情况下的分频,一个是偶数分频,另一 ...

  7. verilog将100mhz分频为1hz_verilog—分频器设计

    常用分频器设计 (含 0.5hz . 1hz . 2hz . 100hz . 1khz . 100khz . 1MHZ ) 一. 原理图 二. 程序(输入频率为 50MHZ ) module divc ...

  8. verilog将100mhz分频为1hz_verilog—分频器设计 -

    常用分频器设计 (含0.5hz.1hz.2hz.100hz.1khz.100khz.1MHZ) 一. 原理图 二. 程序(输入频率为50MHZ) module divclk(clk,div05hz,d ...

  9. 【Verilog HDL学习之路】第一章 Verilog HDL 数字设计总论

    1 Verilog HDL 数字设计总论 1.1 几个重要的概念 EDA(Electronic Design Automation) 电子技术自动化 EDA工具 类似于软件工程中的IDE(集成开发环境 ...

  10. (95)分频器设计(偶数分频)

    (95)分频器设计(偶数分频) 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)分频器设计(偶数分频) 5)技术交流 6)参考资料 2 FPGA入门与提升课程介绍 1 ...

最新文章

  1. [转]Ubantu vmware tools 安装
  2. 8.5 趣味游戏(2)
  3. SAP UI5关于navigation API的boolean参数
  4. python作业高级FTP(第八周)
  5. 应用前台省电秘籍——这些常见功耗雷坑不要再跳了
  6. Flutter 动态饼状图 让你的APP中无聊的统计图动起来 挻舒适的感觉瞬间提升一个档次 -深夜创作
  7. day1--numpy
  8. 网吧游戏更新服务器--------各种网卡参数设置
  9. Eclipse更换护眼背景色——传说中的绿豆沙
  10. 基于kinect的人体动作识别系统
  11. 电商数据分析流程 | Excel实操
  12. spring mvc 响应处理post请求和get请求 测试
  13. 怎么批量转换图片格式?
  14. Spring框架基础学习小结。概念,文件配置
  15. python数据分析案例2-1:Python练习-Python爬虫框架Scrapy入门与实践
  16. [ OpenCV ] QT配置OpenCV在mingw32-make时出现问题解决方法
  17. 无人零售的黑科技:RFID技术
  18. 周易六十四卦——天风姤卦
  19. 由路由器AP隔离引起的WEB服务不能访问的问题
  20. 机器学习——集成学习算法(Adaboost、随机森林)

热门文章

  1. spring cloud学习-什么是Spring Cloud Eureka?
  2. 百日计划:第一周,《七周成为数据分析师》课程近万字总结
  3. 2021厦门湖滨中学高考成绩查询,厦门各高中本科上线率2020
  4. 学习记录515@色彩搭配五大方案
  5. 网页.php文件怎么运行,php文件怎么打开运行,浏览器访问php文件
  6. 大数据平台以及一些核心组件介绍
  7. 达梦DEM部署、agent配置与监控使用
  8. 3D打印机USB联机打印是如何实现的?(以Cura插件USBPrinting为例)
  9. mysql及JAVA汉字转拼音
  10. python提取实部虚部_Python 复数数据类型详解(complex)[学习 Python 必备基础知识][看此一篇就够了]|python基础教程|python入门|python教程...