سلام، من از کد زیر برای نمایش اطلاعات داخل SRAM روی VGA استفاده میکنم و یک پورت فقط خواندنی براش کنار گذاشتم و برای سینک کردن خوندن و نوشتن از طریق پورت دیگه کافیه سورس کلاک VGA و SRAM یکی باشن به شرطی که کلاک SRAM در این کد همیشه دو برابر یا بیشتر از کلاک VGA باشه، مثلا برای 640x480 60Hz پیکسل کلاک برابر 25Mhz هست پس حداقل کلاک این بلاک باید 50MHz باشه تا پیکسلها تکراری نشن یا نویز نگیرن.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
--Dual Port SRAM Controller: 1 Port Read-Only for VGA Driver + 1 Port Read or Write for External Access
entity SRAM_Controller is
port (
SRAM_CLOCK_IN : IN STD_LOGIC;
SRAM_READ_ADDRESS_IN : IN UNSIGNED (17 downto 0);
SRAM_READ_DATA_OUT : OUT UNSIGNED (15 downto 0);
SRAM_READ2_ADDRESS_IN : IN UNSIGNED (17 downto 0);
SRAM_READ2_DATA_OUT : OUT UNSIGNED (15 downto 0);
SRAM_WRITE_ADDRESS_IN : IN UNSIGNED (17 downto 0);
SRAM_WRITE_DATA_IN : IN UNSIGNED (15 downto 0);
SRAM_WRITE_COMMAND_IN : IN STD_LOGIC;
SRAM_ADDRESS_OUT : OUT STD_LOGIC_VECTOR (17 downto 0);
SRAM_DATA_INOUT : INOUT STD_LOGIC_VECTOR (15 downto 0);
SRAM_nWE_OUT : OUT STD_LOGIC;
SRAM_nCE_OUT : OUT STD_LOGIC;
SRAM_nOE_OUT : OUT STD_LOGIC;
SRAM_nLB_OUT : OUT STD_LOGIC;
SRAM_nUB_OUT : OUT STD_LOGIC
);
end SRAM_Controller;
architecture SRAM_Controller_Function of SRAM_Controller is
signal SRAM_nWRITE_COMMAND_IN : STD_LOGIC := '0';
begin
--Always Enabled For 16-Bit Data Access
SRAM_nLB_OUT <= '0';
SRAM_nUB_OUT <= '0';
SRAM_nOE_OUT <= '0';
--@200Mhz = 5ns
process(SRAM_CLOCK_IN)
variable State_Counter : Integer range 0 to 4 := 0;
begin
if rising_edge(SRAM_CLOCK_IN) then
case State_Counter is
when 0 =>
SRAM_nWE_OUT <= '1';
SRAM_nCE_OUT <= '0';
for i in 17 downto 0 loop
SRAM_ADDRESS_OUT(i) <= SRAM_READ_ADDRESS_IN(i);
end loop;
for i in 15 downto 0 loop
SRAM_DATA_INOUT(i) <= 'Z';
end loop;
State_Counter := State_Counter + 1;
when 1 =>
SRAM_nCE_OUT <= '1';
for i in 15 downto 0 loop
SRAM_READ_DATA_OUT(i) <= SRAM_DATA_INOUT(i);
end loop;
State_Counter := State_Counter + 1;
when 2 =>
if(SRAM_nWRITE_COMMAND_IN = not SRAM_WRITE_COMMAND_IN)then
SRAM_nWRITE_COMMAND_IN <= SRAM_WRITE_COMMAND_IN;
for i in 17 downto 0 loop
SRAM_ADDRESS_OUT(i) <= SRAM_WRITE_ADDRESS_IN(i);
end loop;
for i in 15 downto 0 loop
SRAM_DATA_INOUT(i) <= SRAM_WRITE_DATA_IN(i);
end loop;
SRAM_nWE_OUT <= '0';
else
SRAM_nWE_OUT <= '1';
for i in 17 downto 0 loop
SRAM_ADDRESS_OUT(i) <= SRAM_READ2_ADDRESS_IN(i);
end loop;
for i in 15 downto 0 loop
SRAM_DATA_INOUT(i) <= 'Z';
end loop;
end if;
SRAM_nCE_OUT <= '0';
State_Counter := State_Counter + 1;
when 3 =>
if(SRAM_nWRITE_COMMAND_IN = SRAM_WRITE_COMMAND_IN)then
for i in 15 downto 0 loop
SRAM_READ2_DATA_OUT(i) <= SRAM_DATA_INOUT(i);
end loop;
end if;
SRAM_nCE_OUT <= '1';
State_Counter := 0;
when others => null;
end case;
end if;
end process;
end SRAM_Controller_Function;