FPGA学习——实现任意倍分频器(奇数/偶数倍分频器均可实现)

news2024/11/26 16:56:21

文章目录

  • 一、分频器
  • 二、Verilog实现任意倍分频器
    • 2.1、Verilog源码
    • 2.2、仿真文件
  • 三、仿真波形图

一、分频器

在FPGA(可编程逻辑门阵列)中,分频器是一种用于将时钟信号的频率降低的电路或模块。它可以根据输入的时钟信号生成一个较低频率的输出时钟信号。

常见的分频器可以按照固定比例来进行分频,例如将输入时钟频率除以2、除以4等。因此,如果输入时钟信号的频率为100 MHz,并且使用一个除以2的分频器,那么输出时钟信号的频率将为50 MHz。这样就可以将高频的时钟信号降低到所需的较低频率,以满足电路设计中对时序和性能的要求。

FPGA中的分频器一般由触发器和计数器组成。触发器用于产生时钟信号的边沿触发,计数器用于对触发器的触发计数,并在达到一定计数值时生成输出时钟信号。通过调整计数器的初值和计数步长,可以实现不同的分频比例。

分频器在FPGA中非常常用,可以在时序控制、数据采样、状态机设计等方面起到重要作用。它可以帮助实现时钟域划分、减少功耗、减小时序延迟等功能。

以上是GPT3对分频器的概述。

二、Verilog实现任意倍分频器

2.1、Verilog源码

  • 由于我们无法在一个always块中同时检测时钟的上升沿和下降沿,因此我们需要两个always块分别进行检测。同时博主引进了两个中间时钟信号分别是根据始终上升沿反转的clk_p,以及根据时钟下降沿进行反转的clk_n。

  • 以本题为例,我们设计一个七倍分频器,因此我们需要在数到七个半个系统时钟周期时对输出的clk_out进行信号反转,因此对于计数器,我们只需要计数到7的一半,也就是3。

  • 由于上升沿与下降沿相隔了半个时钟周期,因此我们可以通过对两个中间时钟信号想与从而获得相当于系统时钟周期的七个半个周期时钟信号。

  • 在这里插入图片描述

  • 而对于偶数倍分频器,相信已经大家十分熟悉,只需要计数时钟上升沿进行翻转即可,因此不再赘述。

  • 具体请看如下代码:

module N_divider#(parameter N = 7)(  //分频系数,填入几代表数到几输出的时钟信号就要翻转一次
    input   wire     clk     , //系统时钟
    input   wire     rst_n   , //系统复位

    output  wire     clk_out     //分频时钟
);

reg     [N:0]   cnt_p   ; //时钟上升沿计数寄存器,计满信号反转
reg     [N:0]   cnt_n   ; //时钟下降沿计数寄存器,计满信号反转
reg             clk_p   ; //对时钟上升沿敏感的时钟信号
reg             clk_n   ; //对时钟下降沿敏感的时钟信号

//时钟上升沿敏感计数器
wire				add_cnt_p	;
wire				end_cnt_p	; 

always @(posedge clk or negedge rst_n)begin 
   if(!rst_n)begin
        cnt_p <= 1'd0;
    end 
    else if(add_cnt_p)begin 
        if(end_cnt_p)begin 
            cnt_p <= 1'd0;
        end
        else begin 
            cnt_p <= cnt_p + 1'b1;
        end 
    end
end 

assign add_cnt_p = 1'b1;
assign end_cnt_p = add_cnt_p && cnt_p == N - 1'b1;

//对时钟上升沿敏感的信号反转                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        clk_p <= 1'b0;
    end
    else if(cnt_n <= (N >> 1))begin
        clk_p <= 1'b1;
    end
    else begin
        clk_p <= 1'b0;
    end
end

//时钟下降沿敏感计数器
wire				add_cnt_n	;
wire				end_cnt_n	;

always @(posedge clk or negedge rst_n)begin 
   if(!rst_n)begin
        cnt_n <= 'd0;
    end 
    else if(add_cnt_n)begin 
        if(end_cnt_n)begin 
            cnt_n <= 'd0;
        end
        else begin 
            cnt_n <= cnt_n + 1'b1;
        end 
    end
end 

assign add_cnt_n = 1'b1;
assign end_cnt_n = add_cnt_n && cnt_n == N - 1'b1;

//对时钟下降沿敏感的输出信号
always@(negedge clk or negedge rst_n)begin
    if(!rst_n)begin
        clk_n <= 1'b0;
    end
    else if(cnt_p <= (N >> 1))begin
        clk_n <= 1'b1;
    end
    else begin
        clk_n <= 1'b0;
    end
end

