deninho Δημοσιεύτηκε Ιούλιος 20, 2016 #1 Κοινοποίηση Δημοσιεύτηκε Ιούλιος 20, 2016 Λοιπόν... προσπαθώ να φτιάξω μια μνήμη block ram, και έχω σκαλώσει στο πως θα την γεμίσω με δεδομένα εξ αρχής. Επί της ουσίας θα δουλεύει ως ROM, τουλάχιστον στην αρχή. Ο κώδικας είναι ο εξής: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.NUMERIC_STD.ALL; entity RAM is Generic ( DATA_WIDTH : integer := 8; --platos ADDRESS_WIDTH : integer := 8 --theseis mnimis, bit ); Port ( Clock : in STD_LOGIC; Reset : in STD_LOGIC; DataIn : in STD_LOGIC_VECTOR (DATA_WIDTH - 1 downto 0); Address : in STD_LOGIC_VECTOR (ADDRESS_WIDTH - 1 downto 0); WriteEn : in STD_LOGIC; Enable : in STD_LOGIC; DataOut : out STD_LOGIC_VECTOR (DATA_WIDTH - 1 downto 0) ); end RAM; architecture Behavioral of RAM is type ram_type is array ((2 ** ADDRESS_WIDTH) - 1 downto 0) of STD_LOGIC_VECTOR (DATA_WIDTH - 1 downto 0); signal ram : ram_type; function init_ram return ram_type is variable temp : ram_type; begin -- for i in 0 to ((2**ADDRESS_WIDTH)-1) loop --temp(i) := "00000001"; temp(1) := "00000001"; temp(2) := "00000001"; temp(3) := "00000001"; temp(4) := "00000001"; temp(5) := "00000001"; temp(6) := "00000001"; temp(7) := "00000001"; temp(8) := "00000001"; -- end loop; return temp; end init_ram; begin -- Read process process (Clock) begin if rising_edge(Clock) then if Reset = '1' then -- Clear DataOut on Reset DataOut <= (others => '0'); elsif Enable = '1' then if WriteEn = '1' then -- passthrough DataOut <= DataIn; else -- read ram DataOut <= ram(to_integer(signed(Address))); end if; end if; end if; end process; -- Write process process (Clock) begin if rising_edge(Clock) then if Reset = '1' then -- Clear Memory on Reset for i in ram'Range loop ram(i) <= (others => '0'); end loop; elsif Enable = '1' then if WriteEn = '1' then -- Store DataIn to Current Memory Address ram(to_integer(unsigned(Address))) <= DataIn; end if; end if; end if; end process; end Behavioral; ενώ το top module, στο οποίο περιέχεται η μνήμη, έχει το εξής process (δεν είναι όλο, προφανώς, απλά το κομμάτι που ελέγχει τη διεύθυνση της μνήμης) if (ren = '1') then addr <= std_logic_vector(to_unsigned((to_integer(unsigned(addr))+1),8)); end if; Synthesis βγάζει χωρίς errors, αλλά με σφάλματα, ότι δεν είναι αρχικοποιημένη η μνήμη (τι μας λες;) Simulation βγαίνει, αλλά το πρόβλημα είναι ότι το data out της μνήμης, βγάζει μονίμως 0. Το μόνο που έχω καταφέρει, για να πάρω κάποιο σήμα, είναι να δίνω Data In και ταυτόχρονα να έχω read enable, write enable ενεργά, οπότε δίνει την είσοδο ως έξοδο, αλλά προφανώς δεν κάνουμε δουλειά έτσι. Καμιά ιδέα; Link to comment Share on other sites More sharing options...
deninho Ιούλιος 20, 2016 Author #2 Κοινοποίηση Ιούλιος 20, 2016 Για το συγκεκριμένο που με ενδιέφερε (να γεμίσω τη μνήμη με άσσους, απλά για να έχω σήμα), βρήκα λύση: η γραμμή: signal ram : ram_type; γίνεται signal ram : ram_type := (others => "00000001"); βέβαια, αν ήθελα να το γεμίσω με συγκεκριμένα δεδομένα δεν ξέρω τι θα έπρεπε να κάνω, αλλά προς το παρόν λειτουργεί. Όταν βρω και με τα συγκεκριμένα δεδομένα τι παίζει, θα ενημερώσω εδώ, μήπως τύχει και χρειαστεί σε κάποιον μελλοντικό νουμπά 1 Link to comment Share on other sites More sharing options...
netbust3r Μάρτιος 3, 2017 #3 Κοινοποίηση Μάρτιος 3, 2017 Ισως αυτο σε βοηθησει αν χρησιμοποεις Xilinx περιβαλλον αλλιως μπορεις με ενα απλο γοογλε να βρεις πως να κανεις initialize με αρχειο Δεν χρειζεται κιολας να γραψεις ολον αυτο το κωδικα σου το κανει γενερατε αυτοματα και σου δινει ενα functional model για να το κανεις component 1 Link to comment Share on other sites More sharing options...
deninho Μάρτιος 3, 2017 Author #4 Κοινοποίηση Μάρτιος 3, 2017 ναι, εν τέλει, μετά από πολλές επικλήσεις σε παναγία, χριστούλη και διάφορους αγίους το βρήκα/κατάφερα 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now