在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. js 获取窗口/容器内部滚动位置

    前端 (document.getElementsByClassName("container")[0]).scrollTop -- 容器内部滚动条位置 (document.getE ...

  2. 【问题解决】RabbitMQ启动出现epmd error for host xx.xx: nxdomain (non-existing domain)

    问题描述 [k8s]或[普通容器]或[Linux]部署的RabbitMQ启动时出现了 epmd error for host xx.xx: nxdomain (non-existing domain) ...

  3. AGC061 F Perfect String

    毒瘤出题人,史诗加强 AGC 的 F-- 然而我连原题都不会,所以只学了原题做法. 翻译一下题意就是给定一张循环网格图,求经过 \((0,0)\) 的闭合回路条数. 由于网格图中每一个位置都等价,所以 ...

  4. 2022-05-30:给定一个n*2的二维数组,表示有n个任务。 一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数, 你作为单线程的人,不能并行处理任务,

    2022-05-30:给定一个n*2的二维数组,表示有n个任务. 一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数, 你作为单线程的人,不能并行处理任务, ...

  5. 2022-04-28:有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,

    2022-04-28:有 n 个城市通过一些航班连接.给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始, ...

  6. 2022-04-20:小团去参加军训,军训快要结束了, 长官想要把大家一排n个人分成m组,然后让每组分别去参加阅兵仪式, 只能选择相邻的人一组,不能随意改变队伍中人的位置, 阅兵仪式上会进行打分,其中

    2022-04-20:小团去参加军训,军训快要结束了, 长官想要把大家一排n个人分成m组,然后让每组分别去参加阅兵仪式, 只能选择相邻的人一组,不能随意改变队伍中人的位置, 阅兵仪式上会进行打分,其中 ...

  7. Selenium - 元素操作(3) - 下拉框操作

    Selenium - 元素操作 下拉框才做可以分为两类: select标签的下拉框:使用Select类进行操作: 非select标签的下拉框:一般是 ul,li, div 等标签组成,使用元素定位的方 ...

  8. UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list

    错误: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_l ...

  9. Error in nextTick: "TypeError: Right-hand side of 'instanceof' is not an object"

    发生这种情况,直接去查看 props 对象是否  类型正确 props 有 大概两种 写法吧, 一种就是对象形 ,一种是数组形 // 对象形props: { show: { type: Boolean ...

  10. 【Linux】详解六种配置Linux环境变量的方法(以centos为例)

    本文时间 2023-05-19 作者:sugerqube漆瓷 本文重理解,!!忽略环境变量加载原理!! 本文目标:理解六大环境变量配置,选择合适的配置文件进行配置 配置环境的理由 以shell编程为例 ...