assign clk_out = (N==1) ? clk_p : N[0] ? (clk_p&clk_n) : clk_p;//在二进制中,奇数的第一位是1,偶数的第一位是0;
                                                               //N=1的情况,clk不变;N大于1,判断奇数偶数
                                                               //偶数的情况直接输出上升沿时的输出时钟
                                                               //奇数,则输出clk_p&clk_n;
                                                               //N[0]等效于N[0] == 1
                                                               
endmodule                         

2.2、仿真文件

`timescale 1ns/1ns
module N_divider_tb#(parameter N = 7)();


reg     clk     ;
reg     rst_n   ;
wire     clk_out   ; 


always #10 clk = ~clk;

initial begin
    clk = 1'b0;
    rst_n = 1'b1;
    #20;
    rst_n = 1'b0;
    #20;
    rst_n = 1'b1;
    #1000;
    $stop;
end

N_divider #(.N(N)) N_divider_u(
    .clk  (clk  ),
    .rst_n(rst_n),
    
    .clk_out(clk_out)
);


endmodule

三、仿真波形图

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vivado 差分输出引脚配置

diff_out输出如下所示 在引脚配置时&#xff0c;如下图所示&#xff0c;只能设置一个Pos Diff的引脚&#xff0c;此时设置完Pos Diff的引脚后&#xff0c;Neg Diff默认被绑定在相邻的引脚 我们可以打开上图中Package Pins页面&#xff0c;发现这一对引脚设置完毕

基于Java+Swing+mysql人力资源管理系统_员工信息管理系统

基于JavaSwingmysql人力资源管理系统/员工信息管理系统 一、系统介绍二、效果展示1、登陆2、查看个人信息--员工3、更新个人信息--员工4、管理员主页&#xff08;增删改查&#xff09; 三、其他系统实现四、获取源码 一、系统介绍 系统主要分为两个角色&#xff1a; 员工&…

【LeetCode-中等】剑指 Offer 67. 把字符串转换成整数(详解)

题目 写一个函数 StrToInt&#xff0c;实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。 首先&#xff0c;该函数会根据需要丢弃无用的开头空格字符&#xff0c;直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符为正或者负号时&#…

【ArcGIS Pro微课1000例】0029:绘制全球海洋波纹荡漾效果图

本文讲解ArcGIS Pro3.0中,基于全球航洋面状矢量数据,绘制震撼全球海洋波纹荡漾效果图。 文章目录 一、效果预览二、效果制作三、参数详解一、效果预览 绘制好的海水波纹荡漾效果图如下: 下面我们来学习绘制过程。 二、效果制作 波纹荡漾效果需要在全局或者局部场景中制作…

7月最新大模型排名!3700道保密试题、20个大模型参与评测|SuperCLUE

7月最新大模型排名&#xff01;3700道保密试题、20个大模型参与评测&#xff5c;SuperCLUE CLUE中文语言理解测评基准 中文通用大模型综合性评测基准SuperCLUE 2023年7月榜单 7月25日&#xff0c;SuperCLUE发布大模型7月榜单。 SuperCLUE: A Benchmark for Foundation Mo…

【TypeScript】类型推断与类型别名的使用方式。

什么是类型推断&#xff1f; 在 TypeScript 中&#xff0c; 如果声明变量时&#xff0c;没有明确的指定类型&#xff0c;那么 TypeScript 会依照类型推论&#xff08;Type Inference&#xff09;的规则推断出一个类型。 以下代码虽然没有明确指定类型&#xff0c;但是会在编译的…

web安全漏洞总结

目录 &#xff08;一&#xff09;网络安全常见漏洞 1、sql注入漏洞 漏洞解释与形成原因 漏洞分类&#xff1a; 漏洞存在常见地方&#xff1a; 漏洞利用: 漏洞防御: 攻击流量特征 绕开waf拦截的常用方法 2、文件上传漏洞 漏洞解释与形成原因&#xff1a; 漏洞利用 漏…

20230720在ubuntu22.04系统下载+解密+合并ts切片的步骤

20230720在ubuntu22.04系统下载解密合并ts切片的步骤 2023/7/20 23:06 1、视频源头&#xff0c;打开时效肯定有时间限制的&#xff01; 【并且不同时间打开&#xff0c;下载链接/参数会有区别的&#xff01;以前的链接就会失效/出错了&#xff01;】 https://app1ce7glfm1187.…

深“扒”云原生高性能分布式文件系统JuiceFS

JuiceFS 是一款面向云原生设计的高性能分布式文件系统&#xff0c;在 Apache 2.0 开源协议下发布。提供完备的 POSIX 兼容性&#xff0c;可将几乎所有对象存储接入本地作为海量本地磁盘使用&#xff0c;亦可同时在跨平台、跨地区的不同主机上挂载读写。 JuiceFS 简介 JuiceFS…

【100天精通python】Day13:面向对象编程_多态和封装,实战模拟电影院的自动售票机选票页面

目录 1 多态&#xff08;Polymorphism&#xff09; 2 封装&#xff08;Encapsulation&#xff09; 3 总结 4 实战&#xff1a;模拟电影院的自动售票机选票页面 在 Python 中&#xff0c;多态和封装是面向对象编程的两个重要概念。 1 多态&#xff08;Polymorphism&#xf…

GoogleLeNet Inception V1

文章目录 Inception V1Inception Modulenative versionInception module with dimensionality reduction1 * 1网络的降维说明 多个Softmax的输出整体结构 GoogleLeNet主要是把深度扩充到了22层&#xff0c;能增加网络深度而不用担心训练精度和梯度消失问题。 总共是提出了4个版…

【stm32L152】段码屏驱动注解、MX_LCD_Init()初始化失败的解决方法

文章目录 断码屏驱动补充MX_LCD_Init()驱动初始化失败 断码屏驱动补充 已经有大神写过较详细的教程&#xff1a;https://blog.csdn.net/CSDN_Gao_16/article/details/115463499&#xff0c;但这篇博文仍然比较抽象&#xff0c;我看了好多遍才看明白-_-||&#xff0c;为了节省和…

金融中的数学:贝叶斯公式

1.贝叶斯定理 贝叶斯定理是概率论中的一项重要定理&#xff0c;用于在已知某一事件的条件下&#xff0c;求另一事件发生的概率。它是根据条件概率推导出来的&#xff0c;得名于英国数学家托马斯贝叶斯。 贝叶斯定理可以表示为&#xff1a; 这个式子就是贝叶斯公式&#xff0c…

LabVIEW使用自定义模板和示例项目来开发LabVIEW项目

LabVIEW使用自定义模板和示例项目来开发LabVIEW项目 创建项目时&#xff0c;LabVIEW将显示“创建项目”对话框&#xff0c;以帮助您选择模板或示例项目来作为开发起点。如果要使用您创建的项目作为自定义模板和示例项目&#xff0c;您必须将每个项目的源文件和元数据添加到相应…

算法与数据结构(四)--队列

一.队列的基本概念 队列是另一种特殊的表&#xff0c;这种表只在表首&#xff08;也称为队首&#xff09;进行删除操作&#xff0c;只在表尾进行插入操作。队列的修改是按先进先出的规则进行的&#xff0c;所以队列又称为先进先出表&#xff0c;First In First Out&#xff0c…

高温介电参数测试

高温介电参数测试 在新材料科研领域&#xff0c;高温介电参数的测量是众多高校和研究所经常会面临的问题。精科声学所事业部电子和专业的高温介电系统集成商合作&#xff0c;使用 JKZC-YDZK03A型高温压电阻抗综合分析仪进行配套系统集成&#xff0c;满足客户高温介电测量和曲线…

什么是 web3?

在百度搜索引擎输入 “Web3”、“大厂”。跳出来基本都是这样的标题. 以及如今的互联网行业 “哀鸿遍野”&#xff0c;不仅内卷&#xff0c;还裁员。然后掀起一阵风&#xff0c;猛吹 Web3 的好&#xff0c;数据回归用户……最后再 “威逼利诱” 一下&#xff0c;Web3 就是 20 年…

【业务功能篇50】ObjectMapper-将java对象转为json字符串

ObjectMapper可以实现Java对象和json字符串间互相转换&#xff0c;我们经常用到的是它的Java对象转json字符串功能。 这里目的是 Java对象 json字符串相互转换 api 【json字符串转为Java对象&#xff1a;readValue(json字符串,类.class)】【Java对象转为json字符串&#xff1a…

读kafka生产端源码,窥kafka设计之道(下)

背景 在上一篇文章《读kafka生产端源码&#xff0c;窥kafka设计之道&#xff08;上&#xff09;》 留下了kafka设计上比较优秀的一个点&#xff1b;内存的循环使用。本篇文章准备盘盘它。 好奇 为什么 kafka减少发送消息时向JVM频繁申请内存&#xff0c;就可以降低JVM GC的执…

idea 设置了 vm options后无法启动

今天想扩展ideaj的JVM 设置了 vm options后无法启动 找了很久&#xff0c;重新卸载后安装也没有用 后面直接打开idea的bat文件 找到自己idea使用的.vmoptions文件&#xff0c;我是因为之前idea有缓存&#xff0c;一直用的我修改的文件&#xff0c;后面删了就可以启动了