[FPGA] FPGA基础入门教程 - 005 - 第四章 Veilog设计实例

第四章 Verilog设计实例

概览

在刚进行Verilog设计设计的时候,我们尽量采用一个简单、完整的例子来了解Verilog的设计方法。与此同时,Verilog的最终设计是否正确,是否满足要求,我们都需要在实际硬件上运行,因此,在查看了后面我们要使用的FPGA硬件板卡后,我选择了跑马灯这一项目来进行学习。

设计需求简介

在一块板卡上,提供了8个可以供用户使用的LED灯,设计需求是可以让这些LED灯按照以下显示方法进行显示:

  • LED从左边第一个LED到右边最后一个LEd依次亮起,同一时刻只亮一个灯,到最右边时循环到最左边再亮
  • LED从右边第一个LED到左边最后一个LEd依次亮起,同一时刻只亮一个灯,到最左边时循环到最右边再亮
  • LED从左右两边开始亮,同一时刻亮两个LED,第一次亮左一和右一,第二次亮左二和右二…当亮到左四和右四的时候,下一次亮左三和右三…当再次亮到最两边时,下一次亮左二和右二…以此循环往复

以上是LED的显示要求,于此同时,还有以下控制要求:

  • 设计暂停/继续按钮 : 当按下此按钮时,则显示暂停,停在当前显示,再次按下后显示继续。在硬件刚上电时,需要按下此按钮LED才会开始动作
  • 复位按钮 :当按下此按钮后,无论此时LED处于何种状态,它都会回到初始状态,直到设计/继续按钮被按下,则从最开始的位置开始显示
  • 速度切换按钮 :此按钮用于LED显示切换的频率快慢控制,设计要求最慢2秒,最快100ms,共4档,分别是100ms,500ms,1s,2s

设计分析

  • 输入
    • 按键 在设计需求中的控制要求部分提到,一共有三个控制pause、reset以及speed,这就需要至少三个按钮进行控制,我们设计两个按钮来控制速度,一个是速度+,一个是速度-
    • 开关 于此同时,在显示需求中隐含了一个控制要求,就是对显示方法的控制。硬件上有一个dip开关,我们选用其中的两个来控制显示模式:00 = 模式1,01 = 模式2,10 = 模式3,11 = 模式1
    • 时钟 时钟是FPGA设计的心脏,它为FPGA里面的寄存器提供了工作的能量。只有有一个有效翻转的时钟信号送到寄存器的clock端,它才能正确的采样输入,设置输出。一般来说,一个设计不仅仅需要一个时钟,我们这里的时钟主要用于LED的显示控制逻辑。举一个例子,我们要实现每个led之间显示间隔2s中,我们有一个1Hz频率的时钟输入,1Hz的时钟周期是1s,那么我们需要这个时钟两个周期。如果要计时500ms怎么做呢?要么是1Hz的半个周期,也就是我们先检测到1Hz时钟的上升沿,再检测到下降沿,这个时候就是500ms。但是这里给新手的一个建议是,如非必要,同一个时钟在设计中,尽量只用上升沿。如果设计确实需要,采用下降沿。要获得500ms的时间,也可以将1hz时钟倍频到2hz,那么其周期就会变成500ms,这样也可以简单的获得500ms的延时。 实际硬件中,我们选择用一个100MHz的时钟输入
  • 输出
    • LED 硬件上选用8个LED作为显示输出,阅读硬件设计原理图可知,LED是给0则亮,1则灭,这个是根据具体的硬件设计来的,有的设计师1亮0灭

代码设计

本章节开始将对跑马灯进行设计,设计方法是从顶层到底层的设计方法。

顶层代码

时钟复位模块

复位信号同步

时钟分频

源代码

按键防抖动模块

什么是按键抖动

防抖动的设计

源代码

LED显示输出控制模块