分频器是指使输出信号频率为输入信号频率整数分之一的电子电路。在许多电子设备中如电子钟、频率合成器等,需要各种不同频率的信号协同工作,常用的方法是以稳定度高的晶体振荡器为主振源,通过变换得到所需要的各种频率成分,分频器是一种主要变换手段。早期的分频器多为正弦分频器,随着数字集成电路的发展,脉冲分频器(又称数字分频器)逐渐取代了正弦分频器。下面以Verilog HDL语言为基础介绍占空比为50%的分频器。

1偶分频

偶分频比较简单,假设为N分频,只需计数到N/2-1,然后时钟翻转、计数清零,如此循环就可以得到N(偶)分频。代码如下。

module fp_even(clk_out,clk_in,rst);

output clk_out;

input clk_in;

input rst;

reg [1:0] cnt;

reg clk_out;

parameter N=6;

always @ (posedge clk_in or negedge rst)

begin

if(!rst)

begin

cnt <= 0;

clk_out <= 0;

end

else begin

if(cnt==N/2-1)

begin clk_out <= !clk_out; cnt<=0; end

else

cnt <= cnt + 1;

end

end

endmodule

可以通过改变参量N的值和计数变量cnt的位宽实现任意偶分频。

偶分频(N=6)的RTL原理图:

偶分频(N=6)的行为仿真结果:

2奇分频

实现奇数(N)分频,分别用上升沿计数到(N-1)/2,再计数到N-1;用下降沿计数到(N-1)/2,再计数到N-1,得到两个波形,然后把它们相或即可得到N分频。代码如下:

module fp_odd(clk_out,clk_p,clk_n,clk_in,rst);

output clk_out;

output clk_p,clk_n;

input clk_in,rst;

reg [2:0] cnt_p,cnt_n;

reg clk_p,clk_n;

parameter N=5;

always @ (posedge clk_in or negedge rst)

begin

if(!rst)cnt_p <= 0;

elseif(cnt_p==N-1)cnt_p <=0;

else cnt_p <= cnt_p + 1;

end

always @ (posedge clk_in or negedge rst)

begin

if(!rst) clk_p <= 0;

else if(cnt_p==(N-1)/2)

clk_p <= !clk_p;

else if(cnt_p==N-1)

clk_p <= !clk_p;

end

always @ (negedge clk_in or negedge rst)

begin

if(!rst)cnt_n <= 0;

elseif(cnt_n==N-1)cnt_n <=0;

else cnt_n <= cnt_n + 1;

end

always @ (negedge clk_in or negedge rst)

begin

if(!rst) clk_n <= 0;

else if(cnt_n==(N-1)/2)

clk_n <= !clk_n;

else if(cnt_n==N-1)

clk_n <= !clk_n;

end

assign clk_out = clk_p | clk_n;

endmodule

RTL Schematic:

Simulate Behavioral Model:

同理,可以通过改变参量N的值和计数变量cnt_p和cnt_n的位宽实现任意奇分频。

3任意占空比的任意分频

在verilog程序设计中,我们往往要对一个频率进行任意分频,而且占空比也有一定的要求这样的话,对于程序有一定的要求,现在在前面两个实验的基础上做一个简单的总结,实现对一个频率的任意占空比的任意分频。

比如:FPGA系统时钟是50M Hz,而我们要产生的频率是880Hz,那么,我们需要对系统时钟进行分频。很容易想到用计数的方式来分频:50000000/880 = 56818。显然这个数字不是2的整幂次方,那么我们可以设定一个参数,让它到56818的时候重新计数就可以实现了。程序如下:

module div(clk, clk_div);

input clk;

output clk_div;

reg [15:0] counter;

always @(posedge clk)

if(counter==56817) counter <= 0;

else counter <= counter+1;

assign clk_div = counter[15];

endmodule

分频的应用很广泛,一般的做法是先用高频时钟计数,然后使用计数器的某一位输出作为工作时钟进行其他的逻辑设计,上面的程序就是一个体现。

下面我们来算一下它的占空比:我们清楚地知道,这个输出波形在counter为0到32767的时候为低,在32768到56817的时候为高,占空比为40%多一些,如果我们需要占空比为50%,那么我们需要再设定一个参数,使它为56817的一半,使达到它的时候波形翻转,就可以实现结果了。程序如下:

module div(clk, clk_div);

input clk;

output clk_div;

reg [14:0] counter;

always @(posedge clk)

if(counter==28408) counter <= 0;

else counter <= counter+1;

reg clk_div;

always @(posedge clk)

if(counter==28408) clk_div <= ~clk_div;

endmodule

继续让我们来看如何实现任意占空比,比如还是由50 M分频产生880Hz,而分频得到的信号的占空比为30%。

56818×30%=17045

module div(clk,reset,clk_div,counter);

input clk,reset;

output clk_div;

output [15:0] counter;

reg [15:0] counter;

reg clk_div;

always @(posedge clk)

if(!reset) counter <= 0;

else if(counter==56817) counter <= 0;

else counter <= counter+1;

always @(posedge clk)

