同时按下相同的键行

电器工程 视频文件 状态机
2022-01-08 12:43:00

我正在用 VHDL 设计一个键盘。当只按下一个键时,一切正常。我正在扫描状态机中的每一列以查找按键,当没有按键被按下时,这是pin4pin6pin7pin2 = "0000"我切换到下一个状态以扫描下一列的条件。因此,我将列pin3pin1pin5顺序设置为"001","010""100"

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

这是棘手的部分。当我同时按 4 和 6 时,我希望pin7是,high但它变成了lowand pin4pin6pin7pin2 = "0000",我不明白如何以及为什么。因为"0000"被检测为没有按下键,所以状态机从一个状态跳到另一个状态。按住 4 和 6 如果一个人按几次离开 4 ,就会被检测为 6 按了几次,这是一个很大的错误如果你能帮我调试这个,我会很高兴!

“1”和“2”也会发生同样的事情,“7”和“8”也会发生同样的事情,仅针对同一行的键。由于这是一个正在进行的项目,我不能将我的 VHDL 代码放到网上 :( 如果你能给我一些提示来克服这个问题,我会很高兴的!

在此处输入图像描述

下面,我没有将我的代码上传到板上,没有代码正在运行。接地Pin5,按一下 1,2,4,5,7,8,*,0 不会打开Pin3LED,但如果我同时按 6 和 4,Pin3LED 会亮,Pin7LED 仍然亮,但是当我的代码运行时,这不会发生。也许我连接错了,幸运Pin7的是,我不知道......

在此处输入图像描述

下面是键盘的原理图:

原理图

3个回答

简短的回答:

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

现在细节:

正如 EEIgenuity 指出的那样,当您按下同一行中的 2 个按钮时,会导致它们对应的列之间发生短路。这个(以及涉及多个按键的其他问题)通常在键盘矩阵中通过添加与每个开关串联的二极管来克服。

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

您问题中的照片显示您在每一列和每一行都有一个上拉电阻。柱子上的引体向上是不必要的,但不会伤害任何东西。每行上的上拉电阻将确保处于高电平状态,除非列选择上的开漏驱动器将其拉低(通过闭合开关)。

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

当没有按键被按下时,这是条件 pin4pin6pin7pin2 = "0000"

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

编辑:

根据您的评论,您在描述中使用了负逻辑:“0000”表示所有四个引脚都为高电平,等等。在这种情况下,假设列选择和行信号直接从原理图上的连接器 2 传输到 FPGA,只需按照我上面的指示,对 FPGA 中的列选择输出使用开漏逻辑。

我不是 VHDL 专家,但我从 Xilinx 发现了这个

使用以下代码推断开漏缓冲器:

高密度脂蛋白:

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

另请注意,在您的原理图中,所有 LED 都显示为反向接线。阳极接限流电阻,阴极接信号线。当信号线被拉低时,LED 会亮起。

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

看我前段时间问的一个问题: VHDL:receive module random failed when counting bits

现在,你说:

因为“0000”被检测为没有按下键,所以状态机从一个状态跳到另一个状态。按住 4 和 6 如果一个人按几次离开 4,就会被检测为 6 按了几次,这是一个很大的错误。

这与我所面临的情况有些相似。我有一个问题,我的状态机会跳过状态,这似乎是不可能的。

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

在此处输入图像描述

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

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

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

为了进一步解释,pin3 和 pin5 永远不会同时为高 - 其中一个始终是接地路径(根据您的设计)。因此,当您按下键 4 和键 6 时,您正在为 pin7 创建一条接地路径。

见图片:

引脚 7 看到接地路径。 你有短路。