同じキー行を同時に押す


9

VHDLでキーパッドを設計しています。キーを1つだけ押すと、すべてが正常に動作します。ステートマシンでキーを押すために各列をスキャンしています。キーが押されていない場合は、pin4pin6pin7pin2 = "0000"次の状態に切り替えて次の列をスキャンする状態です。したがって、私は列に設定pin3pin1pin5順番にし"001""010"そして"100"

スキャン中pin3pin1pin5"001"している場合pin4pin6pin7pin2され"0100"、その後、単純に「9」を押します。pin4pin6pin7pin2入力pin3pin1pin5ポートおよび出力ポートとしてVHDLで宣言します。私は同時に6と9を押したときpin6pin7していますhigh。最初に押されたキーが読み取られ、2番目のキーは無視されます。3と7を同時に押すと、最初の数ミリ秒前に最初のキーが押され、最初のキーが読み取られ、2番目のキーは無視され、にpin2なりpin4ますhigh

ここがトリッキーな部分です。4と6を同時に押すpin7high、そうなるはずですが、とにlowなりpin4pin6pin7pin2 = "0000"、どうして、どうしてかわかりません。"0000"キーが押されていないことが検出されるため、ステートマシンは状態から状態にジャンプします。4と6を押しながら4を数回押して離れると、6が数回押されたことが検出され、大きなバグです。これをデバッグするのを手伝っていただければ幸いです!

