用户工具

站点工具


icore4tx_fpga_8

差别

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

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
icore4tx_fpga_8 [2020/05/20 16:37]
fmj
icore4tx_fpga_8 [2022/04/01 11:37] (当前版本)
sean
行 1: 行 1:
 +
 +
 +
 |  **银杏科技有限公司旗下技术文档发布平台** ​ |||| |  **银杏科技有限公司旗下技术文档发布平台** ​ ||||
 |技术支持电话|**0379-69926675-801**||| |技术支持电话|**0379-69926675-801**|||
 |技术支持邮件|Gingko@vip.163.com||| |技术支持邮件|Gingko@vip.163.com|||
-|技术论坛|http://​www.eeschool.org||| 
 ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^ ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^
-|  V1.0  |  2020-05-20  ​| ​ gingko ​ |  初次建立 ​ | +|  V1.0  |  2020-05-28  ​| ​ gingko ​ |  初次建立 ​ | 
  
 ===== 实验八:计数器实验——呼吸灯 ===== ===== 实验八:计数器实验——呼吸灯 =====
- +==== 一、 实验目的与意义 ====
-==== 一、实验目的与意义 ==== +
   - 掌握计数器原理及使用方法;   - 掌握计数器原理及使用方法;
-  - 掌握ISE开发软件的使用方法 +  - 掌握ISE开发环境的使用。 
- +==== 二、 实验设备及平台 ==== 
-==== 二、实验设备及平台 ==== +  - iCore4TX 双核心板[[https://​item.taobao.com/​item.htm?​spm=a1z10.1-c-s.w4004-22598974120.3.1cbb532fZXqtk2&​id=614919247574|点击购买]] 
- +  - USB-CABLE(或相同功能)仿真器 
-  - iCore4TX 双核心板[[https://​item.taobao.com/​item.htm?​spm=a1z10.1-c-s.w4004-22598974120.3.5923532fAsAtPz&​id=614919247574|点击购买]] +  - Micro USB线缆 
-  - USB-CABLE(或相同功能)仿真器 +  - ISE开发平台 
-  - Micro USB线缆 +  - 电脑一台 
-  - ISE开发平台 +==== 三、 实验原理 ====
-  - 电脑一台 +
-==== 三、实验原理 ==== +
   * 计数器是实现计数的一种最基本的加法运算。在FPGA中计数器的实质其实就是对驱动参考时钟进行计数,每当触发条件满足,计数器的寄存器参数实现自加,累加到某个状态进行清零操作。FPGA中常用计数器对系统时钟进行计数,实现时钟分频、定时器、延时、计数、控制等功能,是FPGA实现功能中常用的一种逻辑电路和时序控制方式。   * 计数器是实现计数的一种最基本的加法运算。在FPGA中计数器的实质其实就是对驱动参考时钟进行计数,每当触发条件满足,计数器的寄存器参数实现自加,累加到某个状态进行清零操作。FPGA中常用计数器对系统时钟进行计数,实现时钟分频、定时器、延时、计数、控制等功能,是FPGA实现功能中常用的一种逻辑电路和时序控制方式。
   * 呼吸灯在生活中也较为常见,一般是通过控制LED的亮度渐变实现的。以本实验要实现的呼吸灯为例,要实现的效果为渐渐变亮,亮度最大后再渐渐变暗,最后熄灭,如此往复循环。LED的亮度变化是通过控制LED单位时间内亮的时间占比实现的;比如以10个时钟周期作为1个单位时间周期,当LED亮的时间持续2个时钟周期,熄灭的时间持续8个时钟周期,那么,当时钟周期较小时,每秒由成千上万个这样的单位时间构成;反馈到人的眼睛,由于视觉暂留,眼睛看不到很高频率的闪烁,而是看到LED的亮度很低。同理,当10个时钟周期里持续8个时钟周期的亮,则看起来亮度就高。   * 呼吸灯在生活中也较为常见,一般是通过控制LED的亮度渐变实现的。以本实验要实现的呼吸灯为例,要实现的效果为渐渐变亮,亮度最大后再渐渐变暗,最后熄灭,如此往复循环。LED的亮度变化是通过控制LED单位时间内亮的时间占比实现的;比如以10个时钟周期作为1个单位时间周期,当LED亮的时间持续2个时钟周期,熄灭的时间持续8个时钟周期,那么,当时钟周期较小时,每秒由成千上万个这样的单位时间构成;反馈到人的眼睛,由于视觉暂留,眼睛看不到很高频率的闪烁,而是看到LED的亮度很低。同理,当10个时钟周期里持续8个时钟周期的亮,则看起来亮度就高。
   * 呼吸灯的呼吸效果是如何实现的呢?以本实验为例,呼吸周期为2秒,则从暗到亮的过程持续1秒,从亮到暗的过程持续1秒。在从暗到亮的过程中,假如这1秒分成1000个单位时间周期,则每个单位时间周期里LED亮的时间都要比前一个久一点。同理,从亮到暗的过程则是每个时间单位周期里LED亮的时间都要比前一个短一点。   * 呼吸灯的呼吸效果是如何实现的呢?以本实验为例,呼吸周期为2秒,则从暗到亮的过程持续1秒,从亮到暗的过程持续1秒。在从暗到亮的过程中,假如这1秒分成1000个单位时间周期,则每个单位时间周期里LED亮的时间都要比前一个久一点。同理,从亮到暗的过程则是每个时间单位周期里LED亮的时间都要比前一个短一点。
   * 以本实验呼吸灯亮的这1秒过程为例来阐述。系统时钟为25MHz,机1秒钟内有25M个系统时钟周期。将1秒分成5000个单位时间周期,每个单位时间周期持续5000个系统时钟周期。   * 以本实验呼吸灯亮的这1秒过程为例来阐述。系统时钟为25MHz,机1秒钟内有25M个系统时钟周期。将1秒分成5000个单位时间周期,每个单位时间周期持续5000个系统时钟周期。
-  ​* **25M/​5000=5000**+    ​* **25M/​5000=5000**
   * 那么,只需将这5000个单位时间周期内LED亮的时间从0~5000逐渐增加,这1秒LED看起来就是逐渐变亮的;同理也可以控制LED灯逐渐变暗。   * 那么,只需将这5000个单位时间周期内LED亮的时间从0~5000逐渐增加,这1秒LED看起来就是逐渐变亮的;同理也可以控制LED灯逐渐变暗。
 +==== 四、 代码讲解 ====
  
- 
-==== 四、代码讲解 ==== 
   * 原理部分讲解了呼吸灯的实现原理。下面通过代码讲解如何实现LED呼吸的效果。   * 原理部分讲解了呼吸灯的实现原理。下面通过代码讲解如何实现LED呼吸的效果。
   * 首先定义变量cnt1和cnt2;cnt1是对单位时间周期内系统时钟进行计数,cnt2是对单位时间周期(即cnt1)进行计数,那么cnt1*cnt2=25M,​。然后定义变量flag,每过1秒翻转1次,则可以在flag的不同状态控制LED是渐亮还是渐灭。   * 首先定义变量cnt1和cnt2;cnt1是对单位时间周期内系统时钟进行计数,cnt2是对单位时间周期(即cnt1)进行计数,那么cnt1*cnt2=25M,​。然后定义变量flag,每过1秒翻转1次,则可以在flag的不同状态控制LED是渐亮还是渐灭。
行 40: 行 36:
 always@(posedge clk_25M or negedge rst_n) always@(posedge clk_25M or negedge rst_n)
  if(!rst_n)  if(!rst_n)
- cnt1<​=13'​d0;​+     ​cnt1<​=13'​d0;​
  else if(cnt1==13'​d4999)  else if(cnt1==13'​d4999)
- cnt1<​=13'​d0;​+     ​cnt1<​=13'​d0;​
  else  else
- cnt1<​=cnt1+1'​d1;​+     ​cnt1<​=cnt1+1'​d1;​
 //​------------------cnt2-------------------//​ //​------------------cnt2-------------------//​
 //​对cnt1进行计数  //​对cnt1进行计数
 always@(posedge clk_25M or negedge rst_n) always@(posedge clk_25M or negedge rst_n)
  if(!rst_n)  if(!rst_n)
- cnt2<​=13'​d0;​+     ​cnt2<​=13'​d0;​
  else if((cnt1==13'​d4999)&&​(cnt2==13'​d4999))  else if((cnt1==13'​d4999)&&​(cnt2==13'​d4999))
- cnt2<​=13'​d0;​+     ​cnt2<​=13'​d0;​
  else if(cnt1==13'​d4999)  else if(cnt1==13'​d4999)
- cnt2<​=cnt2+1'​d1;​+     ​cnt2<​=cnt2+1'​d1;​
 //​-----------------flag--------------------//​ //​-----------------flag--------------------//​
 //​flag为1时led逐渐变亮,flag为0时逐渐变暗 //​flag为1时led逐渐变亮,flag为0时逐渐变暗
行 59: 行 55:
 always@(posedge clk_25M or negedge rst_n) always@(posedge clk_25M or negedge rst_n)
  if(!rst_n)  if(!rst_n)
- flag<​=1'​d0;​+     ​flag<​=1'​d0;​
  else if((cnt2==13'​d0)&&​(cnt1==13'​d0))  else if((cnt2==13'​d0)&&​(cnt1==13'​d0))
- flag<​=~flag;​+     ​flag<​=~flag;​
 //​-----------------led--------------------//​ //​-----------------led--------------------//​
 //​控制LED在哪个范围内亮和灭 //​控制LED在哪个范围内亮和灭
 always@(posedge clk_25M or negedge rst_n) always@(posedge clk_25M or negedge rst_n)
  if(!rst_n)  if(!rst_n)
- led_r<​=1'​d1;​+     ​led_r<​=1'​d1;​
  else if((flag==1'​d1)&&​(cnt2<​cnt1))  else if((flag==1'​d1)&&​(cnt2<​cnt1))
- led_r<​=1'​d0;​ +     ​led_r<​=1'​d0;​ 
- else if((flag==1'​d0)&&​(cnt2>​cnt1)) + else if((flag==1'​d0)&&​(cnt2>​cnt1)) 
- led_r<​=1'​d0;​+     ​led_r<​=1'​d0;​
  else   else 
- led_r<​=1'​d1;​ +     ​led_r<​=1'​d1;​
- +
 </​code>​ </​code>​
-==== 五、实验步骤及实验结果 ==== +==== 五、 实验步骤及实验结果 ====
-{{ :​icore4tx:​icore4tx_fpga_8_1.png?​direct&​400 |图8.1}} +
-1、将硬件正确连接,如图8.1所示。\\  +
-2、将编写好的代码进行编译,并下载到开发板中;\\  +
-3、观察实验现象——FPGA_LED逐渐变亮然后逐渐变暗,循环进行。\\  +
- +
-==== 六、拓展实验 ==== +
-  - 调整LED灯的呼吸周期。 +
-  - 通过计数器,控制led熄灭之后延迟一段时间再逐渐变亮。+
  
 +{{ :​icore4tx:​icore4tx_fpga_8_1.png?​direct&​400 |图8-1}}
 +  - 将硬件正确连接,如图8-1所示。
 +  - 将编写好的代码进行编译,并下载到开发板中;
 +  - 观察实验现象——FPGA_LED逐渐变亮然后逐渐变暗,循环进行。
 +==== 六、 拓展实验 ====
 +  * 调整LED灯的呼吸周期。
 +  * 通过计数器,控制LED熄灭之后延迟一段时间再逐渐变亮。
  
icore4tx_fpga_8.1589963826.txt.gz · 最后更改: 2020/05/20 16:37 由 fmj