Verilog实现奇分频电路
在FPGA中,计数器电路用途很广,一般计数器电路都可作为分频电路。实现占空比为50的偶分频电路很好实现。但实现占空比为50的奇分频电路有点难度。下面给出一个简单例子,记录学习奇分频电路的过程。
实现占空比为50的5分频电路,高低电平应都为2.5个时钟周期。即应当在上升沿和下降沿都要采样,这样才会产生出0.5个时钟周期的差。
公式为 奇分频 N 边沿的采集 每隔 N/2 翻转 和 每隔 N-1 翻转。

仿真波形图如下所示:
上升沿:

下降沿:

整体:

其中在上升沿采集中,低电平持续3个时钟周期,高电平持续2个时钟周期。其中在下升沿采集中,低电平持续3个时钟周期,高电平持续2个时钟周期。上升沿与下降沿之间错0.5个时钟周期,即整体为2.5+2.5=5。以后奇分频都可以这样操作。
下附代码和测试激励。
module divfreq(
input clk,
input rst_n,
output clk1x,
output reg clk1xpose,
output reg clk1xnege,
output reg [2:0] coutpose,
output reg [2:0] coutnege
);
parameter N=5;
parameter div1 = N/2 , div2 = N-1; // div1 = 5 / 2, div2 = 5 - 1 always@(posedge clk or negedge rst_n) //上升沿触发波形
begin
if(!rst_n)
clk1xpose = 0;
else if(coutpose == div1)
clk1xpose = ~clk1xpose;
else if(coutpose == div2)
clk1xpose = ~clk1xpose;
else
clk1xpose = clk1xpose;
end always@(negedge clk or negedge rst_n) //下降沿触发波形
begin
if(!rst_n)
clk1xnege = 0;
else if(coutnege == div1)
clk1xnege = ~clk1xnege;
else if(coutnege == div2)
clk1xnege = ~clk1xnege;
else
clk1xnege = clk1xnege;
end always@(posedge clk or negedge rst_n) //上升沿计数5
begin
if(!rst_n)
coutpose = 0;
else if(coutpose == div2)
coutpose = 0;
else
coutpose = coutpose + 1;
end always@(negedge clk or negedge rst_n) //下降沿计数5
begin
if(!rst_n)
coutnege = 0;
else if(coutnege == div2)
coutnege = 0;
else
coutnege = coutnege + 1;
end assign clk1x = clk1xpose | clk1xnege; //输出波形 endmodule
`timescale 1ns/1ns
module tb_divfreq (); reg clk ;
reg rst_n ;
wire clk1x ;
wire clk1xpose ;
wire clk1xnege ;
wire [2:0] coutpose ;
wire [2:0] coutnege ; initial
begin
clk = 1'b1 ;
rst_n <= 1'b0 ;
#10
rst_n <=1'b1 ;
end always #10 clk=~clk; divfreq divfreq_inst (
.clk (clk) ,
.rst_n (rst_n) ,
.clk1x (clk1x) ,
.clk1xpose (clk1xpose) ,
.clk1xnege (clk1xnege) ,
.coutpose (coutpose) ,
.coutnege (coutnege)
); endmodule
后附正点原子中的另外一种代码风格,但整体思路一致。
波形仿真:
上升沿:

下降沿:

整体:

后附正点原子奇分频代码和激励代码。
module divfreq1
(
input clk , // system clock 50Mhz on board
input rst_n, // system rst, low active
output out_clk // output signal
); parameter N = 5 ; reg [N/2 :0] cnt_1 ;
reg [N/2 :0] cnt_2 ; reg out_clk1 ;
reg out_clk2 ; //=====================================================================
// ------------------------- MAIN CODE -------------------------------
//=====================================================================
always @(posedge clk or negedge rst_n) begin //上升沿输出 out_clk1
if(!rst_n) begin
out_clk1 <= 0;
cnt_1 <= 1; //这里计数器从 1 开始
end
else begin
if(out_clk1 == 0) begin
if(cnt_1 == N/2+1) begin
out_clk1 <= ~out_clk1;
cnt_1 <= 1;
end
else
cnt_1 <= cnt_1+1;
end
else if(cnt_1 == N/2) begin
out_clk1 <= ~out_clk1;
cnt_1 <= 1;
end
else
cnt_1 <= cnt_1+1;
end
end always @(negedge clk or negedge rst_n) begin //下降沿输出 out_clk2
if(!rst_n) begin
out_clk2 <= 0;
cnt_2 <= 1; //这里计数器从 1 开始
end
else begin
if(out_clk2 == 0) begin
if(cnt_2 == N/2+1) begin
out_clk2 <= ~out_clk2;
cnt_2 <= 1;
end
else
cnt_2 <= cnt_2+1;
end
else if(cnt_2 == N/2) begin
out_clk2 <= ~out_clk2;
cnt_2 <= 1;
end
else
cnt_2 <= cnt_2+1;
end
end assign out_clk = out_clk1 | out_clk2; //输出最后波形 endmodule
`timescale 1ns/1ns
module tb_divfreq1 (); reg clk ;
reg rst_n ;
wire out_clk ; initial
begin
clk = 1'b1 ;
rst_n <= 1'b0 ;
#10
rst_n <=1'b1 ;
end always #10 clk=~clk; divfreq1 divfreq1_inst
(
.clk (clk) , // system clock 50Mhz on board
.rst_n (rst_n) , // system rst, low active
.out_clk (out_clk) // output signal
); endmodule
参考资料:
1、正点原子逻辑设计指南
2、某奇分频笔试题
Verilog实现奇分频电路的更多相关文章
- Verilog学习笔记简单功能实现(六)...............计数分频电路
在分频器电路中最重要的概念有两个:1)奇分频/偶分频:2)占空比. A)其中最简单的就是二分频电路,占空比为50%,其Verilog程序为 module half_clk(clr,clk_in,clk ...
- [原创][FPGA]时钟分频之奇分频(5分频)
0. 简介 有时在基本模块的设计中常常会使用到时钟分频,时钟的偶分频相对与奇分频比较简单,但是奇分频的理念想透彻后也是十分简单的,这里就把奇分频做一个记录. 1. 奇分频 其实现很简单,主要为使用两个 ...
- 你要的fpga&数字前端笔面试题都在这儿了
转自http://ninghechuan.com 你要的FPGA&数字前端笔面试题来了 FPGA&ASIC基本开发流程 题目:简述ASIC设计流程,并列举出各部分用到的工具. 勘误:C ...
- 基于verilog的分频器设计(奇偶分频原理及其电路实现:上)
在一个数字系统中往往需要多种频率的时钟脉冲作为驱动源,这样就需要对FPGA的系统时钟(频率太高)进行分频.分频器主要分为奇数分频,偶数分频,半整数分频和小数分频,在对时钟要求不是很严格的FPGA系统中 ...
- Verilog设计分频器(面试必看)
分频器是指使输出信号频率为输入信号频率整数分之一的电子电路.在许多电子设备中如电子钟.频率合成器等,需要各种不同频率的信号协同工作,常用的方法是以稳定度高的晶体振荡器为主振源,通过变换得到所需要的各种 ...
- FPGA分频与倍频的简单总结(涉及自己设计,调用时钟IP核,调用MMCM原语模块)
原理介绍 1.分频 FPGA设计中时钟分频是重要的基础知识,对于分频通常是利用计数器来实现想要的时钟频率,由此可知分频后的频率周期更大.一般而言实现偶数系数的分频在程序设计上较为容易,而奇数分频则相对 ...
- 惠威的M200MK3的前级电子分频板
M200MKIII是惠威融合了尖端有源电子分频技术而诞生的全新产品:双4声道运算放大器.高档玻璃纤维电路板.全SMT制作工艺.红宝石滤波电容阵列.进口金属化聚丙稀分频电容.超大功率TDA7294功放芯 ...
- 时钟晶振32.768KHz为什么是15分频?
实时时钟晶振为什么选择是32768Hz的晶振,在百度上搜索的话大部分的答案都是说2的15次方是32768,使用这个频率的晶振,人们可以很容易的通过分频电路得到1Hz的计时脉冲.但是话有说回来了,2的整 ...
- Verilog分频器的设计
大三都要结束了,才发现自己太多东西没深入学习. 对于偶分频:(计数到分频数的一半就翻转) 注: 图中只用了一个计数器,当然也可以用多个: 图中只计数到需要分频的一半,当然也可计数到更多: 图中从第一个 ...
- FPGA基础(verilog语言)——语法篇
verilog语言简介 verilog语言是一种语法类似于c的语言,但是与c语言也有不同之处,比如: 1.verilog语言是并行的,每个always块都是同时执行,而c语言是顺序执行的 2.veri ...
随机推荐
- 安装MongoDB、及基本使用
1.MongoDB简介 MongoDB是一个介于关系数据库和非关系数据库之间的产品,基于分布式文件存储的数据库.是非关系数据库当中功能最丰富,最像关系数据库的.它支持的数据结构非常松散,是类似json ...
- shell执行一个程序过程
1:shell调用执行程序或脚本 2:unix内核启动一个新的进程,在该进程中执行所指定的程序. 3:如果是编译型程序,内核成执行,如果无法执行指定的程序,返回"not executable ...
- Python 遍历整个列表
操作列表 遍历整个列表,无论列表有多长,循环让列表中的每一个元素都采取一个或一系列相同的措施,从而高效地处理任何长度的列表,包含数以千至数百万个元素的列表. 遍历整个列表 通过for循环解决遍历 从列 ...
- 百度飞桨(PaddlePaddle)安装
注意:32位pip没有PaddlePaddle源 # 如果报下列错误,检查 Python 版本,不能过高也不要太低,并且不能是 32位的. ERROR: Could not find a versio ...
- 2020-11-18:java中,到底多大的对象会被直接扔到老年代?
福哥答案2020-11-18: HotSpot 虚拟机提供了-XX:PretenureSizeThreshold 参数,指定大于该设置值的对象直接在老年代分配,这样做的目的就是避免在 Eden 区及两 ...
- Django4全栈进阶之路8 createsuperuser创建超级管理员账号
在 Django 4 中,可以使用 createsuperuser 命令来创建超级管理员账号.超级管理员拥有管理后台的所有权限,包括创建.编辑和删除用户.组.权限等操作. 下面是创建超级管理员账号的步 ...
- vue全家桶进阶之路5:DOM文档对象模型
一.DOM对象 DOM,全称"DocumentObjectModel(文档对象模型)",它是由W3C组织定义的一个标准. 在前端开发时,我们往往需要在页面某个地方添加一个元素或者删 ...
- 安装vue cli3以及配置环境 镜像下载
安装vue cli3以及配置环境 镜像下载 1.下载安装Node.js 安装vue cli3之前需要先安装Node.js,方便对vue进行下载 node.js的下载与安装方法在隔壁哟 地址:https ...
- protoBuf 实现客户端与服务端
转载请注明出处: 1.定义消息格式 在 src/main/proto 目录下创建 person.proto 文件,并定义消息格式,例如: syntax = "proto3"; pa ...
- Python潮流周刊#3:PyPI 的安全问题
你好,我是豌豆花下猫.这里记录每周值得分享的 Python 及通用技术内容,部分为英文,已在小标题注明.(标题取自其中一则分享,不代表全部内容都是该主题,特此声明.) 文章&教程 1.掌握Py ...