08 FPGA—计数器与分频器的应用

news/2024/12/2 20:59:08/

1. 理论

       时序逻辑电路中最基本的单元—寄存器,我们可以使用寄存器来做计数器。基本上关于时间的设计都离不开计数器。

     计数器在数字系统中主要是对脉冲的个数进行计数,以实现测量、计数控制的功能,同时兼有分频功能。计数器一般都是从 0 开始计数,计数到我们需要的值或者计数满溢出后清零,并可以进行不断的循环, 3 位数的十进制计数器最大可以计数到 999, 4 位数的最大可以计数到 9999; 3 位数的二进制计数器最大可以计数到 111(7), 4 位数的最大可以计数到 1111(15)。

    分频器:一般开发板上面只有一个晶振,即只有一种频率的时钟。要想获得其他频率的时钟有pll  ip和写代码实现。pll后面会讲。

计数器

2.实操

    实验目标:使小灯闪烁10次,闪烁频率为一秒。

2.1  模块框图 

2.2 波形设计

2.3 编写rtl代码

`timescale  1ns/1nsmodule  ledflash10
#(parameter CNT_MAX =  25'd24_999_999             )
(
input    wire    sys_clk,
input    wire    sys_rst_n,output   reg    led_out     
);reg       [24:0]         cnt; 
reg       [4:0]          led_flag;
reg                      cnt_flag;                           //cnt:定时0.5s    
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 0)cnt <= 0;else if ((cnt == CNT_MAX)  ||  (led_flag > 19))cnt <= 0;else cnt <= cnt + 1'b1;                          //cnt_flag:标记cnt是否计满0.5s   	
always@(posedge sys_clk or negedge sys_rst_n)		if(sys_rst_n == 0)cnt_flag <= 0;  else if (cnt == CNT_MAX - 25'b1)cnt_flag <= 1;else cnt_flag <= 0;	always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 0)led_flag <= 0;else if(cnt_flag == 1 )led_flag <= led_flag + 1'b1; always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 0)led_out <= 0;else if((cnt_flag == 1)  &&  (led_flag  <  5'd20  ))led_out <= ~led_out;   endmodule   

3. 分频器

       使用 parmaeter 参数化的方法做成通用的任意分频模块,方便以后的调用。

`timescale  1ns/1nsmodule  divider
#(parameter   CNT_MAX = 3'd6  //六分频计数器
)
(input   wire    sys_clk     ,   input   wire    sys_rst_n   ,   output  reg      clk_flag       
);reg     [3:0]   cnt;               always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt <= 1'b0;else    if(cnt == CNT_MAX )cnt <= 1'b0;elsecnt <= cnt + 1'b1;
//clk_flag  
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)clk_flag <= 1'b0;else    if(cnt == CNT_MAX-1)clk_flag <= 1'b1;else    clk_flag <= 1'b0;endmodule

       这里不使用图一的分频的思想,而采用图二倍频的思想。一是因为实现奇分频更方便,二是因为分频的方式产生的 clk_out 信号并没有连接到全局时钟网络上,在高速系统会出现问题。
 

 图一

  图二

 说明:

       本人使用的是野火家Xilinx Spartan6系列开发板及配套教程,以上内容如有疑惑或错误欢迎评论区指出,或者移步B站观看野火家视频教程。

开发软件:ise14.7     仿真:modelsim 10.5 

如需上述资料私信或留下邮箱。


http://www.ppmy.cn/news/64224.html

相关文章

互联网摸鱼日报(2023-05-10)

互联网摸鱼日报&#xff08;2023-05-10&#xff09; InfoQ 热门话题 华为云联创营 MVP 公布 | 10 位专家入选&#xff0c;用技术创新推进产业数字化 极狐(GitLab)重磅发布新产品「极狐星」&#xff0c;让研发效能看得清&#xff0c;算得准&#xff0c;成就企业精英效能管理 …

使用阿里云服务器三分钟搭建网站教程(详细图文详解)

使用阿里云服务器快速搭建网站教程&#xff0c;先为云服务器安装宝塔面板&#xff0c;然后在宝塔面板上新建站点&#xff0c;阿里云服务器网以搭建WordPress网站博客为例&#xff0c;来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流程&#xff1a; …

测试遵循的原则

测试遵循的原则 软件测试是在规定的条件下对程序进行操作&#xff0c;以发现程序错误&#xff0c;衡量软件质量&#xff0c;并对其是否能满足设计要求进行评估的过程。软件测试的基本原则有助于测试人员进行高质量的测试&#xff0c;尽早尽可能多的发现缺陷&#xff0c;并负责跟…

spring-transaction源码分析(3)Transactional事务失效原因

问题概述 在Transactional方法中使用this方式调用另一个Transactional方法时&#xff0c;拦截器无法拦截到被调用方法&#xff0c;严重时会使事务失效。 类似以下代码&#xff1a; Transactional public void insertBlogList(List<Blog> blogList) {for (Blog blog : …

MapReduce调优

MapReduce调优 MapReduce应用场景优点缺点擅长应用场景不擅长应用MapReduce优化需求与方向 文件存储格式行式存储、列式存储Sequence File优缺点Sequence File格式Sequence File 未压缩格式Sequence File 基于record压缩格式Sequence File基于block压缩格式生成Sequence File文…

虚拟环境中的 CPU 优化

近年来&#xff0c;虚拟化已成为管理计算资源的一种越来越流行的方式&#xff0c;使用户能够在一台机器上运行多个操作系统和应用程序。虽然虚拟化提供了许多好处&#xff0c;例如更好的资源利用率和更大的灵活性&#xff0c;但在优化 CPU 性能方面也可能带来挑战。 在本文中&…

@Configuration(proxyBeanMethods = false) 解析

又是美好的一天呀~ 个人博客地址&#xff1a; huanghong.top 往下看看~ Configuration(proxyBeanMethods false) 解析proxyBeanMethods分析总结 Configuration(proxyBeanMethods false) 解析 最近看一些源码的时候&#xff0c;发现很多Configuration配置类上Configuration(p…

阿里、京东等大厂年薪50w的测试都是什么水平?

各位做测试的朋友&#xff0c;但凡经历过几次面试&#xff0c;那么你一定曾被问到过以下问题&#xff1a; 1、在Linux环境下&#xff0c;怎么执行web自动化测试&#xff1f; 2、Shell如何&#xff0c;Docker熟悉吗&#xff1f; 3、全链路的压测实操过吗&#xff0c;如何推进与开…