if(!reset) clk_div <= 0;

else if(counter<17045) clk_div <= 1;

else clk_div <= 0;

endmodule

RTL级描述:

仿真结果:

4小结

通过以上几个例子对比不难发现,借助计数器来实现任意点空比的任意分频的方法简单,且用verilog语言进行行为描述时,代码简洁、易懂、通用。通过以上的学习,对分频器有了比较深刻的认识,将在以后的学习中会有广泛的应用。

n分频器 verilog_基于Verilog的分频器实现相关推荐

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

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

  2. n分频器 verilog_时钟分频系列——分数分频电路的Verilog实现

    IC君的第47篇原创文章 上一篇文章时钟分频系列--偶数分频/奇数分频/分数分频,IC君介绍了各种分频器的设计原理,其中分数分频器较为复杂,这一篇文章IC君再跟大家聊聊分数分频的具体设计实现. 一个分 ...

  3. 实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)

    实验二 基于FPGA的分频器的设计 1. 实验目的: (1) 掌握QuartusⅡ软件的层次型设计方法: (2) 掌握元件封装及调用方法: (3) 熟悉FPGA实验平台,掌握引脚锁定及下载. 2. 实 ...

  4. matlab模拟二分频器,基于移位寄存器的分频器

    基于移位寄存器的分频器 [复制链接] (二)可编程分频器 在数字系统设计中,经常需要频率不同的时钟信号.它们通常都是系统时钟CP的若干分频,并且分频比往往是可变的,这种分频器称为可编程分频器.采用SS ...

  5. 数字IC笔面基础,动不动就手撕——奇偶分频器(分频器简介和Verilog实现)

    分频器简介和Verilog实现 写在前面的话 偶数分频 级联触发器实现2^n偶数分频 计数器实现2n偶数分频 奇数分频(常考) 奇数分频,占空比50%(最常考,要求熟练掌握一种) OR操作,2N+1 ...

  6. FPGA学习之路—应用程序—基于Verilog设计单总线8位ALU

    FPGA学习之路--基于Verilog设计单总线8位ALU 定义 ALU(arithmetic and logic unit) 算术逻辑单元,简称ALU,是计算机的数学运算核心,也就是负责运算的组件, ...

  7. 基于verilog贪吃蛇游戏设计

    概述 基于verilog贪吃蛇游戏设计.使用verilog语言 小游戏主要分为以下几个模块:顶层模块.VGA显示模块.蛇身控制模块.苹果控制模块. 系统主要分为顶层模块.VGA显示模块.蛇身控制模块. ...

  8. 基于Verilog HDL的数字时钟

    目录 一.实验目的 二.实验概述 三.实验过程 一.实验目的 1.学习相关的设计方法及原理 2.学习设计方法 二.实验概述 基于Verilog HDL设计一个时钟 三.实验过程 新建一个工程 选择芯片 ...

  9. 国产智多晶FPGA基于Verilog的设计开发流程

    大家好,我是小梅哥,这里给大家介绍国产FPGA厂家"西安智多晶"微电子的FPGA基于Verilog进行逻辑设计的开发流程,步骤详细,可作为大家的评估参考.本博客将陆续发表更多国产F ...

最新文章

  1. 收集了100+论文的最新综述来了!基于深度学习的图像深度重建
  2. iOS开发多线程篇—自定义NSOperation
  3. js入门·表单详解一(修改表单属性,修改表单元素值)
  4. 百度AI技术盛宴来了!大咖齐聚解读CV/NLP/跨模态大模型技术!
  5. oracle ns,RAC到单实例SWITCHOVER
  6. 去除div css背景,jQuery-拖动div CSS背景
  7. .NET 3.5 Socket APM
  8. acegis连接使用方法_arcgis工具使用方法
  9. Springboot导出excel工具类
  10. 虚拟机安装win10专业版
  11. java购物结算_Java编写网上超市购物结算功能程序
  12. Python 遗传算法实现字符串
  13. 总结Python中的字符串格式化
  14. easyrecovery2023最新免费版电脑数据恢复软件使用教程
  15. 教您正确理解时钟器件的抖动性能
  16. 当你人生迷失方向时候,请打开这个……
  17. 上下文感知分析:对最重要的漏洞进行优先级排序
  18. 用GRUB2来实现——坎特伯雷项目 The Canterbury Project
  19. 网通、电信、教育网IP查询
  20. 直播进行时:抓亮点、控节奏、营造氛围

热门文章

  1. u大侠pe系统桌面计算机,详解各种PE启动的过程
  2. Kubernetes集群部署
  3. 问题 B: PK吹泡泡(Kruscal)
  4. 2021云数据库RDS重磅升级发布会
  5. 深度解读 MongoDB 4.4 新特性
  6. html删除一行增加一行,html怎么增加一行
  7. 腾讯光子《黎明觉醒》技术美术负责人:如何制作超真实的开放世界?
  8. 横版游戏的摄像机移动理论与实践(上)
  9. Oracle dbtimezone与os时区不一致的解决办法
  10. 页面缓存导致数据错误