flik Δημοσ. 12 Δεκεμβρίου 2013 Δημοσ. 12 Δεκεμβρίου 2013 Έχω να φτιάξω μια fsm σε vhdl (χρησιμοποιώ xilinx webpack). Φτιάχνω το module, το κάνω implementation κανονικά χωρίς warnings και errors. Είναι ένα ακολουθιακό 5 καταστάσεων με 2 εισόδους. Μετά προσπαθώ να το κάνω simulation. Μου έχει δωθεί ένα παράδειγμα για το πώς δημιουργούμε και χειριζόμαστε το test_bench αλλά δεν μπόρεσα να το κάνω να λειτουργήσει σε εμένα. Γενικά, διαβάζει το entity, έχει μόνο του δημιουργήσει σήμα για το clock με 10ns περίοδο, και αρχικοποίησε τις τιμές. Εγώ στο stimulus βάζω μόνο wait for clk_period και αλλάζω τη μια είσοδο. Μετά ξανά wait και αλλάζω και τη δεύτερη. Δεν χρησιμοποίησα for loop, το κάνω έτσι για να είναι πιο καθαρά. Πάλι στο syntax το περνάει χωρίς warning, αλλά όταν πατάω να δω τις κυματομορφές, τα signals έχουν value U και ούτε καν το clock βλέπω να αλλάζει. Ούτε με force value σε μια απο τις δυο inputs κατάφερα να το κάνω.
Dr.Fuzzy Δημοσ. 12 Δεκεμβρίου 2013 Δημοσ. 12 Δεκεμβρίου 2013 Κάνε post τον κώδικα του FSM και του tb σου να σου πω. Το U είναι undefined οπότε μάλλον η κάτι δεν έχεις συνδέσει σωστά στη εμφάνιση της μονάδας σου μέσα στο tb ή έχεις multiple drivers.
flik Δημοσ. 12 Δεκεμβρίου 2013 Μέλος Δημοσ. 12 Δεκεμβρίου 2013 library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity fsm_module is Port ( X : in std_logic; Y : in std_logic; clk : in std_logic; reset : in std_logic; output: out std_logic_vector (2 downto 0)); end fsm_module; architecture fsm1 of fsm_module is type state is (a, b, c, d, e); attribute enum_encoding : string; attribute enum_encoding of state: type is "100 001 110 111 000"; signal p_state, n_state: state; begin ------------------------------------------------ process(clk, reset) begin IF (reset='1') THEN p_state <= a; elsif (clk'EVENT AND clk='1') then p_state <= n_state; end if; end process; ------------------------------------------------ process(X, Y, p_state) begin case p_state is when a => output <= "100"; if (X='1') then n_state <= b; elsif (Y='1') then n_state <= a; else n_state <= d; end if; when b => output <= "001"; if (X='1') then n_state <= c; else n_state <= b; end if; when c => output <= "110"; if (X='1') then if (Y='1') then n_state <= d; else n_state <= b; end if; else if (Y='1') then n_state <= a; else n_state <= c; end if; end if; when d => output <= "111"; if (X='1') then if (Y='1') then n_state <= e; else n_state <= a; end if; else if (Y='1') then n_state <= d; else n_state <= c; end if; end if; when e => output <= "000"; n_state <= a; end case; end process; end fsm1;[/spoiler] LIBRARY ieee; USE ieee.std_logic_1164.ALL; -- Uncomment the following library declaration if using -- arithmetic functions with Signed or Unsigned values --USE ieee.numeric_std.ALL; ENTITY fsm_testbench IS END fsm_testbench; ARCHITECTURE behavior OF fsm_testbench IS -- Component Declaration for the Unit Under Test (UUT) COMPONENT fsm_module PORT( X : IN std_logic; Y : IN std_logic; clk : IN std_logic; reset : IN std_logic; output : OUT std_logic_vector(2 downto 0) ); END COMPONENT; --Inputs signal X : std_logic := '0'; signal Y : std_logic := '0'; signal clk : std_logic := '0'; signal reset : std_logic := '0'; --Outputs signal output : std_logic_vector(2 downto 0); -- Clock period definitions constant clk_period : time := 10 ns; BEGIN -- Instantiate the Unit Under Test (UUT) uut: fsm_module PORT MAP ( X => X, Y => Y, clk => clk, reset => reset, output => output ); -- Clock process definitions clk_process :process begin clk <= '0'; wait for clk_period/2; clk <= '1'; wait for clk_period/2; end process; -- Stimulus process stim_proc: process begin -- hold reset state for 100 ns. wait for 100 ns; wait for clk_period*10; -- insert stimulus here X <= '1'; wait for clk_period; Y <= '1'; wait for clk_period; X <= '0'; wait for clk_period; reset<='0'; wait; end process; END; Ο κώδικας του module και του testbench αντίστοιχα. Στο testbench απλά ακολούθησα τις δοηγίες των έτοιμων σχολίων που είχε, και απο μερικά παραδείγματα που βρήκα στο internet. Εγώ έβαλα μόνο τις 7 γραμμές κάτω απο το σχόλιο "--insert stimulus here" Επίσης, κανονικά το fsm δεν είχε output, αλλά χωρίς output δεν μου έκανε το mapping καθόλου. Και το έβαλα εγώ. Δεν γίνεται να το κάνω χωρίς output; Απλά να βλέπω σε ποια κατάσταση είναι απο το εσωτερικό signal που έχω δημιουργήσει.
Dr.Fuzzy Δημοσ. 17 Δεκεμβρίου 2013 Δημοσ. 17 Δεκεμβρίου 2013 (επεξεργασμένο) Φίλε μου στο FSM_module και στο testbench δε βρίσκω κάτι λάθος. Σε Modelsim αλλά και στο ISim που έκανα compile και simulation δουλεύει μια χαρά. Μήπως...λέω τώρα...επειδή έχω δει πολλές φορές φοιτητές που δεν έχουν καταλάβει τη διαδικασία να το κάνουν...φορτώνεις και προσπαθείς να κάνεις simulation στο FSM_module αντί για το FSM_testbench που καλεί το FSM_module και θέτει τα σήματα εισόδου (ρολοι, x, y)....; Επίσης FSM χωρίς έξοδο είναι συνάρτηση χωρίς έξοδο! Τα συστήματα έχουν εισόδους/εξόδους και εσωτερικές καταστάσεις. Αν θέλεις μπορείς να πάρεις μια εσωτερική κατάσταση και να την συνδέσεις στην έξοδο σου, δηλαδή η λογική εξόδου σου απλά θα είναι ένα καλώδιο που συνδέει την εσωτερική σου κατάσταση με την έξοδο. Φυσικά και δε σου έκανε map και place route! Για την ακρίβεια κάνει και μετά απλά βλέπει ότι δεν έχει εξόδους οπότε στο optimization πάει και πετάει όλη τη λογική! Σκέψου υπάρχει λόγος ένα κουτί να έχει μέσα πχ, μία λάμπα που ανάβει αν εξ'ορισμού αυτό το κουτί δεν μπορεί να ανοίξει ποτέ για να διοχετευτεί το φως έξω; Φυσικά αν θες μπορείς να βάλεις constraints και να μη σου κάνει touch τη λογική το εργαλείο, αλλά σε αυτή τη περίπτωση σωστά πράττει! Επεξ/σία 17 Δεκεμβρίου 2013 από Dr.Fuzzy
flik Δημοσ. 17 Δεκεμβρίου 2013 Μέλος Δημοσ. 17 Δεκεμβρίου 2013 Ευχαριστώ για τον κόπο σου. Μόλις τώρα το έκανα και δούλεψε. Έβαλα τις αλλαγές σημάτων με for, το έκανα σε κάθε for να περιμένει 6*clk_period ώστε να είμαι σίγουρος οτι προλαβαίνει να κάνει όλες τις διαδρομές για μια είσοδο, και μου δούλεψε. Στην αρχή πάλι τρόμαξα γιατί δεν φαινόταν σωστά, αλλά με zoom φάνηκαν όλα. Μάλιστα απο τις κυματομορφές είδα και ένα λαθάκι στον κώδικα που είχα, τώρα όλα μια χαρά. Τώρα είμαι περίεργος να δω τι δεν έκανα σωστά με τον αρχικό κώδικα. Εσένα στο τέλος δεν σου καταλήγει σε undefined τιμή; Μήπως ξεκινούσε σε εμένα σωστά και στο τέλος πήγαινε σε U, και απλά έπρεπε να κάνω zoom; Κατάλαβα αυτό που λες για το output, είναι λογικό οκ. Αλλά τι θα τον πείραζε απλά να μην βγάζει έξοδο. Εφόσον γίνεται στις κυματομορφές να δείξεις τα εσωτερικά σήματα. Σε επίπεδο flip flops δηλαδή που το υλοποίησα και σε multisim, αυτό ακριβώς να πήγαινε να κάνει και το xilinx. ΥΓ: Πολύ ωραίο πρόγραμμα το Xilinx, αλλά με αρκετά bugs. Δεν μπορώ να κάνω open source που ήδη έχω φτιάξει, ούτε μπορώ να κάνω save το .wcfg με τις κυματομορφές. Αυτά τα κάνει σταθερά και πάντα. Και γενικά κι άλλες φορές μου κολλάει πού και πού και κλείνει. Δηλαδή αμα είχα να κάνω μεγάλο project θα το είχα σπάσει. Τις κυματομορφές δεν τις εξάγει σε graphics μορφή ε; Το έκανα με print screen μόνο.
Dr.Fuzzy Δημοσ. 17 Δεκεμβρίου 2013 Δημοσ. 17 Δεκεμβρίου 2013 Σίγουρα γίνεται να δεις τα εσωτερικά σήματα αλλά αυτό είναι simulation. Σε επίπεδο σύνθεσης μη ξεχνάς ότι ο σκοπός είναι να μεταφραστεί σε υλικό η περιγραφή σου και να υλοποιηθεί αργότερα σε chip (ASIC/FPGA κλπ), οπότε όπως καταλαβαίνεις δεν έχει νόημα ένα μπλοκ χωρίς εξόδους, γιαυτό και το εργαλείο της σύνθεσης κάνει optimize (trim) και πετάει τη λογική. Όπως σου είπα μπορείς να δηλώσεις contraints (don't touch στα paths που θες) και να μη σου κάνει optimize. Επίσης δεν ξέρω τι αλλαγές έκανες, πάντως όπως σου είπα οι κώδικες που έχεις κάνει post δουλεύουν, άρα κάτι λάθος έκανες στη διαδικασία του simulation (μάλλον φόρτωνες λάθος entity, όχι το testbench ή δεν είχες κάνει compile με τη σωστή σειρά των εξαρτήσεων).
flik Δημοσ. 18 Δεκεμβρίου 2013 Μέλος Δημοσ. 18 Δεκεμβρίου 2013 Μάλλον τίποτα με το implementation δεν έκανα σωστά. Οτι φόρτωνα το σωστό vhd (το testbench και όχι το module είμαι σίγουρος).
Dr.Fuzzy Δημοσ. 18 Δεκεμβρίου 2013 Δημοσ. 18 Δεκεμβρίου 2013 Άλλο το implementation, άλλο το simulation. Εσύ κάνεις RTL simulation οπότε το implementation (synthesis, map, place, route) δεν έχει καμία σχέση. Το λάθος το έκανες κάπου στη διαδικασία του simulation, που ακριβώς δε ξέρω, ίσως στο compile. To implementation θα είχε σχέση αν έκανες Gate level simulation (post synthesis) που προφανώς δεν έκανες.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα