Εμφάνιση αποτελεσμάτων : 1 έως 10 από 10

Θέμα: CPLD VHDL timing problem

  1. #1
    Μέλος Το avatar του χρήστη cdesp
    Όνομα
    Χρήστος
    Εγγραφή
    Sep 2009
    Περιοχή
    Κιλκις
    Μηνύματα
    253

    Cool CPLD VHDL timing problem

    Καλή χρονιά σε όλους.


    Έχω ένα CPLD XC95108 το οποίο χρησιμοποιώ για decoding όταν ο επεξεργαστής κάνει interrupt request IORQ για επικοινωνία με συσκευές.
    Το πρόβλημά μου είναι ότι χάνει ένα clock μέσα στο CPLD μέχρι να καταλάβει ότι έχει γίνει interrupt.


    Παρακάτω κομμάτι του VHDL κώδικα που αφορά το συγκεκριμένο πρόβλημα.
    Κώδικας:
    process (GENCLK,RESETin)
    begin
    	if RESETin='0' then
             IOH<='1';
            elsif  rising_edge(GENCLK)  then    	
              IOH <= '1'; 
    	--Input - Output Requests 
    	 if  sIORQ='0' and BUSACK='1' then -- we have an interrupt
               IOH <= '0'; 
    
    
             end if;
           end if;
    
    
    end process;
    IORQ2.png


    Με μπλε χρώμα το GENCLK (ίδιο για CPLD και CPU)
    Με κίτρινο το sIORQ
    Με πράσινο το IOH


    Αυτό που συμβαίνει είναι ότι χάνει ένα clock στην αρχή.
    Κανονικά θα έπρεπε το sIORQ και το IOH να είναι ίδια (ή τουλάχιστον αυτό θέλω εγώ ).
    Όταν χρησιμοποιούσα το 74HC138 δεν υπήρχε φυσικά κανένα πρόβλημα.


    Επίσης οποιαδήποτε συμβουλή για να ομαλοποιηθούν τα σήματα ευπρόσδεκτη.


    Καμιά ιδέα κανείς;


    Χρήστος.

    0 Not allowed! Not allowed!

  2. #2
    Μέλος
    Όνομα
    Μάνος
    Εγγραφή
    Jan 2012
    Περιοχή
    Κρήτη
    Μηνύματα
    3.953

    Προεπιλογή

    δεν καταλλαβα τι θες αλλα για αλλαξε σειρα στα end if δηλαδη
    Κώδικας:
    process (GENCLK,RESETin)
    begin
        if RESETin='0' then
             IOH<='1';
            elsif  rising_edge(GENCLK)  then        
              IOH <= '1'; 
            end if;
        --Input - Output Requests 
         if  sIORQ='0' and BUSACK='1' then -- we have an interrupt
               IOH <= '0'; 
             end if;
    end process
    
    ή
    
    process (GENCLK,RESETin)
    begin
        if RESETin='0' then
             IOH<='1';
            elsif  rising_edge(GENCLK)  then        
              IOH <= '1'; 
        --Input - Output Requests 
         elseif  sIORQ='0' and BUSACK='1' then -- we have an interrupt
               IOH <= '0'; 
             end if;
    end process

    0 Not allowed! Not allowed!

  3. #3
    Μέλος Το avatar του χρήστη cdesp
    Όνομα
    Χρήστος
    Εγγραφή
    Sep 2009
    Περιοχή
    Κιλκις
    Μηνύματα
    253

    Προεπιλογή

    Αυτό που θέλω είναι τα δυο σήματα IORQ και ΙΟΗ να έχουν ακριβώς την ίδια μορφή δηλαδή όταν γίνεται το interrupt IORQ
    την ίδια στιγμή στο ίδιο clock να το καταλαβαίνει και το cpld δλδ το ΙΟΗ.
    Όπως φαίνεται στην εικόνα αυτό γίνεται ένα clock μετά.

    Τελικά το μισοέλυσα βάζοντας το clock πρώτα στο cpld και μετά με αυτό τον κώδικα:

    Κώδικας:
    process(clock)
    begin
          if rising_edge(clock) then
            
                halfclock <= not halfclock;
          end if;
    end process;
    δίνω το halfclock στην CPU.
    Δεν είναι ίδια τα σήματα αλλά διαφέρουν μισό clock και πλέον λειτουργούν οι συσκευές μου.

    0 Not allowed! Not allowed!

  4. #4
    Μέλος
    Εγγραφή
    Apr 2006
    Περιοχή
    Κέρκυρα
    Μηνύματα
    5.965

    Προεπιλογή

    έχω πολλά χρόνια να δω vhdl (πάνω από 10)... αλλά αφού θες ένα decoder και δεν σου δουλεύει όπως πρέπει... κάποιο λάθος έχεις στην κατανόηση μάλλον της διαδικασίας Process
    γιατί δεν το κάνεις χωρίς εντολή process που θα δουλέψει σίγουρα? (δηλαδή να το κάνεις με την εντολή with - select)

    Προφανώς αν είναι για μάθημα θα το κάνεις με process ακόμα και αν δεν σε υποχρεώνει ο καθηγητής για να βρεις τι δεν έχεις κατανοήσει καλά....

    επίσης δεν έπρεπε να βάλεις στην ευαισθησία του process τα sIORQ και το BUSACK? πως θα τα επεξεργαστεί αν δεν τα έχει στην ευαισθησία? Μάλλον περιμένει την αλλαγή από τα άλλα δύο σήματα που έχεις στην ευαισθησία και τότε τα επεξεργάζεται και σου δίνει αποτέλεσμα.... δηλαδή επεξεργάζεται τη τα σήματα sIORQ και το BUSACK όταν έρχεται παλμός clk που είναι στην ευαισθησία του process και έτσι εκτελεί τον κώδικά σου (το process) με καθυστέρηση...

    (z80 είναι ο επεξεργαστής?)

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη chip : 09-01-15 στις 20:04

  5. #5
    Μέλος Το avatar του χρήστη cdesp
    Όνομα
    Χρήστος
    Εγγραφή
    Sep 2009
    Περιοχή
    Κιλκις
    Μηνύματα
    253

    Προεπιλογή

    Ο επεξεργαστής είναι Z80 η μια συσκευή είναι ένα 16550 για RS232 και η άλλη μια lcd16x2.
    Η lcd λειτουργεί πλέον καλά αλλά η RS232 μου άφησε ένα "κουσούρι" δλδ μου κάνει echo τον χαρακτήρα που στέλνω, χωρίς να έχω το echo ενεργοποιημένο στο terminal, πιθανολογώ ότι φταίει αυτό το μισό clock που έμεινε.
    Τα σήματα ευαισθησίας στο process υπάρχουν απλά δεν έγραψα όλο τον κώδικα για να επικεντρώσω στο πρόβλημα αλλά απ ότι ξέρω ακόμα και να μην τα βάλεις έτσι και αλλιώς στο τέλος θες δεν θες τα λαμβάνει υπόψη του.
    Χωρίς εντολή process μάλλον θα δουλέψει όπως λες αλλά κάνει αρκετά πράγματα στο decoding με διάφορα ports που δίνουν κάποια timing interrupts ακόμα και ps/2 Πληκτρολόγιο.

    Και όχι δεν είναι για μάθημα οπότε θα δώ μήπως και γίνεται χωρίς process έτσι και αλλιώς σχεδόν όλα τα σήματα είναι από την cpu οπότε δεν θα υπάρχει πρόβλημα συγχρονισμού.

    0 Not allowed! Not allowed!

  6. #6
    Μέλος
    Εγγραφή
    Apr 2006
    Περιοχή
    Κέρκυρα
    Μηνύματα
    5.965

    Προεπιλογή

    αν θυμάμαι καλά εδώ: process (GENCLK,RESETin) έπρεπε να είχες βάλει και τα άλλα δύο σήματα, διαφορετικά αν o compiler της vhdl κάνει σωστή μετάφραση (και μάλλον θα κάνει) είναι λογικό να σου δίνει αυτό το αποτέλεσμα... Δηλαδή η process αυτή εκτελείται μόνο όταν υπάρχει αλλαγη στα genclk και resetin

    0 Not allowed! Not allowed!

  7. #7
    Μέλος Το avatar του χρήστη cdesp
    Όνομα
    Χρήστος
    Εγγραφή
    Sep 2009
    Περιοχή
    Κιλκις
    Μηνύματα
    253

    Προεπιλογή

    O compiler βγάζει warning το οποίο έχει να κάνει με το simulator του δλδ αν δεν τα βάλεις εκεί θα έχεις πρόβλημα όχι στο τελικό. Εκεί δλδ στο chip τα λαμβάνει υπόψη του πάντα.
    Η δήλωσή μου ήταν αυτή: process (GENCLK,CLK50,CLKCOP,RESETin,DATA,RD,sIORQ) πάντως.

    Τελικά είχες δίκιο με το που τα έβαλα χωρίς process τα σήματα είναι οκ, παρόλα αυτά το λάθος με το echo ήταν δικό μου το WR σήμα ήταν πάντα ενεργό=0 στην RS232 οπότε πάντα έκανε write ξέχασα ένα καλώδιο το οποίο τώρα το κόλλησα για να μην υπάρξει ξανά πρόβλημα.

    Να δω τώρα πως θα περιγράψω τα πιο πολύπλοκα σήματα χωρίς process έχω κάτι DATA που είναι tri-state.

    Ευχαριστώ για την βοήθεια

    1 Not allowed! Not allowed!

  8. #8
    Μέλος
    Εγγραφή
    Apr 2006
    Περιοχή
    Κέρκυρα
    Μηνύματα
    5.965

    Προεπιλογή

    ωραία....
    κάνε μία δοκιμή να δεις αν αυτό δουλεύει.....

    process (GENCLK,RESETin, sIORQ, BUSACK)
    begin
    if RESETin='0' then
    IOH<='1';
    elsif rising_edge(GENCLK) then
    IOH <= '1';
    --Input - Output Requests
    if sIORQ='0' and BUSACK='1' then -- we have an interrupt
    IOH <= '0';

    end if;
    end if;
    end process;

    δεν ξέρω πως το φτιάχνεις το όλο κύκλωμα αλλά εγώ θα έβαζα πολλές process και όχι μια που αν κατάλαβα έχει μεγάλο κώδικα.... και οι Process θα συνδέονταν μεσα στο αρχειο της vhdl.... πρακτικά θα το έκανα σα να υλοποιούσα τα διάφορα εξαρτήματα που θα είχα αν το έκανα με TTL ολοκληρωμένα...
    επίσης γενικά είναι καλύτερα κάνεις να περιγράφει κύκλωμα και όχι λειτουργία αφού δεν είναι πάντα έξυπνος ο compiler...

    πχ αν κάνεις counter και του πεις count+1 το πιθανότερο είναι οτι δεν θα φτιάξει καθαρό κύκλωμα counter αλλά θα φτιάξει έναν αθροιστή με έναν register που κάθε φορά θα προσθέτει ένα στο προηγούμενο αποτέλεσμα, πράγμα που κάνει αργό το κύκλωμα... Λέω πιθανότερο γιατί δεν ξέρω τι κάνουν οι σύγχρονοι compiler... παλαιότερα (Προ δεκαετίας εκαναν αυτό που σου είπα αν και μου είχε τύχει να "παίξω" με κάποιο άλλο πακέτο αλλά δεν θυμάμαι αν ήταν modelsim ή κάτι τέτοιο... και όταν του είπα να μου δείξει τι έφτιαξε είχε πράγματι καταλάβει οτι θέλω μετρητή και είχε συνθέσει σύγχρονο μετρητή.

    κατά συνέπεια όσο περισσότερο περιγράφεις κύκλωμα και όχι συμπεριφορά τόσο καλύτερο κύκλωμα θα έχεις και θα ξέρεις πως δουλεύει....

    0 Not allowed! Not allowed!

  9. #9
    Μέλος Το avatar του χρήστη cdesp
    Όνομα
    Χρήστος
    Εγγραφή
    Sep 2009
    Περιοχή
    Κιλκις
    Μηνύματα
    253

    Προεπιλογή

    Έχεις δίκιο που λες ότι όταν περιγράφεις με Process θέλει προσοχή γιατί πολλές φορές κάνει άλλα πράγματα από αυτά που νομίζεις ότι θα κάνει.
    Τώρα τα μετέτρεψα σε περιγραφές out of process και λειτουργεί οκ.

    Το ise design suite 14.2 που χρησιμοποιώ κάνει αυτόματα reevaluate με all signals είτε τα βάλεις σε process sensitivity list είτε όχι.
    Απλά βγάζει warning που σου λέει ότι θα το κάνει.
    Άλλα λογισμικά πιθανόν να μην το κάνουν.

    Το BUSACK δεν παίζει ρόλο ακόμα οπότε ήταν πάντα '1' , τα υπόλοιπα signals ήταν στη λίστα και είχα την καθυστέρηση 1 clock που προείπα.

    Είναι μπελαλίδικα τα cpld αλλά γλιτώνεις πολλά ολοκληρωμένα και ακόμα πιο πολλές συνδέσεις με καλώδια κλπ. άσε που οποιαδήποτε αλλαγή/προσθήκη γίνεται πολύ πιο εύκολα απ ότι με τα 74hcxxx.

    0 Not allowed! Not allowed!

  10. #10
    Μέλος
    Εγγραφή
    Apr 2006
    Περιοχή
    Κέρκυρα
    Μηνύματα
    5.965

    Προεπιλογή

    πάντως αν και έχω παίξει με xilinx και έχω προγραμματιστή (φτιαχτό) για xilinx και έχω cpld (πολλά xc9536 και ένα 9510

    προτιμώ να χρησιμοποιώ altera με το παλαιό πακέτο MAX+Plus II (οι υπολογιστές μου είναι παλαιοί και σέρνονται με ποιο σύγχρονες εκδόσεις) γιατί μπορείς να σχεδιάζεις σε σχηματικό (φυσικά μπορείς και σε Vhdl και verilog) και έχει πολύ μεγάλη ποικιλια από έτοιμες βιβλιοθήκες από TTL αλλα και από επιπλέον παραμετροποιήσιμες λειτουργίες....
    Και στη xilinx βέβαια έχει βιβλιοθήκες για το σχηματικό όμως αν κρίνω από τις παλαιότερες εκδόσεις δεν είχε μεγάλη ποικοιλία και γι αυτό υποθέτω κι εσυ γράφεις vhdl.
    Επίσης στη xilinx η evaluation εκδοση νομίζω κάνει προσομείωση μόνο με αρχειο με test vectors από γλώσσα (vhdl) και έχουν απενεργοποιημένο το γραφικό περιβάλλον που φτιάχνεις τα test patern σε αντίθεση με το altera που δουλεύει (με περιορισμό χρόνου προσομοίωσης βέβαια)

    κανονικά O Z80 έχει TTL επίπεδα και κατα συνέπεια θα ήταν σωστό να τον χρησιμοποιείς με 74HCT και όχι με 74HC... για παράδειγμα αν ερχόταν στην είσοδο του 74hc μια τάση 2,5v η 3V για το 74HC είναι απροσδίοριστη στάθμη ενω για το 74hct είναι λογικό 1.

    0 Not allowed! Not allowed!

Παρόμοια Θέματα

  1. CPLD
    By ALAMAN in forum Γενικά
    Απαντήσεις: 6
    Τελευταίο Μήνυμα: 08-05-20, 16:40
  2. Στροβοσκόπιο για ρύθμιση αβανς ( Timing Light )
    By KOKAR in forum Παρουσίαση Ολοκληρωμένων Κατασκευών
    Απαντήσεις: 27
    Τελευταίο Μήνυμα: 29-02-20, 12:09
  3. XILINX CPLD
    By cdesp in forum Γενικά
    Απαντήσεις: 24
    Τελευταίο Μήνυμα: 07-01-11, 16:17
  4. CPLD + αισθητήριο κίνησης
    By TiMoRoS89 in forum Ερωτήσεις Αρχάριων
    Απαντήσεις: 4
    Τελευταίο Μήνυμα: 27-05-09, 10:10

Tags for this Thread

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας