分频器

  • 前言
  • 分频原理
  • 偶数分频
    •    6分频
    •    代码
    •    tb
    •    仿真波形
  • 奇数分频
    •   仿真波形
    •   代码
    •   tb
  • 小数分频
      •    说明
    •  半整数分频:N+0.5
      •   仿真波形
      •   代码
      •   tb
    •  小数分频
      •    5.3分频
      •   代码
      •   tb
      •   仿真波形
  • 最后

前言

FPGA开发板上一般只有一个晶振,即一种时钟频率。数字系统设计中,时间的计算都要以时钟作为基本单元,对基准时钟进行不同倍数的分频而得到各模块所需时钟频率,可通过Verilog代码实现;倍频可通过锁相环【PLL】实现。

分频原理

把输入信号的频率变成成倍的低于输入频率的输出信号;每经历几个单位时钟周期就输出一个时钟周期。
例:clk_in为12MHz; clk_out为2MHz.则分频系数为6。那么如何实现6分频:
  把输入信号作为计数脉冲(边沿触发一次,计数一次),
当计数6次,为输出信号的一个周期,此时输入信号经历了6个周期,置0,重新开始计数,循环往复。(前提:输入信号占空比50%)
而输出信号的不同占空比的实现无非是输出信号经历的单位周期输出高低电平不同;

偶数分频

   6分频

占空比50%:6分频电路:一个always块实现一个模3计数器。
     另一个always块实现当计数到2(从0计数到2,计数,3次)输出信号翻转,
     占空比50%。
占空比不是50%:先实现模6计数器,然后可任意设计当计数到某个值输出高电平,再计数到另一个值输出低电平。

   代码
//不带标志位占空比50%
module divider_six(clk,reset,clk_out,cnt);input clk;input reset;output reg clk_out;output reg [1:0] cnt;//用于计数的寄存器; always块内,reg型变量always@(posedge clk)if(reset == 1'b0)cnt <= 2'd0;else if(cnt == 2'd2)//从0开始,计数到2,计数为3,则6分频cnt <= 2'd0;elsecnt <= cnt + 1'b1;
//计数3次,输出翻转;所以cnt计数3次作为标志,实现翻转功能                    always@(posedge clk)if(reset == 1'b0)clk_out <= 1'b0;else if(cnt == 2'd2)clk_out <= ~clk_out;else;
endmodule
   tb
`timescale 1ns/100ps
`define clk_cycle 50module divider_six_tb;reg clk;reg reset;wire clk_out;wire [1:0]cnt;always #(`clk_cycle) clk = ~clk;//产生测试时钟,时钟周期100ns(s>ms>us>ns>ps)initial beginclk = 0;reset = 1;#10 reset = 0;#110 reset = 1;#100000$stop;enddivider_six u1(.reset(reset),.clk(clk),.clk_out(clk_out),.cnt(cnt));
endmodule
   仿真波形


奇数分频

算法:需要在系统时钟为上升沿和下降沿都工作(不是同时工作)
    产生50%的占空比,需要设计两个分频时钟跳变点,分频周期的N-1(N-1)/2
例:13分频:两个分频时钟跳变点:6[(13-1)/2]和12[13-1],此时输出保持7个高电平时钟周期,6个低电平时钟周期分别在上升沿触发clk1和下降沿触发clk2,两者相位相差半个单位周期,clk_out = clk1 & clk2; 之后clk_out占空比50%
如图仿真波形:

  仿真波形

  代码
//13分频,占空比为50%module div_13(clk,reset,clk_out,clk1,clk2);input clk;input reset;output  clk_out;reg [3:0] cnt;output reg clk1;output reg clk2;//计数从0到12         always@(posedge clk)if(reset == 1'b0 || cnt == 4'd12)cnt <= 4'd0;elsecnt <= cnt + 1'b1;//实现分频,clk1:7个高电平时钟周期,6个低电平时钟周期,上升沿触发    always@(posedge clk)                if(reset == 1'b0)clk1 <= 1'b0;else if(cnt == 4'd6)//复位后,计数到6,开始低电平,保持6个周期,clk1 <= 1'b0;   //此时计数到12,重新计数,保持高电平直至计数到6else if(cnt == 4'd12)//计数到6和12,这两个是分频跳变点clk1 <= 1'b1;   //如何得到?N-1;(N-1)/2
//clk2:下降沿触发,7个高电平时钟周期,6个低电平时钟周期always@(negedge clk)    if(reset == 1'b0)clk2 <= 1'b0;else if(cnt == 4'd6)clk2 <= 1'b0;else if(cnt == 4'd12)clk2 <= 1'b1;
//clk1,clk2两者相差半个时钟周期
//clk1,clk2配合作用,都计数7次后,clk1立即回到低电平,而clk2延迟半个周期                    assign clk_out = clk1 & clk2;
endmodule
  tb
