同时按下相同的按键行


9

我正在设计VHDL中的键盘。仅按一个键,一切正常。我正在状态机中扫描每一列的按键,并且在没有按键按下的情况下,这是pin4pin6pin7pin2 = "0000"我切换到下一状态以扫描下一列的条件。因此我设置的列pin3pin1pin5顺序地"001""010""100"

在扫描pin3pin1pin5"001",如果pin4pin6pin7pin2"0100"则简单地“9”被按下。我在VHDL中声明pin4pin6pin7pin2为输入和pin3pin1pin5输出端口。当我同时按6和9 pin6pin7high。读取第一个按键,第二个按键被忽略。当我按下3和7的同时,第一个用几毫秒压胜前,第一个键被读取时,第二个键被忽略,pin2并且pin4high

这是棘手的部分。当我同时按下4和6时,我期望pin7是,high但是变成了lowpin4pin6pin7pin2 = "0000",我不知道如何以及为什么。因为"0000"检测到没有按下任何键,所以状态机从一个状态跳到另一个状态。在按住4和6的情况下,如果一次按下并离开4次,就会检测到6次被按下了6次,这是一个很大的错误。如果您能帮助我进行调试,我将非常高兴!

“ 1”和“ 2”发生相同的情况,仅对于同一行中的键,“ 7”和“ 8”发生相同的情况。由于这是一个正在进行的项目,因此我无法将我的VHDL代码放在网上:(如果您能给我一些克服该问题的技巧,我将非常高兴!

在此处输入图片说明

下面,我没有将我的代码上传到开发板上,没有代码在运行。连接Pin5到地,在1,2,4,5,7,8单次按压,*,0不转Pin3上,但如果林挤压6,然后加入4-同时LED Pin3指示灯是亮的Pin7LED是仍然有效,但当我的代码运行时,这不会发生。也许我连接错了,幸运的Pin7是,我不知道...

在此处输入图片说明

以下是键盘的原理图:

原理图


您如何确保同时按下4和6不会使引脚3和5短路在一起?
fru1tbat

@ fru1tbat您能详细说明一下吗?当板上没有任何东西时,没有上传我的代码,我将pin5接地,然后pin5 LED亮,然后我按“ 6” pin7 LED亮,然后我同时按“ 4”和“ 6” LED点亮,而pin7 LED仍然点亮。
Anarkie 2014年

@Tut你的意思是我应该对行使用上拉,对列使用上拉?我无法修改电路。也从您的评论中了解的不多:(
Anarkie 2014年

为了更完整,我将提供答案。如果您可以提供示意图,显示电路中的电阻器,LED,列驱动器以及任何反相器或晶体管,将很有帮助。4行和3列是否直接连接到CPLD或FPGA?
2014年

@Tut键盘没有直接连接到FPGA,中间还有另一个板,用于将各种板连接到FPGA,我添加了原理图。
Anarkie 2014年

Answers:


4

简短的答案:

颠倒你的逻辑。用漏极开路(或集电极开路)逻辑驱动列选择线,其中选定的列被拉低,而未选定的列悬空。当您查看一行时,按键将被检测为“ 0”。未按下的按键将被检测为“ 1”。

现在的细节:

正如EEIngenuity指出的那样,当您在同一行中按2个按钮时,将导致其相应列之间的短路。通常在键盘矩阵中通过在每个开关上串联一个二极管来克服此问题(以及涉及多次按键的其他问题)。

由于增加二极管不是您的选择,因此您将需要使非活动列选择的输出悬空,以避免尝试将它们驱动到与活动列选择相反的极性。这是使用漏极开路逻辑完成的。如果您选择的列直接与CPLD或FPGA绑定,那么您应该能够在VHDL代码中完成此操作。

问题中的照片显示,每一列和每一行都有一个上拉电阻。列上的引体线是不必要的,但不会造成任何伤害。除非由列选择的漏极开路驱动器将其拉低(通过闭合开关),否则每行的上拉电阻将确保高电平状态。

由于您没有提供完整的原理图或VHDL代码,因此我不得不对您的电路进行一些假设。你说

当没有按键按下时,即为条件pin4pin6pin7pin2 =“ 0000”

但从您提供的照片中可以看到上拉电阻。这意味着您已经在某处进行了逻辑反转,可能是在您的VHDL代码中,还是在行与逻辑设备(CPLD或FPGA)之间的(不太可能)逆变器中。

编辑:

根据您的评论,您在描述中使用了否定逻辑:“ 0000”表示所有四个引脚均为高电平,依此类推。假设列选择和行信号直接从原理图上的连接器2到达FPGA,情况就是这样。按照我的指示,对FPGA中的列选择输出使用开漏逻辑。

我不是VHDL专家,但是我是从Xilinx找到的:

通过使用以下代码来推断开漏缓冲区:

VHDL:

当din ='1'时dout <='Z';否则为'0';

另请注意,在原理图中,所有LED均显示为反接线。阳极连接到限流电阻,阴极连接到信号线。当信号线拉低时,LED点亮。


我将扫描安装扫描仪驱动程序的示意图
Anarkie 2014年

pin4pin6pin7pin2 = "0000"实际上没有按键是正确的1111。在我的问题中1s应该为0,0s应该为1s,我试图对这个问题进行一些解释,如果造成误解,我对此感到抱歉...
Anarkie 2014年

我添加了原理图。
Anarkie 2014年

非常感谢您的解释,在阅读完您的回答后,我有一些想法,但是首先,您对“列浮动”,“需要使输出浮动”的含义是什么,按浮点数表示:110、101、011?我已经在做这个了,实际上在我的代码中,当按下一个键时,所有其他键都应该被忽略,我只是不知道在代码运行时,LED如何关闭并且pin7变为高电平(1)。无论如何,如果我理解正确,那么您的解决方案建议是在Im扫描pin5,输出端口为“ 110”时,我应该拥有 out <= 'pin3' when din='1' else '0';
Anarkie 2014年

1
查看我提供的链接:开漏(或开集)。通过在该列线上驱动0V来选择活动列。不活动的列不应以该线上的3.3V驱动,而应悬空(进入高阻抗状态),以有效地将那些线路与电路断开。如果您尝试将它们驱动到3.3V,则同时按下同一行中的2个按钮所造成的短路将导致一个试图拉低和另一个试图拉高的竞争。
2014年

2

由于您正在使用VHDL并且具有异步输入,因此我正在编写此答案以确保您采取了预防措施。我不确定这是否是您的问题,但很可能是。

看到我前段时间问的一个问题: VHDL:计数位时接收模块随机失败

现在,您说:

因为检测到“ 0000”是按否键,所以状态机从一个状态跳到另一个状态。在按住4和6的情况下,如果一次按下并离开4次,则会检测到6次被按下6次,这是一个很大的错误。

这有点类似于我所面临的。我有一个问题,我的状态机会跳过状态,这似乎是不可能的。

如果您阅读了上面链接的问题的答案,您会发现建议在将输入同步器输入到状态机之前向其添加一个同步器。通常使用两个串联的D型触发器来完成:

在此处输入图片说明

没有将按钮输入与硬件同步会导致非常奇怪的问题,这是我在N64项目中遇到的。添加这样的硬件有点像魔术。

因此,请先检查您的输入是否已同步。


在答案上实现Synchronizer似乎并不困难,但是当我阅读该过程时,我了解到async_in延迟了3个时钟周期,但其值和所有内容都相同?
Anarkie 2014年

最大的不同是您的信号将从异步转换为同步。有时在硬件中使用异步信号(如您的按钮)时,发生的是这些位处于“元稳定”状态,这会在硬件中引起非常奇怪的错误。使用D型触发器可确保设计中不会出现亚稳定性。我也对此表示怀疑,但是它完美地解决了我的问题。
Nick Williams

我尝试过,值得一试,但没有帮助:(
Anarkie 2014年

1

这是个有趣的问题!按下key4和key6时在pin7上看到低电平的原因是因为pin3和pin5。

进一步说明,pin3和pin5永远不会同时处于高电平-根据您的设计,它们之一始终是接地的路径。因此,当您按下键4和键6时,您正在为pin7创建接地路径。

见图片:

针脚7看到了一条通往地面的路径。 您短路了。


我在问题中添加了一张图片,当同时按下两个键时,pin7看起来仍然很高。
Anarkie 2014年

OP解释说,他在任何时候都不会同时将引脚3、1、5或HIGH升高。他序列列有:“001”,“010”和“100引脚3和5是永创新高同时开始。
尼克·威廉姆斯

1
这就是@EEIngenuity试图解决的问题-引脚3和5之间存在明显的路径,该路径永远不会具有相同的值,“因此,当您按下键4和键6时,您正在为引脚7创建接地路径。 ”
fru1tbat 2014年

1
@Anarkie在图片中,Pin3未连接到GND或VDD。它是一个浮动节点。这不会创建您在原始试用版中遇到的短路情况。尝试将引脚3连接到VDD,将引脚5连接到GND,然后重复此测试。
Miron V 2014年

1
@EEIngenuity你绝对正确!!!是的,是的,当我将引脚3连接到VDD时,引脚7变为低电平!!!因此,请帮助我如何克服这个问题并使它起作用:(我使用的是VHDL,还有另一个在不同团队中处于同一项目中的同事,却没有遇到这个问题,所以他以某种方式解决了这个问题,但是我没有不知道如何,相同的键盘,相同的面板!
Anarkie 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.