동일한 키 행을 동시에 누름


9

VHDL에서 키패드를 설계하고 있습니다. 하나의 키만 누르면 모든 것이 잘 작동합니다. 상태 머신에서 키 누름을 위해 각 열을 스캔하고 키를 누르지 않으면 pin4pin6pin7pin2 = "0000"다음 열을 스캔하기 위해 다음 상태로 전환 하는 조건 입니다. 따라서, I는 열 설정 pin3pin1pin5을 순차적으로 행을 "001", "010"그리고 "100".

스캔하는 동안 pin3pin1pin5으로 "001"하고 경우에하는 pin4pin6pin7pin2것입니다 "0100"간단히 "9"를 누르면됩니다. VHDL pin4pin6pin7pin2에서 입력 및 pin3pin1pin5출력 포트 로 선언 합니다. 나는 동시에 6, 9를 누르면 pin6하고 pin7있습니다 high. 첫 번째로 누른 키를 읽고 두 번째로 누른 키는 무시됩니다. 3과 7을 동시에 누르면 첫 번째 키는 몇 ms 전에 이기고 첫 번째 키는 읽히고 두 번째 키는 무시 pin2되고 pin4입니다 high.

여기 까다로운 부분이 있습니다. 내가 같은 시간에 4, 6을 누르면, 내가 기대 pin7high하지만됩니다 lowpin4pin6pin7pin2 = "0000"어떻게 그리고 왜 이해가 안되는. "0000"키를 누르지 않은 것으로 감지 되기 때문에 상태 머신은 상태에서 상태로 이동합니다. 4 번과 6 번을 누른 상태에서 4 번 여러 번 밀고 나가면 6 번 여러 번 눌린 것으로 감지 되는데 이는 큰 버그 입니다. 이 문제를 디버깅 할 수 있다면 기쁠 것입니다!

