【Quartus 13.0】EP1C3144I7 部署4*6矩阵键盘

仿照 正点原子 的 Sample 修改
V2手册 P266
没有用这个

给出的手动按键控制的矩阵模块 为 4*6 矩阵键盘外接模块
每一个按键自带led,所以对应的接口是合并在一起的一个引脚
按下后 LED 亮,vice versa

底部 LED*8 目前不清楚有什么用
或许可以变成 16进制表示灯的位置
like 3 = 2^1 + 2^0, 16 = 2^4 相当于数码管的功能

代码参考

testbench 需要生成 vt 文件 再使用仿真验证
我抛出来的波形有点奇怪 因为没有做时序约束
在这里插入图片描述

按键定位思路:

  1. 矩阵键盘所有 行 信号 3.3V 上拉,4*6 信号全部接到 FPGA 引脚, 具体按键的检测只需要扫描其 行列 序号,
  2. 给出的分布引脚图中,矩阵信号从左到右也可以算是顺序编码:A1 B1 C1 D1,A2 B2 C2 D2…D6.etc
  3. 具体按钮x对应的 a 行 b 列 引脚,已知 a 行 & all rows 为高电平,设置 all cols 为低电平
  4. 当 x being pushed, a & b 导通,a变为低电平, 得到 row 端口;
  5. due to cols’ outputs are all in low level, scan col 端口,先scan 第一列( col0 ) , 将 col0 保持低电平, col1~3 拉高,看row端口值是否变化, if not, button 列序列号 为 1,else not. only & only if col端口为low时才能拉低其对应row 端口为低电平,else 继续扫描 next col,col2 = 0

代码描述:

module key4x4
//更改为4x6
#(
    parameter   CNT_MAX=16'd50_000
)
(
    input    wire           sys_clk     ,
    input    wire           sys_rst_n   ,
    input    wire    [6:0]  key_in      ,//此信号为从键盘传到FPGA开发板的信号
    output   reg     [6:0]  key_out     ,//此信号为从FPGA开发板传到键盘上的信号
    output   reg     [6:0]  led_out      //注意信号灯为低信号时会亮
);

reg     [23:0]      cnt         ;
reg                 cnt_clk     ;
reg     [1:0]       q           ;

