Prosty kalkulator z klawiaturą PS/2
Zadanie: Zaprojektować i wykonać układ prostego kalkulatora 4-cyfrowych liczb całkowitych z operacjami dodawania i odejmowania. Układ powinien naśladować działanie tradycyjnego kalkulatora (ale z ograniczeniem operacji na liczbach 4-cyfrowych). Argumenty i operatory wprowadzane są poprzez klawiaturę PS/2, dane oraz wynik wyświetlane są na wyświetlaczu LED płytki prototypowej.
Przykład działania dla operacji 1234+96=1330:
Klawisz (PS2) | Wyświetlacz |
0000 | |
1 | 0001 |
2 | 0012 |
3 | 0123 |
4 | 1234 |
+ | 1234 |
9 | 0009 |
6 | 0096 |
= | 1330 |
ESC | 0000 |
- Projekt należy podzielić na kilka bloków.
- Należy zapewnić asynchroniczny reset wszystkich przerzutników.
- W projekcie nie mogą występować zatrzaski (latch).
- Przed implementacją wykonać symulację układu z wykorzystaniem pliku testbench.
Więcej szczegółów, schematy itp. znajdziesz w instrukcji obsługi płytki Nexys A7, na stronach 13-16, 22-24.
Informacje dodatkowe dot. odczytu klawiatury PS2.
Plik "constraints" w formacie XDC do zadania, płytka Digilent Nexys A7, układ Artix-7 XC7A100T-1CSG324C (obudowa: CSG324, speed grade:-1):
######################################################################################### # CLOCK: set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports {clk_i} ]; create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk_i}]; ######################################################################################### # RESET: set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports {rst_i} ]; ######################################################################################### # PS2 KEYBOARD: set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk_i }]; set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data_i }]; ######################################################################################### # LED 7-SEGMENT DISPLAY: set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { led7_seg_o[7] }]; set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { led7_seg_o[6] }]; set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { led7_seg_o[5] }]; set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { led7_seg_o[4] }]; set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { led7_seg_o[3] }]; set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { led7_seg_o[2] }]; set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { led7_seg_o[1] }]; set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { led7_seg_o[0] }]; set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { led7_an_o[0] }]; set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { led7_an_o[1] }]; set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { led7_an_o[2] }]; set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { led7_an_o[3] }]; set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { led7_an_o[4] }]; set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { led7_an_o[5] }]; set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { led7_an_o[6] }]; set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { led7_an_o[7] }]; #########################################################################################