Nhấn cùng một hàng phím cùng một lúc


9

Tôi đang thiết kế một bàn phím trong VHDL. Mọi thứ hoạt động tốt khi chỉ một phím duy nhất được nhấn. Tôi đang quét từng cột để bấm phím trong máy trạng thái và khi không nhấn phím nào, đó là điều kiện pin4pin6pin7pin2 = "0000"tôi chuyển sang trạng thái tiếp theo để quét cột tiếp theo. Vì vậy, tôi đặt các cột pin3pin1pin5tuần tự thành "001", "010""100".

Trong khi quét pin3pin1pin5như "001"và nếu pin4pin6pin7pin2"0100"sau đó chỉ cần "9" được nhấn. Tôi khai báo trong VHDL pin4pin6pin7pin2pin3pin1pin5cổng đầu vào và đầu ra. Khi tôi nhấn 6 và 9 cùng một lúc pin6pin7được high. Phím bấm đầu tiên được đọc, phím thứ hai bị bỏ qua. Khi tôi nhấn 3 và 7 cùng một lúc, cái đầu tiên được nhấn với vài ms trước khi thắng và khóa đầu tiên được đọc, phím thứ hai bị bỏ qua pin2pin4được high.

Đây là phần khó khăn. Khi tôi bấm 4 và 6 cùng một lúc, tôi mong đợi pin7được highnhưng nó trở nên lowpin4pin6pin7pin2 = "0000", mà tôi không hiểu làm thế nào và tại sao. Vì "0000"được phát hiện là không nhấn phím, máy trạng thái nhảy từ trạng thái này sang trạng thái khác. Trong khi giữ 4 và 6 nếu một lần đẩy và rời khỏi 4 lần, nó được phát hiện là 6 lần nhấn nhiều lần, đây là một lỗi lớn . Tôi sẽ rất vui nếu bạn có thể giúp tôi gỡ lỗi này!