동일한 행의 키에 대해서만 "7"및 "8"과 동일하게 "1"및 "2"에서 발생합니다. 이것은 진행중인 프로젝트이기 때문에 VHDL 코드를 온라인으로 넣을 수 없습니다 :(이 문제를 극복하기위한 팁을 줄 수 있다면 기쁠 것입니다!

여기에 이미지 설명을 입력하십시오

아래, 코드를 보드에 업로드하지 않고 코드가 실행되고 있지 않습니다. Pin5접지에 연결 하면 1,2,4,5,7,8, *, 0을 한 번 누르면 Pin3LED 가 켜지지 않지만 Im이 6과 4를 동시에 누르면 Pin3LED가 켜지고 Pin7LED는 여전히 켜져 있지만 내 코드가 실행될 때 이런 일이 발생하지 않습니다. 어쩌면 나는 뭔가 잘못 연결하고 운 좋게도 Pin7, 나는 모른다 ...

여기에 이미지 설명을 입력하십시오

아래는 키패드 보드의 회로도입니다.

회로도


4와 6을 동시에 눌러도 핀 3과 5가 단락되지 않도록하려면 어떻게해야합니까?
fru1tbat

@ fru1tbat 조금 더 자세히 설명해 주시겠습니까? 보드에 아무것도없는 상태에서 코드를 업로드하지 않고 핀 5를 접지에 연결 한 다음 핀 5 LED가 켜진 후 "6"을 누름 LED가 켜져 있고 핀 7 LED가 여전히 켜져 있습니다.
Anarkie

@하지만 행에 풀업을 사용하고 열에 풀업을 사용해야한다는 것을 의미합니까? 회로를 수정할 수 없습니다. 또한 귀하의 의견을 많이 이해하지 못했습니다 :(
Anarkie

더 완벽하게 답변을 드리겠습니다. 저항기, LED, 열 드라이버 및 회로에있을 수있는 인버터 또는 트랜지스터를 보여주는 회로도를 제공 할 수 있다면 도움이 될 것입니다. 4 행 및 3 열이 CPLD 또는 FPGA에 직접 연결되어 있습니까?
Tut

@Tut 키패드가 FPGA에 직접 연결되어 있지 않습니다. 다양한 보드를 FPGA에 연결하기 위해 다른 보드가 있으며 회로도를 추가했습니다.
Anarkie

답변:


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

에 대해 당신이 맞다 pin4pin6pin7pin2 = "0000"어떤 키를 눌러 실제로 없다 1111. 내 질문에 1은 0이어야하고, 0은 1이어야합니다, 나는 약간의 질문을 암호화하려고 노력했습니다. 오해를 일으킨다면 죄송합니다 ...
Anarkie

회로도를 추가했습니다.
Anarkie

귀하의 설명에 대해 감사드립니다. 귀하의 답변을 읽은 후 몇 가지 아이디어가 있지만 먼저 "열이 플로팅됩니다", "출력을 플로팅해야 함", float은 110, 101, 011을 의미합니까? 실제로 키를 누르면 코드에서 다른 모든 키를 무시해야합니다. 코드가 실행되는 동안 LED가 꺼지고 pin7이 어떻게 높아지는 지 이해하지 못합니다 (1). 어쨌든 내가 올바른 것을 이해한다면 Im 스캐닝 핀 5, 출력 포트 "110"동안 솔루션이 제안하는 것이 좋습니다. out <= 'pin3' when din='1' else '0';
Anarkie

1
내가 제공 한 링크를보십시오 : open-drain (또는 open-collector) . 활성 컬럼은 해당 컬럼 라인에서 0V를 구동하여 선택됩니다. 비활성 컬럼은 해당 라인에서 3.3V로 구동되어서는 안되며 플로팅 (고 임피던스 상태로 전환)하여 해당 라인을 회로에서 효과적으로 분리해야합니다. 3.3V로 구동하려고하면 같은 행에있는 2 개의 버튼을 동시에 눌러 생성 된 단락으로 인해 낮게 운전하려고하는 것과 다른 사람이 높게 운전하려고하는 사이에 경합이 발생합니다.
Tut

2

VHDL을 사용하고 비동기 입력이 있으므로 예방 조치를 취하기 위해이 답변을 작성하고 있습니다. 이것이 귀하의 문제인지 확실하지 않지만 매우 잘 될 수 있습니다.

얼마 전에 내가 물었던 질문을보십시오 : VHDL : 비트를 계산할 때 무작위로 모듈 수신 실패

자, 당신은 말합니다 :

"0000"은 아무 키도 누르지 않은 것으로 감지되므로 상태 머신은 상태에서 상태로 이동합니다. 4 번과 6 번을 누른 상태에서 4 번을 여러 번 밀고 나가면 6 번을 여러 번 누른 것으로 감지되는데 이는 큰 버그입니다.

내가 직면 한 것과 다소 비슷합니다. 내 상태 시스템이 상태를 건너 뛸 수있는 문제가 있었는데 불가능 해 보였습니다.

위에 링크 된 질문에 대한 답변을 읽으면 상태 머신에 입력 라인을 공급하기 전에 입력 라인에 동기화기를 추가하는 것이 좋습니다. 이는 일반적으로 두 개의 D 플립 플롭을 직렬로 사용하여 수행됩니다.

여기에 이미지 설명을 입력하십시오

버튼 입력을 HW와 동기화하지 않으면 N64 프로젝트에서 경험 한 매우 기이 한 문제가 발생합니다. 이 작은 HW를 추가하는 것은 거의 마술과 같습니다.

따라서 입력이 동기화되고 있는지 먼저 확인하십시오.


대답에 Synchronizer를 구현하는 것은 어렵지 않지만 프로세스를 읽을 때 async_in3 클럭 사이클로 지연되지만 그 값과 모든 것이 동일 하다는 것을 이해 합니다.
Anarkie

가장 큰 차이점은 신호가 비동기식에서 동기식으로 변환된다는 것입니다. 때때로 버튼과 같은 비동기 신호에서 HW에서 발생하는 것은 비트가 "메타 안정성"에 있다는 것인데, 이는 HW에서 매우 이상한 오류를 일으 킵니다. D 플립 플롭을 사용하면 디자인에서 메타 안정성이 발생하지 않습니다. 나는 또한 이것의 효과에 회의적이지만 내 문제를 완벽하게 해결했습니다.
Nick Williams

나는 그것을 시도, 시도 가치가 있지만 도움이되지 않았다 :(
Anarkie

1

이것은 흥미로운 질문입니다! 키 4와 키 6을 눌렀을 때 핀 7이 낮아지는 이유는 핀 3과 핀 5 때문입니다.

더 자세히 설명하기 위해 핀 3과 핀 5는 동시에 높지 않습니다 . 디자인 중 하나는 항상 접지 경로가됩니다 . 따라서 키 4와 키 6을 누르면 핀 7의 접지 경로가 생성됩니다.

이미지 참조 :

핀 7은 접지 경로를 확인합니다.  단락이 있습니다.


질문에 그림을 추가했는데 두 키를 모두 누르면 pin7이 여전히 높게 보입니다.
Anarkie

OP는 그가 동시에 핀 3, 1 또는 5를 높이 지 않는다고 설명했다. 그는 "001", "010"및 "100으로 열을 시퀀싱합니다. 핀 3과 5는 동시에 HIGH 일 수 없습니다.
Nick Williams

1
이것이 바로 @EEIngenuity가 만들고자하는 요점입니다. 핀 3과 5 사이에는 명백한 경로가 있습니다. "키 4와 키 6을 누르면 핀 7의 접지 경로가 만들어집니다. "
fru1tbat 2016 년

1
@Anarkie 그림에서 Pin3은 GND 또는 VDD에 연결되어 있지 않습니다. 부동 노드입니다. 이렇게하면 원래 시험판에있는 단락 시나리오가 생성되지 않습니다. 핀 3을 VDD에, 핀 5를 GND에 연결하고이 테스트를 반복하십시오.
Miron V

1
@EEIngenuity 당신은 절대적으로 맞습니다 !!! 예, 핀 3을 VDD에 연결하면 핀 7이 낮아집니다 !!! 그래서이 문제를 어떻게 극복하고 작동시킬 수 있는지 알려주세요. (VHDL과 다른 팀의 동일한 프로젝트에있는 다른 동료를 사용하고 있습니다.이 문제에 직면하지 않아 어떻게 든 문제를 해결했지만 어떻게, 같은 키패드, 같은 보드를 몰라
Anarkie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.