这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 | ||
icore4tfpga_9 [2020/03/02 20:25] zgf 创建 |
icore4tfpga_9 [2024/04/10 11:03] (当前版本) zhaowenzhe [五、实验步骤] |
||
---|---|---|---|
行 2: | 行 2: | ||
|技术支持电话|**0379-69926675-801**||| | |技术支持电话|**0379-69926675-801**||| | ||
|技术支持邮件|Gingko@vip.163.com||| | |技术支持邮件|Gingko@vip.163.com||| | ||
- | |技术论坛|http://www.eeschool.org||| | ||
^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ||
- | | V1.0 | 2020-03-02 | gingko | 初次建立 | | + | | V1.0 | 2020-04-03 | gingko | 初次建立 | |
- | ===== 实验九:计数器实验——呼吸灯 ===== | + | ===== 实验九:GPIO 输入实验——识别按键输入 ===== |
- | + | ==== 一、实验目的与意义 ==== | |
- | ==== 一、 实验目的与意义 ==== | + | |
- | + | - 了解按键特征和应用。 | |
- | - 掌握计数器原理及实现方法。 | + | - 掌握 FPGA 引脚的配置方法。 |
- | - 掌握QuartusII的使用方法。 | + | - 学习按键消抖的实现方法。 |
- | ==== 二、 实验设备及平台 ==== | + | ==== 二、实验设备及平台 ==== |
- | + | ||
- | - iCore4T 双核心板。 | + | - iCore4T 双核心板+iCore4T扩展底板。 |
- | - Blaster(或相同功能)仿真器。 | + | - iTool A(或相同功能)仿真器。 |
- | - Micro USB线缆。 | + | - USB Type C 线缆。 |
- | - Keil MDK 开发平台。 | + | - QuartusII 开发平台。 |
- | - Quartus开发平台。 | + | - 装有 WIN XP(及更高版本)系统的计算机。 |
- | - 电脑一台。 | + | ==== 三、实验原理 ==== |
- | ==== 三、 实验原理 ==== | + | * **按键动作检测和消抖** |
- | * 计数器是实现计数的一种最基本的加法运算。在FPGA中计数器的实质其实就是嘴驱动参考时钟进行计数,每当触发事件到来,计数器参数实现自加,到某个状态进行清零操作。FPGA中常用计数器实现时钟分频、定时器、延时、计数、控制等功能,是FPGA实现功能中常用的一种逻辑电路。 | + | * FPGA 的所有 I/O 控制块允许每个 I/O 引脚单独配置为输入口,不过这种配置是系统自动完成的。当该 I/O 口被设置为输入口使用时,该 I/O 控制模块将直接使三态缓冲区的控制端接地,使得该 I/O 对外呈高阻态,这样该 I/O 引脚即可用输入引脚使用。 |
- | ==== 四、 代码讲解 ==== | + | * iCore4T超迷你核心板上是没有按键的,其扩展板上有个按键,可以通过扩展接口和FPGA相连。原理图如下: |
- | + | {{ :icore4t:icore4t_fpga_9_1.png?direct |}} | |
- | * 本实验是通过计数器实现一个周期为1s的定时器,然后通过定时器产生的信号作为触发事件控制led电平高低切换,实现led的闪烁功能。驱动参考时钟为25MHz,也就是说时钟周期为40ns,1s的周期需要25000000个时钟周期,因此定时器的计数器需要在25000000个周期时进行清零操作。其代码如下: | + | * 从原理图中可以看到,按键未按下时,FPGA引脚是悬空的,此时该引脚对外呈高阻态。当按键按下时,FPGA电平为高。正确分配并锁定引脚后,一旦检测到按键有变化,即可切换 LED 的状态。 |
+ | * 也就是通过检测FPGA_KEY引脚的电平变化,判断按键状态,进而控制LED的亮灭。在按键按下和松开的过程,电平并不是理想的立即从高到低或者从低到高变化的。在跳变的过程中,是有抖动的,持续大概10ms左右。抖动会影响FPGA判断按键稳定状态的电平,因此在设计中要对按键动作做消抖处理。原理很简单,检测到跳变沿后做延时处理,跳过抖动阶段,再读取按键状态,从而实现按键消抖操作。 | ||
+ | ==== 四、代码实现 ==== | ||
+ | * 本实验代码较为简单,首先使对输入信号进行延迟1拍处理,便于进行沿跳变检测。检测到下降沿后开始计数。然后在对时钟计数持续约40ms后,采集按键输入引脚的电平状态,进而控制LED的亮灭切换。 | ||
+ | * 代码理解和实现较为简单,不过需要注意对延时计数器的控制,使其在按键按下期间持续计数。按键未按下时进行清零。代码如下: | ||
<code verilog> | <code verilog> | ||
- | /*************************************************/ | + | //---------------------按键动作检测---------------------------// |
- | //利用计数器实现一个定时器,定时为1s | + | reg FPGA_KEY_r; |
- | reg [31:0]time_cnt; | + | |
- | + | always@(posedge CLK_25M or negedge rst_n) | |
- | always@(posedge clk_25m or negedge rst_n) | + | if(!rst_n) |
- | begin | + | FPGA_KEY_r<=1'b0; |
- | if(!rst_n) | + | else |
- | begin | + | FPGA_KEY_r<=FPGA_KEY;//输入信号延迟1拍 |
- | time_cnt <= 32'd0; | + | |
- | end | + | reg [19:0]cnt; |
- | else | + | reg flag; |
- | begin | + | always@(posedge CLK_25M or negedge rst_n) |
- | if(time_cnt==32'd24999999) | + | if(!rst_n) |
- | begin | + | flag<=1'd0; |
- | time_cnt <= 32'd0;///计数器清零 | + | else if((FPGA_KEY==1'd0)&&(FPGA_KEY_r==1'd1))//下降沿检测 |
- | end | + | flag<=1'd1; |
- | else | + | else if((FPGA_KEY==1'd1)&&(FPGA_KEY_r==1'd0))//上升沿检测 |
- | begin | + | flag<=1'd0; |
- | time_cnt <= time_cnt + 1'd1;//计数器自加1 | + | |
- | end | + | always@(posedge CLK_25M or negedge rst_n) |
- | end | + | if(!rst_n) |
- | end | + | cnt<=20'd0; |
- | + | else if((cnt<20'd1000000)&&(flag))//约40ms | |
- | wire time_sig = (time_cnt==32'd24999999) ? 1'd1 : 1'd0;//定时器信号 | + | cnt<=cnt+1'd1; |
+ | else if((cnt==20'd1000000)&&(flag)) | ||
+ | cnt<=cnt; | ||
+ | else | ||
+ | cnt<=20'd0; | ||
+ | |||
+ | reg led; | ||
+ | always@(posedge CLK_25M or negedge rst_n)//LED 状态切换 | ||
+ | if(!rst_n) | ||
+ | led<=1'd1; | ||
+ | else if(cnt==20'd900000) | ||
+ | led<=~led; | ||
</code> | </code> | ||
- | ==== 五、 实验步骤及实验结果 ==== | + | * 编译完代码,在将程序烧录到FPGA之前,要对FPGA的引脚进行设置。将时钟、按键、LED信号绑定到对应引脚,绑定信息可以参考iCore4T的原理图,或者例程文件夹下的.tcl文件。其他未使用引脚要设置为三态输入,设置步骤参考如下: |
- | + | 1、点击Assignments,下拉菜单中点击Device…。 | |
- | 1、将硬件正确连接,如图9.1所示。 | + | {{ :icore4t:icore4t_fpga_9_2.png?direct&850 |}} |
- | {{ :icore4t:icore4t_fpga_9_1.jpg?direct |图9.1}} | + | 2、弹出窗口中点击Device and Pin Options… 。 |
- | + | {{ :icore4t:icore4t_fpga_9_3.png?direct&850 |}} | |
- | 2、将编写好的代码进行编译,并下载到开发板中; | + | 3、点击左侧边栏中的Unused Pins,右侧下拉菜单中选择As input tri-stated,然后点击OK即可。 |
- | 3、观察实验现象——FPGA_LED闪烁,间隔1s。 | + | {{ :icore4t:icore4t_fpga_9_4.png?direct&850 |}} |
- | ==== 六、 拓展实验 ==== | + | 4、回到工程主界面后点击保存按钮,然后点击编译,至此完成引脚设置。 |
- | + | ==== 五、实验步骤 ==== | |
- | - 通过Signaltap观察定时信号与定时计数器之间的关系。 | + | - 将iCore4T双核心版插入底板的金手指插座,轻轻下压,使双核心板和底板联通并固定在底板上。 |
+ | - 把仿真器与 iCore4T 的调试口相连; | ||
+ | - 把iCore4T通过 USB 线与计算机相连,为 iCore4T 供电; | ||
+ | - 打开本实验工程; | ||
+ | - 烧写程序到 iCore4T 上; | ||
+ | - 按下按键,观察LED状态的切换。 | ||
+ | ==== 六、实验现象 ==== | ||
+ | * 按动iCore4T 底板的FPGA按键,iCore4T 双核心板上的 FPGA_LED(PCB 上标示为 FPGA·LED)在每次按键按下后切换亮灭状态。 | ||