用Verilog文本描述硬件电路的框架已有,现在我们对FPGA开发中最常用的计数器模型做详细的介绍。
因为FPGA是并行工作的,而算法的本质却是在有限的步骤下完成我们需要的功能,有限的步骤就说明有先后,有先后就要有时间的概念,我们需要区分先后,FPGA中最常用的就是状态机(后面我们会详细探讨),今天我们来讨论计数器。我的理解计数器也是一种特殊的状态机,计数器以系统时钟为基准源,根据时钟的个数判断时间的先后。
在电机控制中输出PWM就需要有一个三角波作为载波,这个三角波就是用计数器实现的。
建模方式1:下面我对计数器进行建模,系统时钟用50MHz,我们计时1ms,具体代码如下图1所示。
代码解读:计数器建模的是时序逻辑电路,所以always块内的变量定义成reg类型,采用非阻塞赋值,敏感信号为时钟的上升沿或者复位信号的下降沿,当其中之一有效时always块内的代码执行一遍。always块内采用if..else条件语句完成逻辑描述,如果复位信号有效cnt_1ms变量赋值为0;否则在计数器加1条件add_cnt_1ms有效并且计数器计满结束标志有效时cnt_1ms变量赋值为0,否则只有计数器加1条件add_cnt_1ms有效时cnt_1ms加1。代码中将常量参数化定义,便于后续代码维护。
图 1
计数器在Quartus软件中综合后的RTL视图如图2所示。
图 2
图3是映射到FPGA中是视图,Technology Map Viewer - Post-Mapping视图。
图 3
图4是Chip Planner视图,从中可以看到使用的资源情况,使用16个reg和28个LUT资源。
图 4
图5是该建模下的寄存器最大的运行频率为198.18MHz。
图 5
建模方式2:下面我们来看另一种计数器的建模,代码如图6所示,也是实现1ms计数器的功能。将1ms的时间分成200个5us来实现,如图中的两个计数器;5us计数器用来以5us为计数单位,cnt_5us计数器变量可以用8 bit reg型;1ms计数器的加1条件是5us计数器的结束条件,同样1ms计数器的cnt_1ms也是8 bit reg型。代码的含义同图1相同。
图 6
图7是第二种计数器建模Quartus软件中综合后的RTL视图。可以看出综合出的电路与图2不同。
图 7
图8是映射到FPGA中是视图,Technology Map Viewer - Post-Mapping视图。可以看出图3与图8是一样的,即映射到FPGA中的硬件相同。
图 8
图9是Chip Planner视图,从中可以看到使用的资源情况,16个reg和32个LUT资源。
图 9
图10是该建模下的寄存器最大的运行频率为333.35MHz。
图 10
总结:我们对计数器做了两种建模方式,从资源上第一种模型节省资源,第二种浪费资源;从工作频率上,第二种的最大工作频率远大于第一种。这就涉及到FPGA设计硬件电路时的一个原则:面积与速度的平衡,这个需要我们根据实际情况来处理。
得到金句: 要生存就要变化,要变化就要成长,要成长就要不断地自我创新。--亨利.柏格森 得到APP--得到金句产品