FPGA逻辑设计:Verilog实现流水灯

需积分: 50 14 下载量 192 浏览量 更新于2024-08-31 1 收藏 2.04MB DOCX 举报
"EDA流水灯设计,使用Verilog语言实现,目标是设计FPGA逻辑以控制DE0实验板上的LED灯以特定频率和模式进行显示。实验基础要求为以5Hz频率逐个点亮LED0至LED9,扩展要求包括改变频率和设计不同显示样式。报告来自西安电子科技大学电子工程学院的一名学生,实验日期为2020年10月1日。" 在数字电路和EDA实验中,流水灯是一个常见的入门项目,它有助于理解和掌握FPGA(Field-Programmable Gate Array)设计的基本原理和Verilog编程语言。Verilog是一种硬件描述语言,常用于描述数字系统的逻辑行为,可以用来创建复杂的电路设计。 1. 实验要求 - 基本要求:设计一个FPGA逻辑,该逻辑以5Hz的频率工作,使得DE0实验板上的9个LED(LED0到LED9)依次亮起,形成一种“流水”效果。这种效果可以通过一个简单的循环计数器来实现,计数器每次递增时,点亮对应的LED。 - 扩展要求:除了5Hz频率之外,还需要设计能以不同频率实现相同显示样式的FPGA逻辑。此外,还要求设计出新的LED显示样式,比如同时点亮多个LED,或者按照某种特定模式(如蛇形、跳跃等)点亮LED。 2. 设计过程 - 逻辑思路:设计中可能包含一个分频器模块,用于将DE0开发板的高频率系统时钟(50MHz)降低到所需的5Hz。分频系数为4999999(50MHz除以5Hz再除以2,因为时钟是边沿触发的,所以需要除以2)。然后,通过一个9位的计数器控制LED的点亮状态,每计数一次,就改变一个LED的状态。 - Verilog代码:分频器模块通常包含一个计数器,其值在每个系统时钟周期内增加,当达到预设模值时,计数器清零,输出时钟翻转。在上述代码片段中,`r_div_count`是32位的计数器寄存器,`div_count_value`是计算出的分频计数值。`always @(posedge i_sys_rst or posedge i_sys_clk)`块定义了在复位信号或时钟上升沿触发的事件。 3. Verilog实现细节 - 分频器模块:`FREQUENCY_DIVIDER`模块接收系统时钟和复位信号作为输入,输出分频后的时钟。`sys_clk_fre_value`和`div_clk_fre_value`参数分别表示系统时钟频率和期望的分频后时钟频率。 - 计数器逻辑:在`always`块内,当复位有效或时钟上升沿到来时,根据不同的条件更新计数器。在复位信号有效时,计数器被清零;当复位无效且计数器未达到默认值时,计数器递增。 4. LED控制逻辑 - 控制LED的逻辑可以使用一个状态机,基于分频器的输出来切换LED的状态。状态机可能包含10个状态,每个状态对应一个LED的亮灭,状态机在每个时钟周期按顺序切换状态,从而实现流水灯效果。 通过这个实验,学生能够学习到如何使用Verilog语言进行数字逻辑设计,理解分频器的工作原理,以及如何通过FPGA控制外部硬件设备。此外,还能锻炼到问题解决能力和创新思维,通过实现不同的LED显示样式来拓展自己的设计能力。