用户工具

站点工具


icore4tx_fpga_10

差别

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

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
icore4tx_fpga_10 [2020/05/22 14:20]
zgf
icore4tx_fpga_10 [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-21  ​| ​ gingko ​ |  初次建立 ​ | 
  
-===== 实验计数器实验——呼吸灯 ​=====+===== 实验PWM输出实验——不同PWM输出 ​=====
  
 ==== 一、实验目的与意义 ==== ==== 一、实验目的与意义 ====
  
-  - 掌握计数器原理及使用方法 +  - 掌握输出不同占空比PWM的原理及方法。 
-  - 掌握ISE开发软件的使用方法。+  - 掌握宏定义、参数变量的使用方法 
 +  - 掌握ISE的使用方法。
  
 ==== 二、实验设备及平台 ==== ==== 二、实验设备及平台 ====
行 23: 行 22:
 ==== 三、实验原理 ==== ==== 三、实验原理 ====
  
-  * 计数器实现计数的一种最基本的加法运算在FPGA中计数器的实质其实就是对驱动参考时钟进行计数每当触发条件满足,计数器寄存器参数实现自加,累加到某个状态进行清零操作FPGA常用计数器对系统时钟进行计数,实现时钟分、定时器、延时、计数、控制等功能,FPGA实现功能中一种逻辑电路和时序控制方式 +  * PWM全称是Pulse Width Modulation,脉冲宽度调制缩写通过脉冲宽度进行调制等效输出所需要波形在PWM波形属性中频率和占空比两个非重要参数本实验的是通过FPGA硬件语言描述实现不频率、占空比PWM信号输出。 
-  * 呼吸灯在生活中也较为常见,一般是通过控制LED的亮度渐变实现的。以本实验要实现呼吸灯为例,实现效果为渐渐变亮,亮度最大后再渐渐变暗,最后熄灭,如此往复循环。LED的亮度变化是通过控制LED单位时间内亮时间占比实现的;比如以10个时钟周期作为1个单位时间周期,当LED亮的时间持续2个时钟周期,熄灭的时间持续8个时钟周期,那么,当时钟周期较小时,每秒由成千上万个这样的单位时间构成;反馈到人的眼睛,由于视觉暂留,眼睛看到很高频率的闪烁,而是看到LED的亮度很低。同理,当10个时钟周期里持续8个时钟周期的亮,则看起来亮度就高。 +  * FPGA产生不同频率不同占空比的原理基于计数器实现的,对参考钟进行计数控制某信号高低电平输出实现频率和占空的变化其实现原如图10.1所示改变puty的值改变pwm占空,通改变cycle值改pwm频率。 
-  * 呼吸灯呼吸效果如何实现的呢?以本实验为例呼吸周期为2秒,则从暗到亮的程持续1秒,从亮到暗的过程持续1秒。在从暗到亮的过程中,假如这1秒分成1000个单位间周期则每单位时间周期里LED亮的时间都要前一个久一点理,从亮到暗的程则是每个时间单位周期里LED亮时间都要前一个短一点。 +{{ :​icore4tx:​icore4tx_fpga_10_1.png?​direct |图10.1}}
-  * 以本实验呼吸灯亮的这1秒程为例来阐述。系统时钟为25MHz,机1秒钟内有25M个系统时钟周期。将1秒分成5000个单位时间周期,每个单位时间周期持续5000个系统时钟周期。 +
-                                       * **25M/​5000=5000** +
-  * 那么,只需将这5000个单位时间周期内LED亮时间从0~5000逐渐增加,这1秒LED看起来就是逐渐;同理也可以控制LED灯逐渐变暗。 +
  
 ==== 四、代码讲解 ==== ==== 四、代码讲解 ====
-  * 原理部分讲解了呼吸灯的原理。下面通过代码讲解如何实现LED呼吸的效果。 +  * 原理通过参考时钟进行计数,并在计数器特时刻进行高低电平的来改变输出波形频率占空比。本实验参考钟为clk_25m频率控制参数为cycle占空比参数为puty_50和puty_20频率为500KHz波形计算方公式为:**clk_25m/​(cycle-1);​** 
-  * 首先定义变量cnt1和cnt2;cnt1是对单位时间周期内系统时钟进行计数,cnt2是对单位间周期(即cnt1)进行计数,那么cnt1*cnt2=25M,​。然后量flag每过1秒翻转1次,则可以在flag不同状态控制LED是渐亮还是渐灭。 +  * 占空比为20%参数计算公式为:**puty_20/​cycle;​** 
-  * 具体的LED在1个单位时间周期内亮的时间持续多少个系统时钟周期,是通过cnt1cnt2的值较判断的由于cnt2是逐1自加的,那么每次在cnt1从1累加到4999的过程,cnt2是不变的,而且每次cnt1累加的过程中,cnt2总比前一个值大1;那么,在cnt1累加的过程中,小于cnt2的值的,控制led亮在cnt2累加的过程中即可实现led逐渐变亮逐渐变暗过程同理,只需控制cnt1大于cnt2时候led亮即可。 +  * 占空比为50%的参数计算公式为:**puty_50/​cycle** 
-**  ​代码如下:**+**  ​代码如下:**
 <code verilog> <code verilog>
-//​-------------------cnt1--------------------//​ +always@(posedge ​clk_25m ​or negedge rst_n) 
-//​对系统时钟进行计数 +        ​begin 
-always@(posedge ​clk_25M ​or negedge rst_n) +            ​if(!rst_n) 
- if(!rst_n) +                ​begin 
- cnt1<=13'd0; +                    cycle_cnt ​<= 8'd0; 
- else if(cnt1==13'd4999) +                    ​pwm20_sig_r <1'd0; 
- cnt1<=13'd0; +                    ​pwm50_sig_r ​<= 1'd0; 
- else +                end 
- cnt1<=cnt1+1'd1+            ​else 
-//------------------cnt2-------------------//​ +                ​begin 
-//​对cnt1进行计数  +                    if(cycle_cnt==cycle-1'd1)//计数器清零,步两个信号相位 
-always@(posedge clk_25M or negedge rst_n) +                        begin 
- if(!rst_n) +                            ​cycle_cnt ​<= 8'd0; 
- cnt2<=13'd0; +                            ​pwm20_sig_r <1'd1; 
- else if((cnt1==13'd4999)&&​(cnt2==13'​d4999)) +                            ​pwm50_sig_r ​<= 1'd1
- cnt2<=13'd0+                        end 
- else if(cnt1==13'​d4999) +                    ​else if(cycle_cnt==puty_50-1'd1)//变换占空比50% 
- cnt2<​=cnt2+1'd1+                        begin 
-//-----------------flag--------------------//​ +                            ​pwm50_sig_r ​<= 1'​d0;​ 
-//​flag为1时led逐渐亮,flag0时逐渐变暗 +                            ​cycle_cnt ​<= cycle_cnt + 8'd1; 
-reg flag; +                        end 
-always@(posedge clk_25M or negedge rst_n) +                    ​else if(cycle_cnt==puty_20-1'd1)//​变换占空比为20% 
- if(!rst_n) +                        begin 
- flag<​=1'​d0;​ +                            ​pwm20_sig_r ​<= 1'​d0;​ 
- else if((cnt2==13'​d0)&&​(cnt1==13'​d0)) +                            ​cycle_cnt ​<= cycle_cnt + 8'd1
- flag<=~flag; +                        end 
-//​-----------------led--------------------//​ +                    ​else//​计数器自加 
-//​控制LED在哪个范围内亮和灭 +                        ​begin 
-always@(posedge clk_25M or negedge rst_n) +                            cycle_cnt ​<= cycle_cnt + 8'd1; 
- if(!rst_n) +                        end 
- led_r<​=1'd1; +                end 
- else if((flag==1'​d1)&&​(cnt2<​cnt1)) +        end
- led_r<​=1'​d0;​ +
- else if((flag==1'​d0)&&​(cnt2>​cnt1)) +
- led_r<=1'd0+
- else  +
- led_r<=1'd1; +
- +
 </​code>​ </​code>​
 + 
 ==== 五、实验步骤及实验结果 ==== ==== 五、实验步骤及实验结果 ====
-{{ :icore4tx:icore4tx_fpga_8_1.png?​direct&​400 |图8.1}} +{{ :icore4tx:icore4tx_fpga_10_2.png?​direct&​400 |图10.2}} 
-1、将硬件正确连接,如图8.1所示。\\ ​+1、将硬件正确连接,如图10.2所示。\\ ​
 2、将编写好的代码进行编译,并下载到开发板中;\\ ​ 2、将编写好的代码进行编译,并下载到开发板中;\\ ​
-3、观察实验现象——FPGA_LED逐渐变亮然后逐渐变暗,循环进行。\\  +3、观察实验现象——如图10-3所示。\\  
 +{{ :​icore4tx:​icore4tx_fpga_10_3.png?​direct |图10.3}}
 ==== 六、拓展实验 ==== ==== 六、拓展实验 ====
-  - 调整LED灯的呼吸周期。 +  - 改变cycle和puty参数,观察信号
-  - 通过计控制led熄灭之后延迟一段时间再逐渐 +
- +
- +
- +
icore4tx_fpga_10.txt · 最后更改: 2022/04/01 11:37 由 sean