用户工具

站点工具


icore4tx_fpga_10

差别

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

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
icore4tx_fpga_10 [2020/05/22 11:58]
zgf
icore4tx_fpga_10 [2022/04/01 11:37] (当前版本)
sean
行 2: 行 2:
 |技术支持电话|**0379-69926675-801**||| |技术支持电话|**0379-69926675-801**|||
 |技术支持邮件|Gingko@vip.163.com||| |技术支持邮件|Gingko@vip.163.com|||
-|技术论坛|http://​www.eeschool.org||| 
 ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^ ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^
 |  V1.0  |  2020-05-21 ​ |  gingko ​ |  初次建立 ​ |  |  V1.0  |  2020-05-21 ​ |  gingko ​ |  初次建立 ​ | 
  
-===== 实验十GPIO实验——识别按键入 =====+===== 实验十:PWM实验——不同PWM出 =====
  
 ==== 一、实验目的与意义 ==== ==== 一、实验目的与意义 ====
  
-  - 了解按键特征和应用。 +  - 掌握输出不同占空比PWM的原理及方法。 
-  - 掌握 ​FPGA 引脚配置方法。 +  - 掌握宏定义、参数变量使用方法。 
-  - 学习按键消抖实现方法。+  - 掌握ISE使用方法。
  
 ==== 二、实验设备及平台 ==== ==== 二、实验设备及平台 ====
行 23: 行 22:
 ==== 三、实验原理 ==== ==== 三、实验原理 ====
  
-**按键动作检测和消抖** +  ​PWM全称是Pulse Width Modulation,是脉冲宽度调制缩写它是通过对脉宽度进行调制,等效出所需要的波形在PWM波形属性中频率和占空比两个非常重要参数。而本实验的主要目的就是通过FPGA的硬件语言描述实现不同频率、占空比的PWM信号输出。 
-  * FPGA 的所有 I/O 控制块允许每个 I/O 引脚单独配置为输入口不过这种配置系统自动完成的当该 I/O 口被设置为输入口使用时,该 I/O 控制模块将直接使三态缓区的控端接地使得该 I/O 对外呈高阻态,这样该 I/O 引脚即可用入引脚使用 +  * FPGA产生不同频率不同占空比的的原理是基于计数器实现的,通过参考钟进行计数控制某个信号高低电平输出实现频率和占空比的变化。其实现原理如图10.1所示,通过改变puty值改pwm的占空比cycle值改pwm频率 
-  * iCore4TX超迷你核心板上没有按键,其扩展板上有个按键,可以通过扩展接口和FPGA相连原理图如下: +{{ :​icore4tx:​icore4tx_fpga_10_1.png?​direct |图10.1}}
-{{ :​icore4tx:​icore4tx_fpga_11_1.png?​direct |图11.1}} +
-  * 原理图中可以看到,按键未按下时,FPGA引脚悬空的,此时该引脚外呈高阻态。当按键按下时,FPGA电平为高。正确分配并锁定引脚后,一旦检测到按键有变化,即可切换 LED 的状态。 +
-  * 也就是通过检测FPGA·KEY引脚电平判断按键状态,进而控制LED的亮灭。在按键按下和松开的程,电平并不是理想的立即从高到低或者从低到高。在跳变的过程中,是有抖动的,持续大概10ms左右。抖动会影响FPGA判断按键稳定状态的电平,因此在设计中要对按键动作做消抖处理。原理很简单,检测到跳变沿后做延时处理,跳过抖动阶段,再读取按键状态,从而实现按键消抖操作+
  
 ==== 四、代码讲解 ==== ==== 四、代码讲解 ====
-  * 本实验代码较为简单,首先使对输入信号进行延迟1拍处,便于进行沿跳变检测。检测到下降沿后开始计数。然后时钟计数持续约40ms后,采集按键输入引脚的电平状态,进而控制LED亮灭切。代码理解和实现较简单不过需要注意对延时计数器的控制,使其在按键按下期间持续计数。按键未按下时进行清零+  * 本实验是通过参考时钟进行计数,并在时钟计数器特定时刻进行高低电平的,来改变输出波形的频率占空比。本验中参考时钟clk_25m频率控制参数为cycle占空比参为puty_50和puty_20频率为500KHz的波形计算方公式为:**clk_25m/​(cycle-1);​** 
 +  * 占空比为20%的参数计算公式为:**puty_20/​cycle;​** 
 +  * 占空比为50%的参数计算公式为:**puty_50/​cycle**
 **  其代码如下:** **  其代码如下:**
 <code verilog> <code verilog>
