n分频器 verilog_基于Verilog的分频器实现
分频器是指使输出信号频率为输入信号频率整数分之一的电子电路。在许多电子设备中如电子钟、频率合成器等,需要各种不同频率的信号协同工作,常用的方法是以稳定度高的晶体振荡器为主振源,通过变换得到所需要的各种频率成分,分频器是一种主要变换手段。早期的分频器多为正弦分频器,随着数字集成电路的发展,脉冲分频器(又称数字分频器)逐渐取代了正弦分频器。下面以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的分频器实现相关推荐
- 【FPGA教程案例8】基于verilog的分频器设计与实现
FPGA教程目录 MATLAB教程目录 -------------------------------------------------------------------------------- ...
- n分频器 verilog_时钟分频系列——分数分频电路的Verilog实现
IC君的第47篇原创文章 上一篇文章时钟分频系列--偶数分频/奇数分频/分数分频,IC君介绍了各种分频器的设计原理,其中分数分频器较为复杂,这一篇文章IC君再跟大家聊聊分数分频的具体设计实现. 一个分 ...
- 实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)
实验二 基于FPGA的分频器的设计 1. 实验目的: (1) 掌握QuartusⅡ软件的层次型设计方法: (2) 掌握元件封装及调用方法: (3) 熟悉FPGA实验平台,掌握引脚锁定及下载. 2. 实 ...
- matlab模拟二分频器,基于移位寄存器的分频器
基于移位寄存器的分频器 [复制链接] (二)可编程分频器 在数字系统设计中,经常需要频率不同的时钟信号.它们通常都是系统时钟CP的若干分频,并且分频比往往是可变的,这种分频器称为可编程分频器.采用SS ...
- 数字IC笔面基础,动不动就手撕——奇偶分频器(分频器简介和Verilog实现)
分频器简介和Verilog实现 写在前面的话 偶数分频 级联触发器实现2^n偶数分频 计数器实现2n偶数分频 奇数分频(常考) 奇数分频,占空比50%(最常考,要求熟练掌握一种) OR操作,2N+1 ...
- FPGA学习之路—应用程序—基于Verilog设计单总线8位ALU
FPGA学习之路--基于Verilog设计单总线8位ALU 定义 ALU(arithmetic and logic unit) 算术逻辑单元,简称ALU,是计算机的数学运算核心,也就是负责运算的组件, ...
- 基于verilog贪吃蛇游戏设计
概述 基于verilog贪吃蛇游戏设计.使用verilog语言 小游戏主要分为以下几个模块:顶层模块.VGA显示模块.蛇身控制模块.苹果控制模块. 系统主要分为顶层模块.VGA显示模块.蛇身控制模块. ...
- 基于Verilog HDL的数字时钟
目录 一.实验目的 二.实验概述 三.实验过程 一.实验目的 1.学习相关的设计方法及原理 2.学习设计方法 二.实验概述 基于Verilog HDL设计一个时钟 三.实验过程 新建一个工程 选择芯片 ...
- 国产智多晶FPGA基于Verilog的设计开发流程
大家好,我是小梅哥,这里给大家介绍国产FPGA厂家"西安智多晶"微电子的FPGA基于Verilog进行逻辑设计的开发流程,步骤详细,可作为大家的评估参考.本博客将陆续发表更多国产F ...
最新文章
- 收集了100+论文的最新综述来了!基于深度学习的图像深度重建
- iOS开发多线程篇—自定义NSOperation
- js入门·表单详解一(修改表单属性,修改表单元素值)
- 百度AI技术盛宴来了!大咖齐聚解读CV/NLP/跨模态大模型技术!
- oracle ns,RAC到单实例SWITCHOVER
- 去除div css背景,jQuery-拖动div CSS背景
- .NET 3.5 Socket APM
- acegis连接使用方法_arcgis工具使用方法
- Springboot导出excel工具类
- 虚拟机安装win10专业版
- java购物结算_Java编写网上超市购物结算功能程序
- Python 遗传算法实现字符串
- 总结Python中的字符串格式化
- easyrecovery2023最新免费版电脑数据恢复软件使用教程
- 教您正确理解时钟器件的抖动性能
- 当你人生迷失方向时候,请打开这个……
- 上下文感知分析:对最重要的漏洞进行优先级排序
- 用GRUB2来实现——坎特伯雷项目 The Canterbury Project
- 网通、电信、教育网IP查询
- 直播进行时:抓亮点、控节奏、营造氛围