always @ (posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n==1'b0)
    cnt<=24'd0;
    else if (cnt==CNT_MAX)
    cnt<=24'd0;
    else  cnt<=cnt+24'd1;

always @ (posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n==1'b0)
    cnt_clk<=1'b0;
    else if (cnt==CNT_MAX-24'd1)
    cnt_clk<=1'b1;
    else  cnt_clk<=1'd0;

always @ (posedge cnt_clk or negedge sys_rst_n)
    if(sys_rst_n==1'b0)
    begin
    q<=3'd0;
    key_out<=6'b111110;
    led_out<=6'b111111;
    end
    else
    begin
    q<=q+3'd1;
    case(q)
    //分别对每一行row输入扫描信号
    3'd0:key_out<=6'b111110;
    3'd1:key_out<=6'b111101;
    3'd2:key_out<=6'b111011;
    3'd3:key_out<=6'b110111;
	 3'd4:key_out<=6'b101111;
	 3'd5:key_out<=6'b011111;
    default:key_out<=6'b000000;
    endcase
    case ({key_out,key_in})
//    //按下第1个按键后则全灭,000000 -> 111111,按下第24个按键后全部的灯亮,111111 -> 000000。
//    //每一行扫描信号,对应的扫描信号灯输出

//4'b1111......这些还没有修改 应该改为按键旁边对应的led灯
	        
    10'b111110_1110:begin led_out<=4'b1111;  end
    10'b111110_1101:begin led_out<=4'b1110;  end
    10'b111110_1011:begin led_out<=4'b1101;  end
    10'b111110_0111:begin led_out<=4'b1100;  end
    
    10'b111101_1110:begin led_out<=4'b1011;  end
    10'b111101_1101:begin led_out<=4'b1010;  end
    10'b111101_1011:begin led_out<=4'b1001;  end
    10'b111101_0111:begin led_out<=4'b1000;  end
    
    10'b111011_1110:begin led_out<=4'b0111;  end
    10'b111011_1101:begin led_out<=4'b0110;  end
    10'b111011_1011:begin led_out<=4'b0101;  end
    10'b111011_0111:begin led_out<=4'b0100;  end
    
    10'b110111_1110:begin led_out<=4'b0011;  end
    10'b110111_1101:begin led_out<=4'b0010;  end
    10'b110111_1011:begin led_out<=4'b0001;  end
    10'b110111_0111:begin led_out<=4'b0000;  end

	 
	 10'b110111_1110:begin led_out<=4'b0011;  end
    10'b110111_1101:begin led_out<=4'b0010;  end
    10'b110111_1011:begin led_out<=4'b0001;  end
    10'b110111_0111:begin led_out<=4'b0000;  end
   
	 
	 10'b110111_1110:begin led_out<=4'b0011;  end
    10'b110111_1101:begin led_out<=4'b0010;  end
    10'b110111_1011:begin led_out<=4'b0001;  end
    10'b110111_0111:begin led_out<=4'b0000;  end
    10'b000000_1111:begin led_out<=4'b1111;  end
	 
    default:     begin led_out<=4'b1111;  end

    endcase
    end

endmodule

消抖模块思路:
“按键的值先打一拍(key_reg <=key row),然后检测当前时钟下按键的状态和上一个时钟的状态是否一致,如果不一致则将计数器 delay cnt赋初值 100万,如果一致则计数器从初值开始作减法计数,直到计数器计数到“1”,说明按键的状态一直稳定了 100 万个时钟周期,此时我们认为是一次有效的按键 触发,这时我们就可以拉高消抖完成标志key flag row(注意只拉高一个时钟)”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/711436.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

warning LNK4017: DESCRIPTION 语句不支持目标平台;已忽略

文章目录 warning LNK4017: DESCRIPTION 语句不支持目标平台&#xff1b;已忽略概述笔记备注END warning LNK4017: DESCRIPTION 语句不支持目标平台&#xff1b;已忽略 概述 基于ATL的COM DLL导出函数&#xff0c;无法用__declspec(dllexport)直接在函数上标记为导出函数。 只…

基础-01-计算机网络概论

一. 计算机网络的发展与分类 1.计算机网络的形成与发展 计算机网络&#xff1a;计算机技术与通信技术的结合 ICTITCT 2.计算机网络标准阶段 3.计算机网络分类1:通信子网和资源子网 通信子网:通信节点(集线器、交换机、路由器等)和通信链路(电话线、同轴电缆、无线电线路、卫…

省去烦恼!轻松实现一台电脑登录多个微信号的秘诀揭秘!

你知道如何在同一台电脑上登录多个微信号&#xff0c;并实现聚合聊天吗&#xff1f; 今天&#xff0c;我将分享一个多微管理神器——个微管理系统&#xff0c;帮助你解决这一问题&#xff01; 1、多号同时登录&#xff0c;聚合聊天 无论你有多少个微信号&#xff0c;都可以一…

Linux文件系统【真的很详细】

目录 一.认识磁盘 1.1磁盘的物理结构 1.2磁盘的存储结构 1.3磁盘的逻辑存储结构 二.理解文件系统 2.1如何管理磁盘 2.2如何在磁盘中找到文件 2.3关于文件名 哈喽&#xff0c;大家好。今天我们学习文件系统&#xff0c;我们之前在Linux基础IO中研究的是进程和被打开文件…

06.VisionMaster 机器视觉找直线

VisionMaster 机器视觉找直线 直线查找主要用于查找图像中具有某些特征的直线&#xff0c;利用已知特征点形成特征点集&#xff0c;然后拟合成直线。 工具栏&#xff1a;定位-》直线查找 参数设置 海康的这些工具使用上大部分参数是差不多了&#xff0c;以前说过的说不多说了…

Elixir学习笔记——别名、需要、导入和使用

为了便于软件重用&#xff0c;Elixir 提供了三个指令&#xff08;alias、require 和 import&#xff09;以及一个名为 use 的宏&#xff0c;总结如下&#xff1a; # 为模块添加别名&#xff0c;以便可以将其称为 Bar 而不是 Foo.Bar alias Foo.Bar, as: Bar # 需要模块才能使…

2024 年最新使用 Node 搭建QQ开放平台官方 QQ 频道机器人详细教程(更新中)

注册 QQ 开放平台账号 QQ 开放平台是腾讯应用综合开放类平台&#xff0c;包含 QQ 机器人、QQ 小程序、QQ 小游戏 等集成化管理&#xff0c;也就是说你注册了QQ 开放平台&#xff0c;你开发 QQ 机器人还是 QQ 小程序都是在这个平台进行部署上线和管理。 如何注册 QQ 开放平台账…

Internet Download Manager ( 极速下载器 ) 序列号注册码 IDM下载器注册机中文激活破解版

IDM下载器(Internet Download Manager)是一款专业的下载管理软件&#xff0c;它通过多线程技术和智能文件分段技术&#xff0c;有效提升下载速度&#xff0c;并支持断点续传&#xff0c;还具有计划下载功能&#xff0c;用户可以设置特定的下载时间&#xff0c;非常适合需要在特…

C#批量设置海康和大华录像机NVR,GB28181的通道编码.

我经常要把小区海康或者大华的硬盘录像机推送到自己搭建的gb28181监控平台,每次几百个摄像头编码,有点头大,就用了1个多周写了个批量设置海康和大华硬盘录像机的通道编码的程序,海康和大华的SDK简直不是人看的. 太乱了. 大华读取通道编码的代码 /// <summary>/// 获取通道…

虚拟机上安装centos7

目录 1&#xff0c;下载centos镜像2&#xff0c;在VMware中新建虚拟机3&#xff0c;为新创建的虚拟机挂载镜像4&#xff0c;安装centos75&#xff0c;配置网络 1&#xff0c;下载centos镜像 直接下载地址 https://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.8.2003/isos/x8…

干部选拔任用的六条原则

在干部选拔任用的过程中&#xff0c;为确保选拔出的干部能够真正符合党和人民的期望&#xff0c;必须遵循以下六条原则&#xff1a; 一、党管干部原则 党管干部原则是指在整个干部选拔任用过程中&#xff0c;党要发挥总揽全局、协调各方的领导作用&#xff0c;确保选拔出的干…

[渗透测试学习] Runner-HackTheBox

Runner-HackTheBox 信息搜集 nmap扫描端口 nmap -sV -v 10.10.11.13扫描结果如下 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0) 80/tcp open http nginx 1.18.0 (Ubuntu) 8000…

Echarts图表:地图都有哪些配置项,一文告诉你

地图是可视化大屏中最常见的组件&#xff0c;echart图表中关于地图的组件非常多&#xff0c;那么该如何进行配置&#xff0c;让地图和自己的设计稿保持一致。贝格前端工场为大家列举一下。 charts地图图表在配置项中有以下常用的配置选项&#xff1a; title&#xff1a;图表标…

TCP协议报头详解

目录 前言 TCP特点 TCP报头 1.源端口和目的端口 2.序号 3.确认号 4.数据偏移 5.保留 6.控制位 ① 紧急URG&#xff08;URGent&#xff09; ② 确认ACK&#xff08;ACKnowledgment&#xff09; ③ 推送PSH&#xff08;PuSH&#xff09; ④复位RST&#xff08;ReSeT&…

【二】【动态规划NEW】91. 解码方法,62. 不同路径,63. 不同路径 II

91. 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; ‘A’ -> “1” ‘B’ -> “2” … ‘Z’ -> “26” 要 解码 已编码的消息&#xff0c;所有数字必须基于上述映射的方法&#xff0c;反向映射回字母&#xff08;可能有多种方法&#xff…

AI Vs 作家?Groqbook: AI写书神器,使用 Groq 和 Llama3 几秒生成一本完整的书籍!

✨点击这里✨&#xff1a;&#x1f680;原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; AI Vs 作家&#xff1f;Groqbook: AI写书神器&#xff0c;使用 Groq 和 Llama3 几秒生成一本完整的…

awtk如何实现键盘和输入框

1.创建默认键盘 新建窗体-keyboard 2.新建编辑框 3.设置编辑框属性 4.点击编辑框即可打开默认键盘&#xff0c;若想修改键盘样式可以在默认键盘修改或自定义键盘 5.获取输入字符 widget_t* wifi_edit widget_lookup(win, "edit", TRUE);//获取单行编辑控件 widge…

python简单练习案例-石头剪刀布小游戏

&#x1f308;所属专栏&#xff1a;【python】 ✨作者主页&#xff1a; Mr.Zwq ✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01;…

在 Windows 环境下安装mysql步骤(MySQL)

文章目录 一、下载 MySQL二、解压安装包到磁盘三、配置环境&#xff08;管理员权限&#xff09;四、安装 MySQL&#xff08;管理员权限&#xff09; 一、下载 MySQL 如下图&#xff1a;为你的电脑下载对应操作系统的 MySQL 安装包 二、解压安装包到磁盘 三、配置环境&#x…

sprintboot容器功能

容器 容器功能Spring注入组件的注解Component&#xff0c;Controller&#xff0c;Service&#xff0c;Repository案例演示 Configuration应用实例传统方式使用Configuration 注意事项和细节 Import应用实例 ConditionalConditional介绍应用实例 ImportResource应用实例 配置绑定…