[FPGA 学习记录] 计数器

计数器


在前面的章节当中我们讲解了:在时序逻辑电路当中,最基本的单元就是我们的寄存器。那么在本小节当中我们就使用寄存器来实现一个具有计数器功能的电路。

那么学会了计数器的使用,我们可以做很多的事情。可以毫不夸张的讲,在 FPGA 的设计当中,一切与时间有关的设计都会用到我们的计数器。

那么本小节的主要内容分为两个部分:第一部分是理论部分的学习,第二部分是实战部分的学习。

在理论部分的学习当中,我们会对计数器的相关知识做一个系统性的讲解。那么在实战部分,我们会通过实验工程设计并实现一个具有计数器功能的电路。

首先是理论学习

1 理论学习

那么计数它是一种最为简单的也是最基本的一种运算,我们的计数器就是实现这种运算的逻辑电路。那么计数器在数字系统中主要是对脉冲的个数进行计数,比如说在 FPGA 当中,就是对时钟的脉冲进行计数;那么它可以实现测量、计数、控制的功能,同时兼有分频的功能。

计数器在数字系统中应用十分广泛,比如说计算机控制器中的指令地址需要进行计数,那么以便于顺序的取出下一条指令;在我们的运算器当中做乘法和除法的运算,同样需要计数器;那么在数字仪器当中对脉冲的计数也需要使用到我们的计数器。

同时,计数器也是在 FPGA 设计当中最常用的一种时序逻辑电路。那么根据计数器的计数值,我们可以精确的计算出 FPGA 内部各信号之间的时间关系,每个信号什么时候拉高、什么时候拉低,那么高电平要保持多久、低电平要保持多久,都可以由计数器实现精确的控制。而让计数器计数的是由外部晶振产生的时钟,所以说,我们可以比较精确的控制具体需要计数的时间。

我们的计数器一般是从 0 开始计数,计数到我们需要的计数值就可以进行清零,或者说计数器计满溢出清零。并且计数器可以进行不断的循环计数。

那么以上就是理论部分,对计数器相关知识的讲解。那么下面开始实战演练

2 实战演练

2.1 实验目标

在实战演练部分,我们会通过实验工程设计并实现一个具有计数器功能的电路。

2.2 硬件资源

它计数的时间间隔是 1s,因为我们的计数器是模块内部产生的,要对它进行验证,我们同样要使用我们板载的 LED 灯。在一个 1s 的时间间隔内,让我们的灯在前 0.5s 处于一个点亮的状态,在后 0.5s 处于一个熄灭的状态。这样就可以通过我们的 LED 灯来检测我们的计数器。

image-20231031160450103

那么实验目标和检测方法了解了之后,下面开始程序的设计。

2.3 程序设计

那么第一步就是需要建立一个文件体系

20231030183526_KpSWJogX8B

2.3.1 模块框图

那么文件体系建立完成之后,我们打开 doc 文件夹。建立一个 Visio 文件,用来绘制模块框图和我们的模块波形图

sNyCnWVhLk

那么下面开始模块框图的绘制。那么首先是模块的主体,然后给它取一个名字;接下来是端口信号,首先是输入信号,因为我们的计数器是对时钟信号进行计数,所以说一定有时钟信号;那么时钟信号绘制完成之后,下面是我们的复位信号,那么输入信号,除了我们的时钟信号和复位信号之外,再没有其他的输入信号。那么下面就是输出信号,为了方便验证,我们要引出一路输出信号到我们的 LED 灯

20231030184207_ZxxqcUmR2x

那么这样模块框图已经绘制完成,下面可以开始波形图的绘制。

2.3.2 波形绘制

在开始波形图的绘制之前,有一点要告诉大家就是:从本章节开始,我们后面将要接触到的实验工程都是时序电路的设计。那么波形设计在时序电路的设计当中是最有价值、也是最好用的。在前面的组合逻辑的设计当中,虽然我们也进行了波形图的绘制,但是大家可以感觉到,在前面组合逻辑的设计当中,波形图的绘制它的作用并不是很大,因为我们波形图的绘制,目的有两个:第一是帮助我们对模块功能加以理解,第二是有助于我们代码的编写。在前面组合逻辑的设计当中,我们的模块功能比较简单,而且我们可以使用真值表代替我们的波形图实现代码的编写。所以说,在前面组合逻辑的设计当中并没有涉及到波形图绘制的精髓之处。而在时序电路的设计当中,我们的模块功能相对比较复杂,需要波形图来帮助我们理解模块的功能,需要波形图来帮助我们进行代码的编写。所以说,大家一定要掌握波形图绘制的方法。那么下面开始波形图的绘制。

首先是我们的输入信号。那么先来绘制我们时钟信号的波形,我们时钟信号是由外部晶振传入的,它的频率是 50MHz;那么下面就是我们复位信号的波形绘制,我们让复位信号,在系统上电后保持一段时间有效的低电平进行复位,那么复位完成之后让它一直保持为高电平

20231030184843_G9vz0BQRNA

那么这样,输入信号——时钟信号和复位信号的波形绘制完成。

我们本章节的目的就是教会大家如何使用好我们的计数器,那么计数器的使用有两点你需要掌握:第一点就是,控制好我们的计数器什么时候开始计数;第二点就是,控制好我们的计数器什么时候进行清零的问题。

首先,先考虑第一点:计数器什么时候开始计数。

在我们这个模块当中只有两路输入信号:一个是时钟信号,一个是复位信号。那么只要我们的复位信号已撤销,时钟沿到来就可以立刻进行计数。

那么接下来考虑第二点:我们的计数器什么时候进行清零。

那么计数器的清零有两种情况:第一种情况是,计数器记满了它会自动的清零;第二种情况就是,计数器计数到我们需要的计数值,然后进行清零。这样就引入了一个新的问题,哪一个计数值才是我们需要的计数值。

就拿本实验工程来讲,我们计数的时间间隔是 1s。那么我们就会考虑:计数 1s 的时间,需要计数器计数多少个个数,那么这儿就需要一个计算。

那么在前面我们已经提到了:我们的系统时钟,它的频率是 50 MHz 50\text{MHz} 50MHz。那么 50 MHz 50\text{MHz} 50MHz 经过单位换算,它也等于 5 × 1 0 4 kHz 5\times10^4\text{kHz} 5×104kHz,它也等于 5 × 1 0 7 Hz 5\times10^7\text{Hz} 5×107Hz。那么频率我们一般使用 f \text{f} f 来表示: f = 5 × 1 0 7 Hz \text{f} = 5\times10^7\text{Hz} f=5×107Hz
那么频率的概念它是什么意思呢?它表示的是:单位时间内,信号进行周期性变化的一个次数。我们的系统时钟它的频率是 5 × 1 0 7 Hz 5\times10^7\text{Hz} 5×107Hz 就表示它单位时间内进行了 5 × 1 0 7 5\times10^7 5×107 次周期性的一个变化。

那么每次变化用的时间,我们用 t \text{t} t 来表示。知道了系统时钟的频率之后,就可以计算我们的 t \text{t} t 了。那么怎么计算呢?

我们的频率表示的是,单位时间内系统进行周期性变化的一个次数,那么这个单位时间就是 1s,那么一秒之内进行了 5 × 1 0 7 5\times10^7 5×107 次周期性的一个变化。这样就可以得出:每个周期性变化所用的时间就是我们频率的倒数。那么针对我们的系统时钟 就应该这样写: t = 1 f = 1 5 × 1 0 7 s \text{t} = \frac{1}{\text{f}} = \frac{1}{5\times10^7}\text{s} t=

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值