这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
|
gpio输入实验_识别按键输入 [2020/07/02 11:22] zgf [四、 代码讲解] |
gpio输入实验_识别按键输入 [2022/03/22 10:27] (当前版本) sean |
||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | |||
| + | | **银杏科技有限公司旗下技术文档发布平台** |||| | ||
| + | |技术支持电话|**0379-69926675-801**||| | ||
| + | |技术支持邮件|Gingko@vip.163.com||| | ||
| + | ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ||
| + | | V1.0 | 2020-07-01 | gingko | 初次建立 | | ||
| + | |||
| + | |||
| ===== 实验二:GPIO输入实验——识别按键输入 ===== | ===== 实验二:GPIO输入实验——识别按键输入 ===== | ||
| ==== 一、 实验目的与意义 ==== | ==== 一、 实验目的与意义 ==== | ||
| 行 8: | 行 16: | ||
| ==== 二、 实验设备及平台 ==== | ==== 二、 实验设备及平台 ==== | ||
| - | - iCore4 双核心板。 | + | - iCore4 双核心板[[https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22598974120.15.5923532fsFrHiE&id=551864196684|点击购买]]。 |
| - | - Blaster(或相同功能)仿真器。 | + | - Blaster(或相同功能)仿真器[[https://item.taobao.com/item.htm?id=554869837940|点击购买]]。 |
| - Micro USB线缆。 | - Micro USB线缆。 | ||
| - QuartusII开发平台。 | - QuartusII开发平台。 | ||
| 行 15: | 行 23: | ||
| ==== 三、 实验原理 ==== | ==== 三、 实验原理 ==== | ||
| * FPGA的所有I/O控制块允许每个I/O引脚单独配置为输入口,不过这种配置是系统自动完成的。当I/O口被设置为输入口使用时,该I/O将直接使三态缓冲区的控制端接地,使得该I/O对外呈高阻态,这样该I/O引脚即可作为输入引脚使用。正确分配并锁定引脚后,一旦按键有变化,即可在检测到按键输入的情况下切换LED的状态。驱动示意图如下: | * FPGA的所有I/O控制块允许每个I/O引脚单独配置为输入口,不过这种配置是系统自动完成的。当I/O口被设置为输入口使用时,该I/O将直接使三态缓冲区的控制端接地,使得该I/O对外呈高阻态,这样该I/O引脚即可作为输入引脚使用。正确分配并锁定引脚后,一旦按键有变化,即可在检测到按键输入的情况下切换LED的状态。驱动示意图如下: | ||
| - | + | {{ :icore4:icore4_fpga_2_1.png?direct |图2-1}} | |
| - | + | ||
| - | 图2-1 | + | |
| ==== 四、 代码讲解 ==== | ==== 四、 代码讲解 ==== | ||
| 行 26: | 行 31: | ||
| - 按键控制模块:实现按键切换led的功能。 | - 按键控制模块:实现按键切换led的功能。 | ||
| * 如图2-2所示为本例程三个模块在QuartusII界面中所处的位置。双击即可打开对应的模块。 | * 如图2-2所示为本例程三个模块在QuartusII界面中所处的位置。双击即可打开对应的模块。 | ||
| - | + | {{ :icore4:icore4_fpga_2_2.png?direct |图2-2}} | |
| - | + | ||
| - | 图2-2 | + | |
| 1、顶层模块代码讲解: | 1、顶层模块代码讲解: | ||
| <code verilog> | <code verilog> | ||
| 行 74: | 行 76: | ||
| always@(posedge clk_25m) | always@(posedge clk_25m) | ||
| if(cnt_rst == 4'd15) | if(cnt_rst == 4'd15) | ||
| - | begin | + | begin |
| cnt_rst <= 4'd15; | cnt_rst <= 4'd15; | ||
| rst_r <= 1'd1; | rst_r <= 1'd1; | ||
| - | end | + | end |
| else cnt_rst <= cnt_rst + 1'd1; | else cnt_rst <= cnt_rst + 1'd1; | ||
| 行 89: | 行 91: | ||
| always @(posedge clk_25m or negedge rst_n) | always @(posedge clk_25m or negedge rst_n) | ||
| if (!rst_n) | if (!rst_n) | ||
| - | begin | + | begin |
| - | key_r <= 1'd0; | + | key_r <= 1'd0; |
| - | low_cnt <= 18'd0; | + | low_cnt <= 18'd0; |
| - | hig_cnt <= 18'd0; | + | hig_cnt <= 18'd0; |
| - | end | + | end |
| //----------检测按键状态为高时,延时10ms,把按键状态提取出来 ------// | //----------检测按键状态为高时,延时10ms,把按键状态提取出来 ------// | ||
| else if(key) | else if(key) | ||
| begin | begin | ||
| - | low_cnt <= 18'd0; | + | low_cnt <= 18'd0; |
| - | if (hig_cnt == ms_10) | + | if (hig_cnt == ms_10) |
| - | begin | + | begin |
| - | key_r <= key; | + | key_r <= key; |
| - | hig_cnt <= hig_cnt; | + | hig_cnt <= hig_cnt; |
| - | end | + | end |
| - | else hig_cnt <= hig_cnt + 1'd1; | + | else hig_cnt <= hig_cnt + 1'd1; |
| end | end | ||
| 行 111: | 行 113: | ||
| always@(negedge key_state or negedge rst_n) | always@(negedge key_state or negedge rst_n) | ||
| if (!rst_n) | if (!rst_n) | ||
| - | begin | + | begin |
| - | led_cnt <= 2'd0; | + | led_cnt <= 2'd0; |
| - | end | + | end |
| else if (led_cnt == 2'd2) | else if (led_cnt == 2'd2) | ||
| begin | begin | ||
| - | led_cnt <= 2'd0; | + | led_cnt <= 2'd0; |
| end | end | ||
| else led_cnt <= led_cnt + 1'd1; | else led_cnt <= led_cnt + 1'd1; | ||
| 行 124: | 行 126: | ||
| //----- led_cnt=0,红灯亮,led_cnt=1,绿灯亮led_cnt=2,蓝灯亮----// | //----- led_cnt=0,红灯亮,led_cnt=1,绿灯亮led_cnt=2,蓝灯亮----// | ||
| else case(led_cnt) | else case(led_cnt) | ||
| - | 2'd0: | + | 2'd0: |
| - | begin | + | begin |
| - | ledr <= 1'd0; | + | ledr <= 1'd0; |
| - | ledg <= 1'd1; | + | ledg <= 1'd1; |
| - | ledb <= 1'd1; | + | ledb <= 1'd1; |
| - | end | + | end |
| - | 2'd1: | + | 2'd1: |
| - | begin | + | begin |
| - | ledr <= 1'd1; | + | ledr <= 1'd1; |
| - | ledg <= 1'd0; | + | ledg <= 1'd0; |
| - | ledb <= 1'd1; | + | ledb <= 1'd1; |
| - | end | + | end |
| - | 2'd2: | + | 2'd2: |
| - | begin | + | begin |
| - | ledr <= 1'd1; | + | ledr <= 1'd1; |
| - | ledg <= 1'd1; | + | ledg <= 1'd1; |
| - | ledb <= 1'd0; | + | ledb <= 1'd0; |
| - | end | + | end |
| </code> | </code> | ||
| ==== 五、 实验验证 ==== | ==== 五、 实验验证 ==== | ||
| - | + | {{ :icore4:icore4_fpga_2_3.png?direct |图2-3}} | |
| - | 图2-3 | + | |
| - 双击打开例程里的QuartusII工程文件,如图2-3所示。 | - 双击打开例程里的QuartusII工程文件,如图2-3所示。 | ||
| - 按照前面实验指导书所讲,对该工程文件进行相关配置,编译及引脚锁定后(例程里已经配置好),将配置文件下载至icore4双核心工控板观察实验现象。 | - 按照前面实验指导书所讲,对该工程文件进行相关配置,编译及引脚锁定后(例程里已经配置好),将配置文件下载至icore4双核心工控板观察实验现象。 | ||