同じ行のキーについてのみ、「1」と「2」、「7」と「8」でも同じことが起こります。これは進行中のプロジェクトなので、VHDLコードをオンラインにすることはできません:(これを克服するためのヒントを教えていただければ幸いです!

ここに画像の説明を入力してください

以下では、ボードにコードをアップロードしていません。コードが実行されていません。Pin5グラウンドに接続して、1、2、4、5、7、8、*、0を1回Pin3押すとPin3LEDはオンになりませんが、6を押してから4を同時に押すと、LEDがオンでPin7LEDがまだオンですが、私のコードが実行されているとき、これは起こりません。多分私は何かを間違って接続し、幸いにもPin7オンになっています、私は知りません...

ここに画像の説明を入力してください

以下は、キーパッドボードの回路図です。

回路図


4と6を同時に押してもピン3と5が一緒にショートしないことをどのように保証しますか?
fru1tbat 2014年

@ fru1tbatもう少し簡潔に説明してもらえますか?ボードに何もないときにコードをアップロードせずに、私はpin5をグラウンドに接続し、次にpin5 LEDをオンにしてから、「6」を押します。 LEDはオンで、ピン7のLEDはまだオンです。
Anarkie 2014年

@つまり、行にはプルアップを使用し、列にはプルアップを使用する必要があるということですか?回路を変更できません。また、コメントからはあまり理解できませんでした:(
Anarkie

より完全にするために、私は答えを提供します。回路内にある可能性のある抵抗器、LED、列ドライバー、およびインバーターまたはトランジスターを示す回路図を提供できると便利です。4行3列はCPLDまたはFPGAに直接接続されていますか?
2014年

@TutキーパッドはFPGAに直接接続されておらず、その間に別のボードがあり、さまざまなボードをFPGAに接続するために回路図を追加しました。
Anarkie 14年

回答:


4

短い答え:

ロジックを逆にします。オープンドレイン(またはオープンコレクター)ロジックで列選択ラインを駆動し、選択した列をLowに引き下げ、選択していない列をフローティングにします。行を見ると、キーの押下は「0」で検出されます。押されていないキーは「1」で検出されます。

今の詳細:

EEIngenuityが指摘するように、同じ行の2つのボタンを押すと、対応する列が短絡します。これ(および複数のキーを押すことを含む他の問題)は通常、各スイッチと直列にダイオードを追加することにより、キーボードマトリクスで克服されます。

ダイオードを追加することはオプションではないため、アクティブな列選択とは逆の極性に駆動しようとしないように、非アクティブな列選択の出力をフロートさせる必要があります。これは、オープンドレインロジックを使用して行われます。列の選択がCPLDまたはFPGAに直接関連付けられている場合は、VHDLコードでこれを実行できるはずです。

あなたの質問の写真は、各列と各行にプルアップ抵抗があることを示しています。カラムのプルアップは不要ですが、何も傷つけません。各列のプルアップは、列選択のオープンドレインドライバーによって(閉じたスイッチを介して)Lowにプルされない限り、High状態を保証します。

完全な回路図またはVHDLコードが提供されていないため、回路についていくつかの仮定を行う必要がありました。あなたは言う

キーが押されていない場合。条件はpin4pin6pin7pin2 = "0000"です。

あなたが提供する写真から、プルアップ抵抗が示されています。これは、おそらくVHDLコードまたは行とロジックデバイス(CPLDまたはFPGA)の間の(可能性は低い)インバーターのどこかに既に論理反転があることを意味します。

編集:

コメントによると、説明に負のロジックを使用しています。「0000」は、4つのピンすべてがハイであることを示します。その場合、列の選択と行の信号が回路図のコネクタ2からFPGAに直接送られると仮定します。 FPGAの列選択出力にオープンドレインロジックを使用して、上記の私の指示に従います。

私はVHDLの専門家ではありませんが、ザイリンクスからこれを見つけました。

次のコードを使用して、オープンドレインバッファーを推測します。

VHDL:

dout <= 'Z' when din = '1' else '0';

また、回路図では、すべてのLEDが逆向きに配線されていることに注意してください。陽極は電流制限抵抗に行き、陰極は信号線に行きます。信号線がローになると、LEDが点灯します。


スキャナードライバーをインストールする回路図をスキャンしようとしています
Anarkie

あなたは正しいですpin4pin6pin7pin2 = "0000"どのキーを押して、実際にはありません1111。私の質問では1sは0で、0sは1である必要があります。質問を少し暗号化しようとしましたが、誤解が生じた場合は申し訳ありません...
Anarkie

回路図を追加しました。
Anarkie 14年

説明をたくさんありがとう、あなたの答えを読んだ後、私はいくつかのアイデアを持っていますが、最初に「列が浮動している」、「出力をフロートする必要がある」とはどういう意味ですか、フロートとはどういう意味ですか?110、101、011?これはすでに実行しています。実際のコードでは、キーが押されたときに他のすべてのキーを無視する必要があります。コードの実行中にLEDがオフになり、pin7がHigh(1)になる方法がわかりません。とにかく、私が正しいことを理解していれば、Imがout <= 'pin3' when din='1' else '0';
pin5

1
私が提供したリンクを見てください:open-drain(またはopen-collector)。アクティブな列は、その列ラインで0Vを駆動することによって選択されます。非アクティブな列は、そのラインで3.3Vで駆動するべきではありませんが、フロートさせる(高インピーダンス状態にする)必要があります。これにより、これらのラインが回路から効果的に切断されます。それらを3.3Vに駆動しようとすると、同じ行の2つのボタンを同時に押すことによって発生する短絡により、1つをローにしようとするものと、他をハイにしようとするものとの間に競合が発生します。
2014年

2

VHDLを使用していて、非同期入力があるため、予防策を講じるためにこの回答を書いています。これがあなたの問題であるかどうかはわかりませんが、非常に問題である可能性があります。

少し前に私が尋ねた質問を見てください: VHDL:ビットをカウントするときに受信モジュールがランダムに失敗します

今、あなたはそれを言う:

「0000」はキーが押されていないことが検出されたため、ステートマシンは状態から状態にジャンプします。4と6を押しながら4を数回押して離れると、6が数回押されたことが検出され、大きなバグです。

それは私が直面していたことと幾分似ています。状態マシンが状態をスキップするという問題がありました。これは不可能に思えました。

上記のリンクされた質問への回答を読むと、状態マシンに入力する前に、同期装置を入力ラインに追加することが推奨されていることがわかります。これは通常、2つのDフリップフロップを直列に接続することで実現されます。

ここに画像の説明を入力してください

ボタン入力をHWと同期させないと、非常に奇妙な問題が発生します。これは、N64プロジェクトで経験しました。このHWを少し追加することは、まるで魔法のようでした。

したがって、まず入力が同期されていることを確認してください。


答えにシンクロナイザーを実装することは難しいようではありませんが、プロセスを読んだとき、私が理解しているのasync_inは、3クロックサイクル遅れているが、その値とすべてが同じであることです。
Anarkie 2014年

大きな違いは、信号が非同期から同期に変換されることです。非同期信号(ボタンなど)で時々HWで発生するのは、ビットが「メタ安定性」であることです。これにより、HWで非常に奇妙なエラーが発生します。Dフリップフロップを使用すると、設計でメタ安定性が発生しなくなります。私はこれの有効性にも懐疑的でしたが、私の問題は完全に解決しました。
Nick Williams

私は試してみましたが、試してみる価値はありましたが、役に立ちませんでした:(
Anarkie

1

これは興味深い質問です。key4とkey6を押したときにpin7が低くなっているのは、pin3とpin5が原因です。

さらに説明すると、ピン3とピン5が同時に高くなることはありません。これらの1つは常に(設計に応じて)アースへのパスになります。したがって、キー4とキー6を押すと、ピン7のグラウンドへのパスが作成されます。

画像を見る:

ピン7はグランドへのパスを認識します。 短絡があります。


質問に画像を追加しましたが、両方のキーを押してもpin7はまだ高く見えます。
Anarkie 2014年

OPは、ピン3、1、または5を同時にHIGHにしないことを説明しました。彼が持つ列をシーケンス:「001」「010」、および「100ピン3と5はそもそもHIGH同時になることはありません。
ニック・ウィリアムズ

1
これが@EEIngenuityが作成しようとしているポイントです。ピン3と5の間には明らかなパスがあり、決して同じ値にはなりません。 」
fru1tbat 14年

1
@Anarkie写真のPin3はGNDまたはVDDに接続されていません。フローティングノードです。これは、最初の試行での短絡シナリオを作成しません。ピン3をVDDに、ピン5をGNDに接続して、このテストを繰り返してください。
Miron V 2014年6

1
@EEIngenuityあなたは絶対に正しいです!!! はい、ピン3をVDDに接続すると、ピン7がローになります。この問題をどのように克服して機能させることができるかを教えてください:(私はVHDLを使用しており、別のチームの同じプロジェクトにいる別の同僚もこの問題に直面していないので、彼はどういうわけかそれを解決しましたが、私はしませんわからない、同じキーパッド、同じボード!
Anarkie
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.