⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sram_controller.vhd

📁 国外网站上面找到的sram_controller
💻 VHD
字号:
-- sram_controller.vhd-- ****************************************** ---- Performs a read write operation to a SRAM ----- When fed by a 25.175MHz clock, this code ------ will have a cycle time of 140ns and a  -------- access time of 160ns ---- To write to SRAM:--      on rising edge of clock,-- if done signal is asserted,-- set: ce = '0', we = '0', and saddr = 15bit addr--      DIN = 8 bit data---- To read from SRAM:--      on rising edge of clock,-- if done signal is asserted,-- set: ce = '0', we = '0', and saddr = 15bit addr---- To perform burst read/writes, check for-- done_transac after each operation to be asserted-- before performing another operation---- when done_transac = '1' or done = '1', then-- the operation you requested will be performed-- in the case of reading SRAM, you can-- read the data (DOUT) anytime after either one of these-- signals are asserted.-- ****************************************** ---- EE552-- Data Co-processor-- Eric Chan-- Tim BenslerLibrary ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; package sram_pkg is	constant sram_data_width : positive := 8;	constant sram_addr_width : positive := 15;	subtype sram_addr is std_logic_vector(sram_addr_width-1 downto 0);	subtype sram_data is std_logic_vector(sram_data_width-1 downto 0);	type states is (INIT_ADDR, INIT_SIG, READ_REQ, WRITE_REQ,--					WAIT_WRITE, WAIT_READ,					WRITE_COMPL, READ_COMPL);		component sram_controller is		port (			mem_clk : in std_logic;			reset : in std_logic;			addr : in sram_addr;			addr_out : out sram_addr;			-- This signals connect directly to the SRAM			D : inout sram_data;			-- These signals interacts with the user			DIN : in sram_data;			DOUT : out sram_data;			-- signals transaction completed when asserted			done : BUFFER std_logic;			done_transac : out std_logic;			-- Write Enable (active low)			we : in std_logic;			nwe : BUFFER std_logic;			-- Output Enable (active low)			-- Output Enable will be controlled by the sram controller--			oe : in std_logic;			noe : out std_logic;			-- Chip Enable (active low)			ce : in std_logic;			nce : BUFFER std_logic			-- Debugging Purposes--			c_state : out states		);	end component sram_controller;end sram_pkg;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; library work;use work.sram_pkg.all;entity sram_controller is	port (		reset : in std_logic;		mem_clk : in std_logic;		addr : in sram_addr;		addr_out : out sram_addr;		D : inout sram_data;		DIN : in sram_data;		DOUT : out sram_data;		done : BUFFER std_logic;		done_transac : out std_logic;		we : in std_logic;		nwe : BUFFER std_logic;		noe : out std_logic;		ce : in std_logic;		nce : BUFFER std_logic;		c_state : out states	);end sram_controller; 	architecture beh_component of sram_controller issignal saddr : sram_addr;signal addr_same : sram_addr;signal d_in : sram_data;signal d_out : sram_data;signal cstate : states;begin	addr_out <= saddr;	c_state <= cstate;			sram_readwrite : process (mem_clk) is	type sram_rw_states is (SRAM_IDLE, SRAM_DONE);	variable sram_rw_cstate : sram_rw_states;	begin		if reset = '1' then			done_transac <= '1';			sram_rw_cstate := SRAM_IDLE;		elsif falling_edge(mem_clk) then			case sram_rw_cstate is			when SRAM_IDLE =>				if done = '1' then					done_transac <= '1';					sram_rw_cstate := SRAM_DONE; 				end if;			when SRAM_DONE =>				done_transac <= '0';				if done = '0' then					sram_rw_cstate := SRAM_IDLE;				end if;			end case;		end if;	end process sram_readwrite;	MEM_LOGIC: process (mem_clk)	begin		if (reset = '1') then			nce <= '1';			noe <= '1';			cstate <= WRITE_COMPL;			elsif rising_edge(mem_clk) then			case cstate is			when INIT_ADDR =>				-- Check if user wants to access the SRAM				if (ce = '0') then					cstate <= INIT_SIG;					end if;				nce <=	ce;			when INIT_SIG =>				-- Determines whether to read or write				if (we = '0') then					-- Output Enable is Enabled, SRAM driving the D-bus					noe <= '1';					cstate <= WRITE_REQ;				else					-- Output Enable is Disabled, SRAM Controller driving the D-bus					noe <= '0';					cstate <= READ_REQ;						end if;			-- 0th wait cycle			when WRITE_REQ =>--				cstate <= WAIT_WRITE;				cstate <= WRITE_COMPL;			when READ_REQ =>				cstate <= READ_COMPL;--				cstate <= WAIT_READ;			-- 1st wait cycle--			when WAIT_WRITE =>--				cstate <= WRITE_COMPL;--			when WAIT_READ =>--				cstate <= READ_COMPL;			-- 2nd wait cycle			when WRITE_COMPL =>				cstate <= INIT_ADDR;						when READ_COMPL =>				DOUT <= D;				-- Data is sent to user, SRAM no longer has to drive the bus				noe <= '1';				cstate <= INIT_ADDR;						end case;		end if;	end process MEM_LOGIC;		WITH cstate SELECT		D <= (others => 'Z') when INIT_ADDR, 			(others => 'Z') when INIT_SIG,			(others => 'Z') when READ_REQ,--			(others => 'Z') when WAIT_READ,			(others => 'Z') when READ_COMPL,			d_out WHEN others;	WITH cstate SELECT		done <=	'1' WHEN INIT_ADDR, 				'0' WHEN others;--	WITH cstate SELECT--		nce <=	ce	WHEN INIT_ADDR,--				nce WHEN others;	WITH cstate SELECT		nwe <=	we	WHEN INIT_SIG, 				nwe WHEN others;	WITH cstate SELECT		d_out <= DIN WHEN INIT_SIG, 				d_out WHEN others;	WITH cstate SELECT		-- This is implemented to satisfy tAS (Setup time) timing		-- 	before Chip Enabled signal is se nt to SRAM chip		-- Also used to prevent user from changing mem address during SRAM access		saddr <= addr WHEN INIT_ADDR,				saddr WHEN others;end beh_component;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -