差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
book_excise_led [2021/08/17 15:05]
zili
book_excise_led [2021/08/17 15:19] (当前版本)
zili
行 1: 行 1:
-### **LED灯实验**+### LED灯实验
  
-#### **1. 实验内容**+#### 1. 实验内容
 本实验通过一个简单的LED灯数字设计初步了解数字设计的基本思想,了解FPGA设计的基本流程,熟悉仿真软件ModelSim和综合编译工具Quartus II的使用方法和流程。要求通过FPGA来控制开发平台的核心板上8个LED灯的亮和灭,循环点亮核心板上的8个LED灯,每个LED点亮的时间为200毫秒。 本实验通过一个简单的LED灯数字设计初步了解数字设计的基本思想,了解FPGA设计的基本流程,熟悉仿真软件ModelSim和综合编译工具Quartus II的使用方法和流程。要求通过FPGA来控制开发平台的核心板上8个LED灯的亮和灭,循环点亮核心板上的8个LED灯,每个LED点亮的时间为200毫秒。
 \\ \\
 \\ \\
-#### **2. 实验原理**+#### 2. 实验原理
 图6-1给出了开发平台的核心板上LED灯的连接图。从图中可以看出,LED灯的正极连接到了3.3V,负极通过一个下拉电阻连接到了FPGA的管脚。为了点亮LED灯,连接负极的FPGA管脚必须拉低;为了熄灭LED灯,连接负极的FPGA管脚必须拉高。\\ 图6-1给出了开发平台的核心板上LED灯的连接图。从图中可以看出,LED灯的正极连接到了3.3V,负极通过一个下拉电阻连接到了FPGA的管脚。为了点亮LED灯,连接负极的FPGA管脚必须拉低;为了熄灭LED灯,连接负极的FPGA管脚必须拉高。\\
-{{::1.1.png?200|}}\\+{{ :1.1.png ||图6 1 LED连接图}}
 为了使LED灯点亮的时间为200ms,那么连接到相应LED负极的FPGA管脚必须拉低200ms。由于核心板上的时钟是50MHz,如果拉低时间为200ms,则需要拉低的时钟周期数为:50,​000,​000*0.2=10,​000,​000。为此,需要一个24位(224=16,​777,​216>​10,​000,​000)的计数器对点亮的时钟周期进行计数,计数器初始值为0,当计数到10,​000,​000时,则熄灭当前点亮的LED灯,点亮下一个LED灯。 为了使LED灯点亮的时间为200ms,那么连接到相应LED负极的FPGA管脚必须拉低200ms。由于核心板上的时钟是50MHz,如果拉低时间为200ms,则需要拉低的时钟周期数为:50,​000,​000*0.2=10,​000,​000。为此,需要一个24位(224=16,​777,​216>​10,​000,​000)的计数器对点亮的时钟周期进行计数,计数器初始值为0,当计数到10,​000,​000时,则熄灭当前点亮的LED灯,点亮下一个LED灯。
 为了分别控制每个LED灯,定义一个8位的寄存器,寄存器中的每一位分别控制一个LED灯,如果寄存器中的某一位设为0,则点亮相应的LED灯;如果某一位设为1,则熄灭相应的LED灯。 为了分别控制每个LED灯,定义一个8位的寄存器,寄存器中的每一位分别控制一个LED灯,如果寄存器中的某一位设为0,则点亮相应的LED灯;如果某一位设为1,则熄灭相应的LED灯。
行 13: 行 13:
 \\ \\
 \\ \\
-#### **3. 程序设计**+#### 3. 程序设计
 为了实现对8个LED灯的控制,设计了状态机State,状态机在不同的状态控制不同LED灯点亮。State有8个状态,每个状态停留200毫秒(图6-2)。\\ 为了实现对8个LED灯的控制,设计了状态机State,状态机在不同的状态控制不同LED灯点亮。State有8个状态,每个状态停留200毫秒(图6-2)。\\
-{{:1.2.png?200|}}\\+{{ :1.2.png |图6 2  State状态机转移图}}
 为了控制状态机在每个状态的停留时间,定义了计数器counter,counter从0~10,000,000循环计数,当计数器循环一次,状态State变迁一次。 为了控制状态机在每个状态的停留时间,定义了计数器counter,counter从0~10,000,000循环计数,当计数器循环一次,状态State变迁一次。
 整个功能由程序Led_core.v实现,实现模块led_core的信号定义如下: 整个功能由程序Led_core.v实现,实现模块led_core的信号定义如下:
行 66: 行 66:
 \\ \\
 \\ \\
-#### **4. 仿真结果**+#### 4. 仿真结果
 在程序仿真之前要设计Testbench,本实验的Testbench设计较为简单,只需要产生时钟和复位,ledtest.v是本程序的Testbench:​ 在程序仿真之前要设计Testbench,本实验的Testbench设计较为简单,只需要产生时钟和复位,ledtest.v是本程序的Testbench:​
  
行 85: 行 85:
  
 图6-3是用modelsim仿真得到的结果。从图中可以看出,在程序运行的时刻,reset为高时,输出信号LED[7..0]中始终有一个信号为低电平,表示相应的灯亮。由于程序中计数器循环一次的时间太长,所以仿真时不容易看到状态的变化,所以仿真时可以降低计数器的计数值。本例中计数到10时清零。可以看出,计数器计到10时,State的状态转换一次。\\ 图6-3是用modelsim仿真得到的结果。从图中可以看出,在程序运行的时刻,reset为高时,输出信号LED[7..0]中始终有一个信号为低电平,表示相应的灯亮。由于程序中计数器循环一次的时间太长,所以仿真时不容易看到状态的变化,所以仿真时可以降低计数器的计数值。本例中计数到10时清零。可以看出,计数器计到10时,State的状态转换一次。\\
-{{:1.3.png?200|}}\\+{{ :1.3.png |图6 3  modelsim仿真结果}}
 \\ \\
 \\ \\
-#### **5. 演示程序文件说明**+#### 5. 演示程序文件说明
 |文件名|功能| |文件名|功能|
 |led_core.v|主程序| |led_core.v|主程序|
行 95: 行 95:
 \\ \\
 \\ \\
-#### **6. 演示程序使用**+#### 6. 演示程序使用
   演示设备:核心板。   演示设备:核心板。
   演示方法:将演示程序下载到开发系统后,可以观察到开发系统核心板上的LED灯按顺序依次点亮,reset为复位键。   演示方法:将演示程序下载到开发系统后,可以观察到开发系统核心板上的LED灯按顺序依次点亮,reset为复位键。
 \\ \\
 \\ \\
-#### **7 时序波形**+#### 7 时序波形
 <​wavedrom>​ <​wavedrom>​
 { "​signal"​ : [ { "​signal"​ : [