用户工具

站点工具


icore4tfpga_9

差别

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

到此差别页面的链接

后一修订版
前一修订版
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)在每次按键按下后切换亮灭状态。 
  
icore4tfpga_9.1583151914.txt.gz · 最后更改: 2020/03/02 20:25 由 zgf