这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 上一修订版 两侧同时换到之后的修订记录 | ||
icore4tx_fpga_10 [2020/05/22 11:58] zgf |
icore4tx_fpga_10 [2020/05/22 15:06] zgf 创建 |
||
---|---|---|---|
行 6: | 行 6: | ||
| V1.0 | 2020-05-21 | gingko | 初次建立 | | | V1.0 | 2020-05-21 | gingko | 初次建立 | | ||
- | ===== 实验十一:GPIO输入实验——识别按键输入 ===== | + | ===== 实验十:PWM输出实验——不同PWM输出 ===== |
==== 一、实验目的与意义 ==== | ==== 一、实验目的与意义 ==== | ||
- | - 了解按键特征和应用。 | + | - 掌握输出不同占空比PWM的原理及方法。 |
- | - 掌握 FPGA 引脚的配置方法。 | + | - 掌握宏定义、参数变量的使用方法。 |
- | - 学习按键消抖的实现方法。 | + | - 掌握ISE的使用方法。 |
==== 二、实验设备及平台 ==== | ==== 二、实验设备及平台 ==== | ||
行 23: | 行 23: | ||
==== 三、实验原理 ==== | ==== 三、实验原理 ==== | ||
- | **按键动作检测和消抖** | + | * 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在每次按键按下后切换亮灭状态。 | + | |
- | + |