-//​---------------------按键动作检测---------------------------//​ +always@(posedge ​clk_25m ​or negedge rst_n) 
- reg key_r; +        ​begin 
- always@(posedge ​clk_25M ​or negedge rst_n) +            ​if(!rst_n) 
- if(!rst_n) +                ​begin 
- key_r<=1'b0+                    cycle_cnt ​<= 8'd0
- else +                    ​pwm20_sig_r ​<= 1'd0
- key_r<=key;//​输入信号延迟1拍 +                    ​pwm50_sig_r ​<= 1'​d0;​ 
- reg [19:0]cnt+                end 
- reg flag; +            ​else 
- always@(posedge clk_25M or negedge rst_n) +                begin 
- if(!rst_n) +                    ​if(cycle_cnt==cycle-1'd1)//​计数器清零,步两个信号相位 
- flag<​=1'​d0;​ +                        begin 
- else if((key==1'd0)&&​(key_r==1'd1))//​下降沿检测 +                            cycle_cnt <8'​d0;​ 
- flag<​=1'​d1;​ +                            pwm20_sig_r <= 1'd1; 
- else if((key==1'd1)&&​(key_r==1'​d0))//上升沿检测 +                            ​pwm50_sig_r ​<= 1'​d1;​ 
- flag<​=1'​d0;​ +                        end 
- always@(posedge clk_25M or negedge rst_n) +                    ​else if(cycle_cnt==puty_50-1'​d1)//​变换占空比为50% 
- if(!rst_n) +                        begin 
- cnt<=20'd0+                            ​pwm50_sig_r ​<= 1'​d0;​ 
- else if((cnt<20'd1000000)&&​(flag))//约40ms +                            ​cycle_cnt ​<= cycle_cnt + 8'd1
- cnt<=cnt+1'd1+                        end 
- else if((cnt==20'​d1000000)&&​(flag)) +                    ​else if(cycle_cnt==puty_20-1'd1)//变换占空比为20% 
- cnt<=cnt; +                        ​begin 
- else +                            pwm20_sig_r ​<= 1'd0
- cnt<​=20'd0+                            ​cycle_cnt ​<= cycle_cnt + 8'd1
- reg led_r; +                        end 
- always@(posedge clk_25M or negedge rst_n)//LED 状态切换 +                    else//计数器自加 
- if(!rst_n) +                        begin 
- led_r<=1'd1; +                            ​cycle_cnt ​<= cycle_cnt + 8'd1; 
- else if(cnt==20'​d900000) +                        end 
-led_r<​=~led_r;​ +                end 
 +        end
 </​code>​ </​code>​
-  * 编译完代码,在将程序烧录到FPGA之前,要对FPGA的引脚进行设置。将时钟按键、LED信号绑定到对应引脚,绑定信息参考下图中所示,为.ucf文件中引脚绑定内容: ​ +  
-{{ :icore4tx:icore4tx_fpga_11_2.png?direct |图11.2}} +==== 五实验步骤及实验结果 ==== 
-  * 引脚绑定之后保存并编译工程,下载至iCore4tx双核心板,按下FPGA·KEY,观察FPGA·LED的状态变化。 +{{ :icore4tx:icore4tx_fpga_10_2.png?direct&​400 ​|图10.2}} 
- +1、将硬件正确连接如图10.2所示\\  
-==== 五实验步骤 ==== +2、将编写好代码进行编译载到开发\\  
-  - iCore4TX双核心版插入底板金手指插座轻轻压,使双核心和底板联通并固定在底板上。 +3、观察实验现象——如图10-3所示\\  
-  - 把 USB-CABLE 仿真器与 iCore4TX 的 JTAG 调试口相连; +{{ :​icore4tx:​icore4tx_fpga_10_3.png?​direct |图10.3}} 
-  - 把iCore4TX通过 Micro USB 线与计算机相连,为 iCore4TX 供电; +==== 六、拓展实验 ==== 
-  - 打开本实验工程;  +  ​- 改变cycle和puty参数观察信号变化
-  ​烧写程序到 iCore4TX 上;  +
-  - 按下按键,观察LED状态的切换。 +
- +
-==== 六、实验结果 ​==== +
-  ​* 按动iCore4TX 底板的FPGA按键iCore4TX 双核心板上的 FPGA·LED在每次按键按下后切换亮灭状态 +
- +
icore4tx_fpga_10.1590119926.txt.gz · 最后更改: 2020/05/22 11:58 由 zgf