Jump to content

Recommended Posts

Λοιπόν... προσπαθώ να φτιάξω μια μνήμη 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 post
Share on other sites

Για το συγκεκριμένο που με ενδιέφερε (να γεμίσω τη μνήμη με άσσους, απλά για να έχω σήμα), βρήκα λύση:

 

η γραμμή:

 

	signal ram : ram_type;

 

γίνεται

signal ram : ram_type := (others => "00000001");

 

 

βέβαια, αν ήθελα να το γεμίσω με συγκεκριμένα δεδομένα δεν ξέρω τι θα έπρεπε να κάνω, αλλά προς το παρόν λειτουργεί. Όταν βρω και με τα συγκεκριμένα δεδομένα τι παίζει, θα ενημερώσω εδώ, μήπως τύχει και χρειαστεί σε κάποιον μελλοντικό νουμπά :p

  • Like 1
Link to post
Share on other sites
  • 7 months later...

Ισως αυτο σε βοηθησει αν χρησιμοποεις Xilinx περιβαλλον αλλιως μπορεις με ενα απλο γοογλε να βρεις πως να κανεις initialize με αρχειο

Δεν χρειζεται κιολας να γραψεις ολον αυτο το κωδικα σου το κανει γενερατε αυτοματα και σου δινει ενα functional model για να το κανεις component

 

 

1!1!.PNG

  • Like 1
Link to post
Share on other sites

ναι, εν τέλει, μετά από πολλές επικλήσεις σε παναγία, χριστούλη και διάφορους αγίους το βρήκα/κατάφερα :)

  • Like 1
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.