Μετάβαση στο περιεχόμενο

Συστήματα Μικροϋπολογιστών — Φεβρουάριος 2023 (Ομάδα Α)

Μεταγραφή από τη φωτογραφία themata.png (θέματα 1–3, Ομάδα Α).

themata.png

Θέμα 1ο) Σύνδεση Μνημών με Διαφορετικά Μεγέθη Data Bus
Έστω μικροϋπολογιστικό σύστημα αρχιτεκτονικής von Neumann με δίαυλο διευθύνσεων 16-bit και δίαυλο δεδομένων 8-bit στο οποίο θέλουμε να συνδέσουμε μνήμες με τα εξής χαρακτηριστικά:
Μνήμη 1: 8KB χωρητικότητα με οργάνωση 8-bit ανά λέξη
Μνήμη 2: 4KB χωρητικότητα με οργάνωση 4-bit ανά λέξη
Μνήμη 3: 4KB χωρητικότητα με οργάνωση 4-bit ανά λέξη
Μνήμη 4: 4KB χωρητικότητα με οργάνωση 8-bit ανά λέξη
Να σχεδιαστεί η αρχιτεκτονική του συστήματος μνήμης με ό,τι άλλα επιπλέον κυκλώματα είναι αναγκαία. Ποιο είναι το ποσοστό κάλυψης της συνολικής μνήμης που μπορεί να διευθυνσιοδοτήσει ο μικροϋπολογιστής;

Θέμα 2ο) Μέτρηση Άσσων και Μηδενικών Θέσης Μνήμης
Να γραφτεί πρόγραμμα Assembly για το Z80 το οποίο να μετράει το πλήθος των άσσων και μηδενικών των περιεχομένων που υπάρχουν σε μια θέση μνήμης, όπως για παράδειγμα τη θέση 0x8000.

Θέμα 3ο) Μηχανή Πεπερασμένων Καταστάσεων σε Arduino

Σημείωση: η φωτογραφία περιέχει χειρόγραφες απαντήσεις φοιτητή.

Επιπλέον πηγές χωρίς μεταγραφή εδώ (λύσεις → 2023-02-a.solutions.md, ή διπλότυπες φωτογραφίες της ίδιας σελίδας): image-2.png

Λύσεις (⚪ AI, μη επαληθευμένο)

Κατάσταση: ⚪ AI, μη επαληθευμένο Πηγή: migrated from previous_exams.md (Antigravity, 2026-10)

Προσοχή

Θέμα 1: ο χάρτης μνήμης χρησιμοποιεί το A12 ως είσοδο του αποκωδικοποιητή, ενώ η M1 (8 KB, 13 γραμμές διεύθυνσης) χρειάζεται το A12 εσωτερικά· έτσι η M1 δεν καλύπτει την περιοχή 0x1000–0x1FFF και η αντιστοίχιση των εξόδων 1–2 στις M2/M3 δεν συμφωνεί με τον χάρτη 0x2000–0x3FFF. Θέμα 2: η εντολή «LD B,(0x8000)» δεν υπάρχει στο Z80· η άμεση φόρτωση από διεύθυνση μνήμης γίνεται μόνο στον A (LD A,(nn)). Θέμα 3: η εκφώνηση είναι ατελής στη φωτογραφία. Η λύση στηρίζεται σε εκφώνηση με ποτενσιόμετρο (A0), PWM (ακροδέκτης 3) και τρία LED (8, 9, 10) που δεν επιβεβαιώνεται από τη φωτογραφία, άρα η αντιστοίχιση με το θέμα δεν ελέγχεται. Η φωτογραφία image-2.png («ΘΕΜΑ / 2022», 4 μνήμες των 8 KB, 50% χωρητικότητα) δεν αντιστοιχεί στο θέμα 1 αυτής της συνεδρίας (εδώ οι μνήμες είναι 8 KB, 4 KB, 4 KB, 4 KB) και δεν χρησιμοποιήθηκε εδώ.

Λύσεις — Φεβρουάριος 2023 (Ομάδα Α)

