Πανεπιστήμιο Κρήτης Τμήμα Επιστήμης Υπολογιστών ΗΥ220: Εργαστήριο σχεδίασης ψηφιακών κυκλωμάτων Χριστόφορος Κάχρης 4-11-2009 Πρόοδος Θέμα 1 ο (25%): 1. Βρείτε την μεγίστη συχνότητα λειτουργίας του παρακάτω κυκλώματος χρησιμοποιώντας τις παρακάτω τιμές: t CLOCK2Q =0.8, t SETUP =0.2, t MUX =4, t NOT =2, t AND =5, t OR =3 2. Τροποποιήστε και σχεδιάστε το κύκλωμα ώστε να δουλεύει σε 2 pipeline stages και βρείτε τη νέα μέγιστη συχνότητα ρολογιού. 3. Περιγράψτε το νέο κύκλωμα σε Verilog (dataflow ή/και behavioral) (μπορείτε να αγνοήσετε τους καταχωρητές αριστερά του κυκλώματος). a b w1 w4 y c d w2 sel w3 Απαντηση: 1. critical path = C2Q + MUX + NOT + OR + Setup= 0.8 + 4 + 2 + 5 + 0.2 = 10ns 2. critical path1 = C2Q +AND + Setup = 0.8 + 5 + 0.2 = 6ns critical path2 = C2Q + NOT + OR + Setup= 0.8 + 3 + 2 + 0.2 = 6ns 3. w1 <= a & b; w2 <= sel? c: d; w4 <= w1 ~w2; ή w1 <= a & b; w2 <= sel? c: d; temp = ~w2 w4 <= w1 temp; ή assign temp1 = a & b; assign temp2 = sel? c : d; assign temp3 = ~w2;
assign temp4 = w1 temp3; w1 <= temp1; w2 <= temp2; w4 <= w1 temp3; Θέμα 2 ο (20%): Σχεδιάστε τα κυκλώματα που θα προκύψουν από την σύνθεση των παρακάτω κειμένων Verilog χρησιμοποιώντας λογικές πύλες, πολυπλέκτες, αθροιστές, και flip-flops. Circuit A always @ (posedge clock) if (rst) c <= 0; d <= 0; else if (sel) c = #5 a + 1; d = #5 c + b; else c = #2 a & b; d = #5 c + 1; Circuit B (υποθέστε ότι όλα είναι 1 bit) always @ (posedge clk) if (B & C) f <= 1; else f <= f & C; assign D = (f C)? 1: 0; 1 a b + + 0 B C d 1 f 1 + 1 0 D Θέμα 3 ο (15%): 1. Αν οι τιμές των σημάτων είναι a=4 b0011 και b=4 b1110 βρείτε τις τιμές των παρακάτω σημάτων (και πόσα bit είναι): c = a ^ b d = (a==4 b0011 b==4 b1111) e = ^a f = a==4 b0011? (a 0111) : (b & 1100) g = {a,b} & {b,a} c = a ^ b = 0011 XOR 11110 = 1101 d = (a==4 b0011 b==4 b1111) = 1 Logical_OR 0 = 1
e = ^a = a(0) xor a(1) xor a(2) xor a(3) = 0^0^1^1 =0 f = a==4 b0011? (a 0111) : (b & 1100) = a OR 0111 = 0111 g = {a,b} & {b,a} = 00111110 AND 11100011 =00100010 2. Σας ζητούν να φτιάξετε ένα καινούργιο επεξεργαστή είτε σε ASIC είτε σε FPGA. Ποια θα είναι η πιο οικονομική λύση αν υπολογίζετε ότι θα πουληθούν 20.000 επεξεργαστές και ποσό θα κοστίζει κάθε επεξεργαστής αν θέλουμε να έχουμε κέρδος $10 για κάθε επεξεργαστή; Δίνεται ότι το κόστος αγοράς κάθε FPGA είναι $100, το κόστος κατασκευής κάθε ASIC είναι $20 και το κόστος για τις μάσκες (NRE) είναι $1.000.000. ASIC : NRE + Units * Cost = 1M + 20K * 20 = 1M + 400K = 1400K FPGA ( δεν χρειαζονται μασκες (NRE)) : Units * Cost = 20K * 100 = 2000K Θέμα 4 ο (40%): Σχεδιάστε ένα σύστημα το οποίο θα μετράει πόσα πακέτα δικτύου είναι τύπου TCP και πόσα τύπου UDP με βάση την τιμή του Protocol στο header του IP, όπως φαίνεται στο παρακάτω σχήμα. 1-bit valid FSM TCP Counter 16 bit counter 32-bit data UDP Counter 16 bit counter Παρακάτω δίνεται το header του IP (κάθε γραμμή είναι 32 bits και το Protocol ID (στην τρίτη γραμμή είναι 8 bits). Το σύστημα δέχεται τα πακέτα χρησιμοποιώντας 32 bits. Άρα πρώτα φτάνει στο σύστημα η πρώτη γραμμή (H1), μετά η δεύτερη γραμμή του header(h2), και μετά η τρίτη γραμμή (H3) που περιέχει και το Protocol ID (bits από 23 έως 16). Το σύστημα χρησιμοποιεί ένα valid bit για να καταλαβαίνει πότε υπάρχει ένα νέο πακέτο. Κάθε φορά που έρχεται ένα νέο πακέτο το valid bit γίνεται 1 και παραμένει 1 μέχρι να τελειώσει το πακέτο, μετά γίνεται 0 και μετά ξαναγίνεται 1 μόνο όταν έρθει ένα νέο πακέτο όπως φαίνεται στο διάγραμμα παρακάτω. Όταν η τιμή του Protocol είναι 6 (δηλαδή 8 b00000110) τότε το πακέτο είναι τύπου TCP, όταν η τιμή είναι 17 (δηλαδή 8 b00010001) τότε το πακέτο είναι τύπου UDP. Σχεδιάστε το διάγραμμα καταστάσεων και περιγράψτε το κύκλωμα σε Verilog (δεν χρειάζεται να περιγράψετε τις εισόδους και τις εξόδους. Μόνο την FSM, τους counters και ότι άλλο χρειάζεται) CLK Valid Input H1 H2 H3 new packet Protocol (24-16) 31 25 24 16 15 0 Η1 Version Length Type of Service Total Length Η2 Identification Flags Fragmentation Offset
Η3 Time to Live Protocol Header Checksum... MOORE if (Reset) CurrentState <= STATE_Zero; else CurrentState <= NextState; always @(In or CurrentState) NextState = CurrentState; case (CurrentState) STATE0: STATE1; STATE_H1: STATE_H2; STATE_H2: if (valid) if data[23:16==8 b6) NextState=STATE_TCP; else if data[23:16]==8 b17) NextState=STATE_UDP; ; STATE_TCP: TCP_En <= 1'b1; STATE_UDP: UDP_En <= 1'b1; STATE_: default: // in case we reach a bad state
case NextState = STATE_0; if (reset) tcp_counter=0; else if (TCP_en) tcp_counter = tcp_counter + 1; if (reset) udp_counter=0; else if (UDP_en) udp_counter = udp_counter + 1; MEALY if (Reset) CurrentState <= STATE_Zero; else CurrentState <= NextState; always @(In or CurrentState) NextState = CurrentState; case (CurrentState) STATE0: STATE1; STATE_H1: STATE_H2; STATE_H2: if data[23:16]=8 d6 TCP_En <= 1 b1; else if data[23:16]=8 d17 UDP_En<=1 b1; STATE_: default: // in case we reach a bad state
case NextState = STATE_0; if (reset) tcp_counter=0; else if (TCP_en) tcp_counter = tcp_counter + 1; if (reset) udp_counter=0; else if (UDP_en) udp_counter = udp_counter + 1; MEALY ONE PROCESS always @(posedge clock) if (reset) current_state = state0; TCP_counter <= 16'b0; UDP_counter <= 16'b0; else case (CurrentState) STATE0: if (valid) CurrentState =STATE1; STATE_H1: if (valid) CurrentState =STATE_H2; else CurrentState = STATE0; STATE_H2: UDP_counter+1; if (valid) if data[23:16]=8 d6 TCP_counter<= TCP_counter+1; else if data[23:16]=8 d17 UDP_counter<= if (valid) CurrentState = else CurrentState = STATE0; STATE_: if (valid) CurrentState = else CurrentState = STATE0; default: // in case we reach a bad state CurrentState = STATE_0;
case σε αυτή την περιπτωση οι counter είναι μεσα στο always(@posedge) αρα είναι ηδη καταχωρητες και δεν χρειαζεται να χρησιμοποιησουμε το tcp/udp enable