在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实现奇分频电路的更多相关文章

  1. Verilog学习笔记简单功能实现(六)...............计数分频电路

    在分频器电路中最重要的概念有两个:1)奇分频/偶分频:2)占空比. A)其中最简单的就是二分频电路,占空比为50%,其Verilog程序为 module half_clk(clr,clk_in,clk ...

  2. [原创][FPGA]时钟分频之奇分频(5分频)

    0. 简介 有时在基本模块的设计中常常会使用到时钟分频,时钟的偶分频相对与奇分频比较简单,但是奇分频的理念想透彻后也是十分简单的,这里就把奇分频做一个记录. 1. 奇分频 其实现很简单,主要为使用两个 ...

  3. 你要的fpga&数字前端笔面试题都在这儿了

    转自http://ninghechuan.com 你要的FPGA&数字前端笔面试题来了 FPGA&ASIC基本开发流程 题目:简述ASIC设计流程,并列举出各部分用到的工具. 勘误:C ...

  4. 基于verilog的分频器设计(奇偶分频原理及其电路实现:上)

    在一个数字系统中往往需要多种频率的时钟脉冲作为驱动源,这样就需要对FPGA的系统时钟(频率太高)进行分频.分频器主要分为奇数分频,偶数分频,半整数分频和小数分频,在对时钟要求不是很严格的FPGA系统中 ...

  5. Verilog设计分频器(面试必看)

    分频器是指使输出信号频率为输入信号频率整数分之一的电子电路.在许多电子设备中如电子钟.频率合成器等,需要各种不同频率的信号协同工作,常用的方法是以稳定度高的晶体振荡器为主振源,通过变换得到所需要的各种 ...

  6. FPGA分频与倍频的简单总结(涉及自己设计,调用时钟IP核,调用MMCM原语模块)

    原理介绍 1.分频 FPGA设计中时钟分频是重要的基础知识,对于分频通常是利用计数器来实现想要的时钟频率,由此可知分频后的频率周期更大.一般而言实现偶数系数的分频在程序设计上较为容易,而奇数分频则相对 ...

  7. 惠威的M200MK3的前级电子分频板

    M200MKIII是惠威融合了尖端有源电子分频技术而诞生的全新产品:双4声道运算放大器.高档玻璃纤维电路板.全SMT制作工艺.红宝石滤波电容阵列.进口金属化聚丙稀分频电容.超大功率TDA7294功放芯 ...

  8. 时钟晶振32.768KHz为什么是15分频?

    实时时钟晶振为什么选择是32768Hz的晶振,在百度上搜索的话大部分的答案都是说2的15次方是32768,使用这个频率的晶振,人们可以很容易的通过分频电路得到1Hz的计时脉冲.但是话有说回来了,2的整 ...

  9. Verilog分频器的设计

    大三都要结束了,才发现自己太多东西没深入学习. 对于偶分频:(计数到分频数的一半就翻转) 注: 图中只用了一个计数器,当然也可以用多个: 图中只计数到需要分频的一半,当然也可计数到更多: 图中从第一个 ...

  10. FPGA基础(verilog语言)——语法篇

    verilog语言简介 verilog语言是一种语法类似于c的语言,但是与c语言也有不同之处,比如: 1.verilog语言是并行的,每个always块都是同时执行,而c语言是顺序执行的 2.veri ...

随机推荐

  1. 访问nginx报错502日志:failed (13: Permission denied) while connecting to upstream

    1.错误问题 nginx启动成功,但是访问nginx报错502.检查后台项目,使用IP+端口可以正常访问项目的,这说明项目启动成功了.那就是nginx的问题.检查了nginx.conf文件发现配置的反 ...

  2. 通过重构来加深理解——DDD

    上部分模型驱动设计的构造块为维护模型和实现之间的关系打下了基础.在开发过程中使用一系列成熟的基本构造块并运用一致的语言,能够使开发工作更加清晰而有条理. 我们面临的真正挑战是找到深层次的模型,这个模型 ...

  3. 数据结构(DataStructure)-01

    数据结构-01 **数据结构与算法** **算法概述** **时间复杂度概述** **时间复杂度 - 计算规则** **数据结构概述** **抽象数据类型** **线性表 - 顺序表** **线性表 ...

  4. vite不能选配方案?vite-creater强势来袭!

    我正在参加「掘金·启航计划」 项目背景 vite出现之后,迅速带走了一大波webpack的使用者,即使是对打包工具不熟悉的小白,也能很快感受到两者的区别--vite快的多! vite官方文档第一句也是 ...

  5. #Python 文本包含函数,pandas库 Series.str.contains 函数

    一:基础的函数组成 '''Series.str.contains(pat,case = True,flags = 0,na = nan,regex = True)'''测试pattern或regex是 ...

  6. Django-5:前端模板路径设定TEMPLATES DIRS和调用

    前端模板路径设定:'DIRS': [BASE_DIR / 'templates'] TEMPLATES = [ { 'BACKEND': 'django.template.backends.djang ...

  7. APRIL 2022-Explanation-Aware Experience Replay in Rule-Dense Environments

    I. INTRODUCTION 解释是人类智能的关键机制,这种机制有可能提高RL代理在复杂环境中的表现 实现这一目标的一个核心设计挑战是将解释集成到计算表示中.即使在最小的规则集变化下,将规则集(或部 ...

  8. Create Vite App 支持 OpenTiny 啦🎉

    大家好,我是 Kagol,个人公众号:前端开源星球. 一个月前,日日自新写了一篇介绍 Create Vite App 开源项目的文章: 基于vite 4.x 快速搭建开箱即用,高度可定制化模版脚手架 ...

  9. springboot 整合druid和mybatis

    Shrio+Mybatis+Druid 1.导入相关依赖包 2.在配置文件配置数据源 3.pojo对应实体类和mapper目录下的接口UserMapper (3.使用注解版) package com. ...

  10. STL-vector(ACM)

    1.长度可变的数组 2.这里不是很懂,v.size() 代码源里说这个v.size()是无符号类型的,使用时要说明类型, 但是我在使用时并没有出现warning,有大佬知道原因吗? 前置板子 3.ve ...