`timescale 1ns/100ps
`define clk_cycle 50module div_13_tb;reg clk;reg reset;wire clk_out;wire clk1;wire clk2;always #(`clk_cycle) clk = ~clk;//产生测试时钟,时钟周期100ns(s>ms>us>ns>ps)initial beginclk = 0;reset = 1;#10 reset = 0;#110 reset = 1;#100000$stop;enddiv_13 u1(.reset(reset),.clk(clk),.clk_out(clk_out),.clk1(clk1),.clk2(clk2));
endmodule

小数分频

   说明

1.等效意义上的小数分频:例5.3分频,没有周期为5.3的分频电路,实际是输出时钟53的周期对应于输出时钟的10个周期。
2.按序输出:时钟用处不大,没有意义
3.插入乱序输出:防止相位抖动,把多出来的脉冲均匀分散开

 半整数分频:N+0.5

思路:例:5.5分频
原时钟的半周期为单位,此时周期为11可分频输出6高5低。
上升沿触发,使得clk1前6周期输出高电平【N-1=10为一个跳变点】后5周期输出低电平【N-1)/2=5为另一个跳变点】;
下降沿触发使得clk2前5周期为低电平(cnt为0时的跳变点),后6【cnt=N-1)/2=5】周期为高电平。两个信号相与即为分频信号clk_div = clk1 & clk2;,类似奇分频

  仿真波形

  代码
//5.5分频
//原时钟周期一半为单位,输出1高10低,从0到10计数,前6周期高电平,后5周期低电平;
//再使用下降沿触发前5周期低电平,前6周期高电平,最后相与
module div_half_1(clk,rst_n,clk_div,clk1,clk2,cnt);input clk;input rst_n;output clk_div;output reg[3:0] cnt;output reg clk1;output reg clk2;
//从0到10计数 模11      always@(posedge clk or negedge rst_n)if(!rst_n)cnt <= 4'd0;else if (cnt==4'd10)cnt <= 0;elsecnt <= cnt + 1'b1;always@(posedge clk or negedge rst_n)if(!rst_n)clk1 <= 1'b0;else if(cnt==4'd10)//6个周期的高电平N-1=10clk1 <= 1'b1;else if(cnt==4'd5)//5个周期的低电平(N-1)/2=5clk1 <= 1'b0;  //两个跳变点,(N-1)/2;N-1
//clk2相比于clk1延时半个时钟周期,            always@(negedge clk or negedge rst_n)if(!rst_n)clk2 <= 1'b0;else if(cnt==4'd0)//5个周期的低电平clk2 <= 1'b0;else if(cnt==4'd5)//6个周期的高电平clk2 <= 1'b1;assign clk_div = clk1 & clk2;
endmodule
  tb
`timescale 1ns/100ps
`define clk_cycle 50module div_half_1_tb;reg clk;reg reset;wire clk_out;wire clk1;wire clk2;wire[3:0] cnt;always #(`clk_cycle) clk = ~clk;//产生测试时钟,时钟周期100ns(s>ms>us>ns>ps)initial beginclk = 0;reset = 1;#10 reset = 0;#110 reset = 1;#100000$stop;enddiv_half_1 u1(.rst_n(reset),.clk(clk),.clk_div(clk_out),.clk1(clk1),.clk2(clk2),.cnt(cnt));
endmodule

 小数分频

   5.3分频

53/10=5.3 设5分频a次;6分频次
a+b=10;
5a+6b=53 ->a=7 ; b=3
如何插入排序:6556556555
Verilog实现:
脉冲删除:53个单位周期删除43个
算法:分母作为累加值,在clk的上升沿cnt加上分母10,判断是否大于分子,若小于(脉冲删除标志为1,删除)继续累加,若大于(脉冲删除标志为0,不删除)在下一周期减去分子。结果刚好是6556556555(由来:分母-余数=7,作为累加值,大于分母,输出N分频,然后减去分母,继续累加7,;小于分母,输出N+1分频)

  代码
//脉冲删除小数分频module div_5_3_1(clk,rst_n,clk_out,cnt);  input clk;input rst_n;output clk_out;parameter fra = 6'd53;//分子parameter den = 6'd10;//分母output reg[5:0] cnt;reg flag_del;//脉冲删除标志位always@(posedge clk or negedge rst_n) beginif(!rst_n)begincnt <= 6'd0;flag_del <= 1'b0;end//大于分子,不删除  else if(cnt>fra) begincnt <= cnt + den - fra;flag_del <= 1'b0;end//小于分子,累加;删除:保持高电平else begincnt <= cnt + den;flag_del <= 1'b1;endend assign clk_out = flag_del ? 1 : clk;endmodule
  tb
`timescale 1ns/100ps
`define clk_cycle 50module div_5_3_1_tb;reg clk;reg reset;wire clk_out;wire [5:0]cnt;always #(`clk_cycle) clk = ~clk;//产生测试时钟,时钟周期100ns(s>ms>us>ns>ps)initial beginclk = 0;reset = 0;#10 reset = 0;#110 reset = 1;#100000$stop;enddiv_5_3_1 u1 (.clk(clk),.rst_n(reset),.clk_out(clk_out),.cnt(cnt));
endmodule
  仿真波形