Điều tương tự xảy ra với "1" và "2", tương tự với "7" và "8" chỉ cho các phím trên cùng một hàng. Vì đây là một dự án đang diễn ra nên tôi không thể đưa mã VHDL của mình lên mạng :( Tôi sẽ rất vui nếu bạn có thể cho tôi lời khuyên để khắc phục điều này!

nhập mô tả hình ảnh ở đây

Dưới đây, tôi không tải mã của tôi lên bảng, không có mã nào đang chạy. Kết nối Pin5với mặt đất, một lần nhấn vào 1,2,4,5,7,8, *, 0 không bật Pin3đèn LED nhưng nếu tôi nhấn 6 và sau đó 4 đồng thời bật Pin3đèn LED và Pin7đèn LED vẫn sáng, nhưng khi mã của tôi đang chạy thì điều này không xảy ra. Có lẽ tôi đã kết nối một cái gì đó sai và may mắn Pin7là trên, tôi không biết ...

nhập mô tả hình ảnh ở đây

Dưới đây là sơ đồ của bảng bàn phím:

Sơ đồ


Làm thế nào để bạn đảm bảo rằng nhấn 4 và 6 cùng một lúc không ngắn các chân 3 và 5 lại với nhau?
fru1tbat

@ fru1tbat Bạn có thể giải thích ngắn hơn một chút không? Không tải lên mã của tôi khi bảng không có gì, tôi kết nối pin5 với mặt đất, sau đó đèn LED pin5 bật rồi tôi nhấn LED "6" pin7 sau đó tôi nhấn "4" và "6" cùng lúc với pin3 LED đang bật và pin7 LED vẫn BẬT.
Anarkie

@ Nhưng ý bạn là tôi nên sử dụng pull-up cho các hàng và kéo lên cho các cột? Tôi không thể sửa đổi mạch. Cũng không hiểu nhiều từ nhận xét của bạn :(
Anarkie

Để hoàn thiện hơn, tôi sẽ cung cấp câu trả lời. Sẽ rất hữu ích nếu bạn có thể cung cấp sơ đồ hiển thị điện trở, đèn LED, trình điều khiển cột và bất kỳ bộ biến tần hoặc bóng bán dẫn nào có thể có trong mạch. Là 4 hàng và 3 cột được kết nối trực tiếp với CPLD hoặc FPGA?
Tut

@Tut Bàn phím không được kết nối trực tiếp với FPGA, có một bảng khác ở giữa, để kết nối các bảng khác nhau với FPGA và tôi đã thêm sơ đồ.
Anarkie

Câu trả lời:


4

Câu trả lời ngắn gọn:

Đảo ngược logic của bạn. Điều khiển các dòng chọn cột với logic mở cống (hoặc bộ thu mở) trong đó cột được chọn được kéo xuống thấp và các cột không được chọn sẽ nổi. Khi bạn nhìn vào một hàng, bấm phím sẽ được phát hiện bằng '0'. Các phím chưa được nhấn sẽ được phát hiện bởi '1'.

Bây giờ các chi tiết:

Như EEIngenuity chỉ ra, khi bạn nhấn 2 nút trong cùng một hàng, nó sẽ dẫn đến đoản mạch giữa các cột tương ứng của chúng. Điều này (và các vấn đề khác liên quan đến nhiều lần nhấn phím) thường được khắc phục trong ma trận bàn phím bằng cách thêm một diode nối tiếp với mỗi công tắc.

Vì việc thêm điốt không phải là một tùy chọn cho bạn, bạn sẽ cần thả nổi các đầu ra của các cột không hoạt động của bạn để tránh cố gắng đưa chúng đến cực đối diện khi chọn cột hoạt động của bạn. Điều này được thực hiện bằng cách sử dụng logic mở cống. Nếu các cột được chọn của bạn được gắn trực tiếp vào CPLD hoặc FPGA, bạn sẽ có thể thực hiện điều này trong mã VHDL của mình.

Ảnh trong câu hỏi của bạn cho thấy rằng bạn có một điện trở kéo lên trên mỗi cột và mỗi hàng. Việc kéo lên các cột là không cần thiết, nhưng sẽ không gây hại gì. Các pull-up trên mỗi hàng sẽ đảm bảo điều kiện cao trừ khi được kéo xuống thấp bởi trình điều khiển cống mở trên cột chọn (thông qua một công tắc đóng).

Tôi đã phải đưa ra một số giả định về mạch của bạn vì bạn chưa cung cấp sơ đồ hoàn chỉnh hoặc mã VHDL của bạn. Bạn nói

khi không nhấn phím nào, đó là điều kiện pin4pin6pin7pin2 = "0000"

nhưng từ bức ảnh bạn cung cấp, điện trở kéo lên được hiển thị. Điều này ngụ ý rằng bạn đã có một đảo ngược logic ở đâu đó, có thể là trong mã VHDL hoặc biến tần (ít có khả năng) giữa các hàng của bạn và thiết bị logic của bạn (CPLD hoặc FPGA).

Biên tập:

Theo nhận xét của bạn, bạn đang sử dụng logic phủ định trong các mô tả của mình: "0000" biểu thị tất cả bốn chân đều cao, v.v. Đó là trường hợp, giả sử cột chọn và tín hiệu hàng đi trực tiếp từ đầu nối 2 trên sơ đồ của bạn tới FPGA, chỉ làm theo chỉ dẫn của tôi ở trên bằng cách sử dụng logic mở cống cho các đầu ra chọn cột trong FPGA của bạn.

Tôi không phải là chuyên gia về VHDL, nhưng tôi đã tìm thấy điều này từ Xilinx :

Suy ra bộ đệm cống mở bằng cách sử dụng đoạn mã sau:

VHDL:

dout <= 'Z' khi din = '1' khác '0';

Cũng lưu ý trong sơ đồ của bạn, tất cả các đèn LED được hiển thị có dây ngược. Cực dương đi đến các điện trở giới hạn dòng điện và cực âm đi đến các đường tín hiệu. Đèn LED sáng khi các đường tín hiệu được kéo xuống thấp.


Tôi sắp quét sơ đồ cài đặt trình điều khiển máy quét
Anarkie

Bạn đúng về việc pin4pin6pin7pin2 = "0000"không có phím bấm thực sự 1111. Trong câu hỏi của tôi 1s nên 0, 0 nên là 1s, tôi đã cố gắng mã hóa câu hỏi một chút, xin lỗi vì điều đó nếu nó gây ra hiểu lầm ...
Anarkie

Tôi đã thêm các sơ đồ.
Anarkie

cảm ơn rất nhiều về lời giải thích của bạn, sau khi đọc câu trả lời của bạn, tôi có một số ý tưởng nhưng trước tiên bạn có ý nghĩa gì với "các cột nổi", "cần nổi các kết quả đầu ra", bởi ý nghĩa của bạn là: 110, 101, 011? Điều này tôi đang làm, thực sự là trong mã của tôi khi nhấn một phím, tất cả các phím khác sẽ bị bỏ qua Tôi chỉ không hiểu làm thế nào đèn LED tắt và pin7 trở nên cao (1), trong khi mã đang chạy. Dù sao, nếu tôi hiểu đúng là giải pháp của bạn gợi ý trong khi Im quét pin5, cổng đầu ra "110", tôi nên có out <= 'pin3' when din='1' else '0';
Anarkie

1
Nhìn vào liên kết tôi cung cấp: open-Drain (hoặc open-collector) . Cột hoạt động được chọn bằng cách lái 0V trên dòng cột đó. Các cột không hoạt động KHÔNG nên được điều khiển với 3,3V trên đường dây đó, nhưng cần phải được thả nổi (đặt ở trạng thái trở kháng cao) để ngắt kết nối các đường dây đó một cách hiệu quả. Nếu bạn cố lái chúng lên 3,3V, thì đoản mạch được tạo bằng cách nhấn 2 nút trong cùng một hàng, sẽ gây ra sự tranh chấp giữa một người cố gắng lái thấp và những người khác cố gắng lái cao.
Tut

2

Vì bạn đang sử dụng VHDL và bạn có đầu vào không đồng bộ, tôi viết câu trả lời này để đảm bảo bạn đã đề phòng. Tôi không chắc đây có phải là vấn đề của bạn không nhưng nó rất có thể xảy ra.

Xem một câu hỏi tôi đã hỏi cách đây một thời gian: VHDL: nhận mô-đun thất bại ngẫu nhiên khi đếm bit

Bây giờ, bạn nói rằng:

Vì "0000" được phát hiện là không nhấn phím, máy trạng thái nhảy từ trạng thái này sang trạng thái khác. Trong khi giữ 4 và 6 nếu một lần đẩy và rời khỏi 4 lần, nó được phát hiện là 6 lần nhấn nhiều lần, đây là một lỗi lớn.

Điều này hơi giống với những gì tôi đã phải đối mặt. Tôi đã có một vấn đề trong đó máy trạng thái của tôi sẽ bỏ qua các trạng thái, điều đó dường như là không thể.

Nếu bạn đọc câu trả lời cho câu hỏi được liên kết ở trên, bạn sẽ thấy rằng nên thêm bộ đồng bộ hóa vào dòng đầu vào trước khi nó được đưa vào máy trạng thái của bạn. Điều này thường được thực hiện với hai D Flip Flops trong loạt:

nhập mô tả hình ảnh ở đây

Không có đầu vào nút của bạn được đồng bộ hóa với CTNH của bạn gây ra các vấn đề rất kỳ lạ, mà tôi đã gặp phải với dự án N64 của mình. Thêm một chút CTNH này gần giống như phép thuật.

Vì vậy, vui lòng kiểm tra đầu tiên rằng đầu vào của bạn đang được đồng bộ hóa.


Để thực hiện Trình đồng bộ hóa trên câu trả lời dường như không khó nhưng khi tôi đọc quy trình, điều tôi hiểu async_inlà bị trì hoãn với 3 chu kỳ đồng hồ nhưng giá trị của nó và mọi thứ có giống nhau không?
Anarkie

Sự khác biệt lớn là tín hiệu của bạn sẽ được chuyển đổi từ không đồng bộ sang đồng bộ. Điều xảy ra trong CTNH đôi khi có tín hiệu không đồng bộ (như các nút của bạn) là các bit ở trạng thái "ổn định meta", điều này gây ra các lỗi rất lạ trong CTNH. Sử dụng D Flip Flops đảm bảo rằng tính ổn định meta không xảy ra trong thiết kế của bạn. Tôi cũng hoài nghi về tính hiệu quả của việc này, nhưng nó đã giải quyết vấn đề của tôi một cách hoàn hảo.
Nick Williams

Tôi đã thử nó, đáng để thử nhưng không giúp được :(
Anarkie

1

Đây là một câu hỏi thú vị! Lý do bạn thấy pin7 thấp khi bạn nhấn phím4 và key6 là vì pin3 và pin5.

Để giải thích thêm, pin3 và pin5 sẽ không bao giờ cao cùng một lúc - một trong số chúng sẽ luôn là đường dẫn xuống đất (theo thiết kế của bạn). Do đó, khi bạn nhấn phím 4 và phím 6, bạn đang tạo đường dẫn xuống đất cho pin7.

Xem hình ảnh:

Chân 7 nhìn thấy một đường dẫn xuống đất.  Bạn bị đoản mạch.


Tôi đã thêm một hình ảnh vào câu hỏi của mình và pin7 trông vẫn cao khi nhấn cả hai phím.
Anarkie

OP giải thích rằng anh ta không tăng pin 3, 1 hoặc 5 CAO cùng một lúc tại bất kỳ thời điểm nào. Anh ta sắp xếp các cột với: "001", "010" và "100. Chân 3 và 5 không bao giờ CAO cùng lúc để bắt đầu.
Nick Williams

1
Đó là điểm @EEIngenuity đang cố gắng thực hiện - có một đường dẫn rõ ràng giữa các chân 3 và 5, sẽ không bao giờ có cùng giá trị, "do đó, khi bạn nhấn phím 4 và phím 6, bạn đang tạo đường dẫn xuống đất cho pin7. "
fru1tbat

1
@Anarkie Trong ảnh Pin3 không được kết nối với GND hoặc VDD. Nó là một nút nổi. Điều này không tạo ra kịch bản ngắn mạch mà bạn có trong bản dùng thử ban đầu. Hãy thử kết nối chân 3 với VDD và Pin5 với GND và lặp lại thử nghiệm này.
Miron V

1
@EEIngenuity Bạn hoàn toàn đúng !!! Có, có khi tôi kết nối pin3 với VDD, pin7 trở nên thấp !!! Vì vậy, hãy giúp tôi làm thế nào tôi có thể khắc phục vấn đề này và làm cho nó hoạt động :( Tôi đang sử dụng VHDL và một đồng nghiệp khác cùng dự án trong một nhóm khác, không gặp phải vấn đề này vì vậy bằng cách nào đó anh ấy đã giải quyết nhưng tôi không 'Không biết làm thế nào, cùng một bàn phím, cùng một bảng!
Anarkie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.