Αναλυτική Λύση: - Υπολογισμός γραμμών διευθύνσεων ανά τσιπ: $\(\text{Γραμμές Διεύθυνσης} = \frac{\text{Χωρητικότητα}}{\text{Δίαυλος Δεδομένων}}\)$ - M1: \(\frac{8\text{ KB}}{8\text{ bit}} = 8\text{ K words} = 2^3 \cdot 2^{10} = 2^{13} \implies 13\text{ γραμμές διεύθυνσης}\) - M2, M3: Συνδυάζονται παράλληλα (κάθε μία παρέχει \(4\text{ bits}\) ώστε μαζί να δίνουν \(8\text{ bits}\) data bus): $\(\frac{4\text{ KB}}{4\text{ bit}} = \frac{2 \cdot 4\text{ K Byte}}{2 \cdot 4\text{ bit}} = 2 \cdot 2^2 \cdot 2^{10} = 2^{13} \implies 13\text{ γραμμές διεύθυνσης}\)$ - M4: \(\frac{4\text{ KB}}{8\text{ bit}} = 4\text{ K words} = 2^{12} \implies 12\text{ γραμμές διεύθυνσης}\) - Συνολική Χωρητικότητα και Ποσοστό Κάλυψης: - Συνολική μνήμη: \(2^{13} + 2^{13} + 2^{12} = 2^{14} + 2^{12} = 16384 + 4096 = 20480\text{ Bytes}\) - Μέγιστη διευθυνσιοδοτούμενη μνήμη (\(16\text{-bit}\) address bus): \(2^{16} = 65536\text{ Bytes}\) - Ποσοστό κάλυψης: \(\frac{20480}{65536} = 31{,}25\%\) - Χάρτης Μνήμης (Memory Map): - M1: 0x0000 - 0x1FFF (Διευθύνσεις: \(A_{15}=0, A_{14}=0, A_{13}=0, A_{12..0}\)) - M2, M3: 0x2000 - 0x3FFF (Διευθύνσεις: \(A_{15}=0, A_{14}=0, A_{13}=1, A_{12..0}\)) - M4: 0x4000 - 0x4FFF (Διευθύνσεις: \(A_{15}=0, A_{14}=1, A_{13}=0, A_{12}=0, A_{11..0}\)) - Κύκλωμα Αποκωδικοποίησης (Decoder Circuit): - Αποκωδικοποιητής 3-σε-8 (\(3\text{-to-}8\text{ Decoder}\)) με εισόδους \(A_{14}, A_{13}, A_{12}\) και Enable pin ελεγχόμενο από \(A_{15}\) (\(\text{EN} = \overline{A_{15}}\)). - Έξοδος \(0\) (για M1): οδηγεί το Chip Select / Output Enable (\(\text{OE}_1\)) της M1 (μέσω κατάλληλης πύλης). - Έξοδοι \(1, 2\) (για M2 & M3): οδηγούν το \(\text{OE}_{2,3}\) των M2 και M3 παράλληλα. - Έξοδος \(4\) (για M4): οδηγεί το \(\text{OE}_4\) της M4.

Πρόγραμμα Z80 Assembly:

; Αρχικοποίηση μετρητών και δεικτών
Counter:
    LD   B, (0x8000)     ; Φόρτωση του byte από τη θέση 0x8000 στον καταχωρητή B
    LD   C, 0x01         ; Μάσκα για έλεγχο του LSB (00000001)
    LD   D, 0x00         ; Μετρητής άσσων (D = 0)

Mask:
    LD   A, B            ; Αντιγραφή περιεχομένου στον Acc
    CP   0x00            ; Έλεγχος αν B == 0
    JP   Z, Done         ; Αν μηδέν, τελείωσε
    AND  C               ; A = A AND 0x01 (απομόνωση LSB)
    SRL  B               ; Ολίσθηση δεξιά του B για το επόμενο bit
    BIT  0, A            ; Έλεγχος αν το bit είναι 1
    JP   NZ, Increment   ; Αν είναι 1, αύξησε τον μετρητή D
    JP   Mask

Increment:
    INC  D               ; D = D + 1 (βρέθηκε άσσος)
    JP   Mask

Done:
    ; Υπολογισμός μηδενικών: Πλήθος 0 = 8 - (Πλήθος 1)
    LD   A, 0x08         ; A = 8
    SUB  D               ; A = 8 - D (στο A απομένει το πλήθος των μηδενικών)
    HALT                 ; Τερματισμός

Κώδικας Arduino (C++):

#define R_LED_PIN 8
#define G_LED_PIN 9
#define B_LED_PIN 10
#define PWM_PIN   3

int pot_value;
int pwm_out;

enum States {
    RED,
    GREEN,
    BLUE
};

// Set initial starting state
States state = States::RED;

void setup() {
    pinMode(R_LED_PIN, OUTPUT);
    pinMode(G_LED_PIN, OUTPUT);
    pinMode(B_LED_PIN, OUTPUT);
    pinMode(PWM_PIN, OUTPUT);
    Serial.begin(9600);
}

void nextState() {
    if (state == States::RED && pot_value < 750) 
        state = States::GREEN;
    else if (state == States::GREEN && pot_value < 300) 
        state = States::BLUE;
    else if (state == States::BLUE && pot_value > 880) 
        state = States::RED;
}

void loop() {
    // Actions irrespective of state
    digitalWrite(R_LED_PIN, LOW);
    digitalWrite(G_LED_PIN, LOW);
    digitalWrite(B_LED_PIN, LOW);

    pot_value = analogRead(A0);
    Serial.println(pot_value);

    pwm_out = map(pot_value, 0, 1023, 0, 255);
    analogWrite(PWM_PIN, pwm_out);

    // State-aware actions
    switch(state) {
        case States::RED:
            digitalWrite(R_LED_PIN, HIGH);
            break;
        case States::GREEN:
            digitalWrite(G_LED_PIN, HIGH);
            break;
        case States::BLUE:
            digitalWrite(B_LED_PIN, HIGH);
            break;
    }

    // Delay and state transition
    delay(200);
    nextState();
}

✔ Επιβεβαίωσε · ✖ Βρήκα λάθος


✖ Βρήκα λάθος στη μεταγραφή