最后

不足之处:未实现参数化编程;

参考:

https://blog.csdn.net/weixin_43698385/article/details/122773225
https://blog.csdn.net/Reborn_Lee/article/details/97553078
https://blog.csdn.net/wangyanchao151/article/details/81204126?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%B0%8F%E6%95%B0%E5%88%86%E9%A2%91&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-5-81204126.nonecase&spm=1018.2226.3001.4187

FPGA基础设计(二):任意分频器(奇数,偶数,小数)相关推荐

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

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

  2. FPGA基础设计(二):PS2键盘控制及短按、长按

    概述   PS2键盘也是一个经典的实验,可能很多人接触如何对通信协议.时序编程就是从这个实验开始学习的.USB键盘已经很普及,现在市场上还是有一些USB转PS2的转接头,还有一些转换芯片.这个实验虽然 ...

  3. FPGA基础设计(9)Verilog数据类型和表达式

    阅读<IEEE Standard for Verilog 2005>时,做一些整理和记录. 目录 1.数据类型 2.变量(variable) 3.数组 4.表达式 4.1 运算符 除法 / ...

  4. FPGA基础设计(11)Verilog任务、函数、系统任务、系统函数

    目录 1.概述 2.函数(function) 3.任务(task) 4.系统任务 4.1 显示任务 4.1.1 display和write任务 4.1.2 strobe监控 4.1.3 连续监控 4. ...

  5. Vivado FPGA基础设计操作流程(1)

    提示:适合小小白的入门操作流程 文章目录 一.新建工程(.xpr) 二.新建Verilog文件(.v) 三.RTL 描述和分析过程( RTL Analysis ) 四.添加TB文件,做功能仿真 伍.设 ...

  6. FPGA基础设计(一):VGA显示方法(文字、图形、波形)

    概述   VGA是一种学习FPGA最常见的基础实验.虽然现在的显示屏大多已经采用DVI和HDMI方案,但其实VGA在另一个地方还有应用,那就是大屏的LCD.目前4.3寸以上的TFT基本都是VGA接口, ...

  7. FPGA基础设计(10)Verilog行为级建模(过程赋值)

    目录 1.过程赋值 1.1 特性1 1.2 特性2 2.过程连续赋值 3.case语句 3.1 do-not-cares 3.2 常数case 4.循环语句 5. 过程块 5.1 零延迟无限循环 5. ...

  8. FPGA基础设计之数码管显示

    1.数码管简介 数码管是一种半导体发光器件,其基本单元是发光二极管.一般分为七段数码管和八段数码管,多的一段是小数点.也有其他如N型.米型数码管以及16段.24段管等.本次设计的是八段数码管 1.1 ...

  9. FPGA 任意分频器设计

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

最新文章

  1. android ndk platform,Android NDK Platform Build and Application
  2. Android开发进阶之NIO非阻塞包(一)
  3. 提权命令_利用Linux文本操作命令ed进行提权
  4. java 线程同步的list_java线程生产者与消费者实例(使用List实现同步)
  5. param参数服务器
  6. Unity3d开发IOS游戏 基础
  7. requests模块报错:Use body.encode('utf-8') if you want to send it encoded in UTF-8.
  8. Windows7和Ubuntu9.10完美硬盘安装(2)
  9. Asp.net 后台添加Meta标签方法
  10. QC的七大手法和八大原则
  11. 3dmax界面由哪几部分组成
  12. digester java_Java-Digester:提取节点名称
  13. python爬虫爬取网站视频
  14. qq企业邮箱怎么删除邮件服务器,腾讯企业邮箱如何删除邮件,有什么要注意的呢?...
  15. 获取国家法定节假日和周末
  16. TIA西门子博途V17安装教程及注意事项
  17. matlab中绘制图像
  18. 3dmax软件的制作木桶过程:三步流程
  19. CEVA-Xx_V17.1.0_64b安装步骤
  20. python 读文件 如何从第二行开始

热门文章

  1. PostgreSQL 15 preview -:你了解PostgreSQL GUC 参数吗?
  2. 大学是人生的关键阶段
  3. 翻译1The high-volume return premium(后附读后感)(图表上传不了)
  4. 计算机二级msoffice裸考,如何拯救计算机二级office裸考,附计算机二级题库
  5. 【输出N行杨辉三角形】两种输出方式(直角三角形型和等腰三角形型)C语言
  6. MySQL的四种事务隔离级别
  7. 设定lib包下所有的jar到classpath
  8. 高端大气上档次的搜索引擎......
  9. GPS网检验重复边和同步环是否合格
  10. 《监控视频异常检测: 综述》王志国, 章毓晋笔记