Jump to content



Block RAM σε VHDL


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 comment
Share on other sites

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

 

η γραμμή:

 

	signal ram : ram_type;

 

γίνεται

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

 

 

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

  • Like 1
Link to comment
Share on other sites

  • 7 months later...

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

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

 

 

1!1!.PNG

  • Like 1
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Δημιουργία...

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.