差别

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

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
book_excise_led [2021/08/17 15:03]
zili
book_excise_led [2021/08/17 15:19] (当前版本)
zili
行 4: 行 4:
 本实验通过一个简单的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灯。
 在仿真时需要注意的是,由于计数器的计数值非常大,为10,​000,​000,循环一次要10,​000,​000个时钟周期,仿真的时间会很长。在仿真的观测时间内很难看到计数器循环一次,所以在仿真时可以降低计数器的计数值,例如计数到10,减少仿真时间,在观测时间内至少应该看到计数器循环一次。 在仿真时需要注意的是,由于计数器的计数值非常大,为10,​000,​000,循环一次要10,​000,​000个时钟周期,仿真的时间会很长。在仿真的观测时间内很难看到计数器循环一次,所以在仿真时可以降低计数器的计数值,例如计数到10,减少仿真时间,在观测时间内至少应该看到计数器循环一次。
 +\\
 \\ \\
 #### 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的信号定义如下:
行 63: 行 64:
  Endcase  Endcase
 </​code>​ </​code>​
 +\\
 \\ \\
 #### 4. 仿真结果 #### 4. 仿真结果
行 83: 行 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. 演示程序文件说明
行 90: 行 93:
 |ledtest.v|仿真Testbench| |ledtest.v|仿真Testbench|
 |ledsim.mpf|ModelSim仿真项目| |ledsim.mpf|ModelSim仿真项目|
 +\\
 \\ \\
 #### 6. 演示程序使用 #### 6. 演示程序使用
   演示设备:核心板。   演示设备:核心板。
   演示方法:将演示程序下载到开发系统后,可以观察到开发系统核心板上的LED灯按顺序依次点亮,reset为复位键。   演示方法:将演示程序下载到开发系统后,可以观察到开发系统核心板上的LED灯按顺序依次点亮,reset为复位键。
 +\\
 \\ \\
 #### 7 时序波形 #### 7 时序波形