mam problem z S-RAM w vhdl-u



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "Adam Ślosarski" <adamslosarski_at_nospam_tlen.pl>
Subject: mam problem z S-RAM w vhdl-u
Date: Sun, 3 Nov 2002 19:55:29 +0100


napisałem w VHDL układ statyczny ram czyli sa:
wejscia: A0-A15 D0-D7 CE - chipenable, WE-writeenable, OE-outputenable
wyjscia: D0-7

czyli D0-D7 (bajt) dane jest typu inout czyli gdy:

CE = 1 oraz WE=1 to wykonuje zapis do Ramu i wtedy D0-D7 to dane ktore
wysylam do tego RAMu
a gdy CE = 1 oraz OE = 1 to odczyt z ramu i wtedy D0-D7 to dane odczytywane
sa z RAM-u


aby to wszystko przetestowac napisalem kolejne entity w VHDL-u

ten entity ma jako wejscie rst oraz clk
w architekturze jest counter ktory zwiekszany jest o 1 z kazdym cyklem
zegara, rst resetuje counter

dla kolejnych count-ow odpowiednio ustawiam CE, WE, OE i A0-A15

wszystko byloby w porzadku, ale nie moge ustawic D0-D7 aby bylo wysylane do
RAM-u

entity testujace wyglada tak:

ENTITY GEN IS
-- GENERIC ( MemSize: integer := 3);
PORT ( clk: in std_logic;
D : inout std_ulogic_vector(7 downto 0); --to cos powoduje pozniej blad
(tzn. nie moge tego nadpisac w trakcie)
count : buffer integer; -- to tylko po to abym widzial w symulatorze na
ktorym councie jestem
rst: in std_logic );
END GEN;

ARCHITECTURE GEN OF GEN IS

SIGNAL WE, OE, CE : std_logic;
SIGNAL A : integer range 0 to 15; - tu oczywiscie jest tylko A0-A4 - dla
uproszczenia

BEGIN
ram1: SRAM
--GENERIC MAP(<association list>)
PORT MAP(A => A, D => D, WE => WE, OE => OE, CE => CE);

enable: process(clk, rst)
begin
if rst = '1' then
CE <= '0';
WE <= '0';
OE <= '0';
count <= 0;
A <= 0;
elsif clk'event and clk = '1' then
if count = 1 then
WE <= '1';
D <= x"0f"; -- TU JEST BLAD - WARP pisze mi ze: 'd(7)' -- Can't
handle registered multi driver.
elsif count = 2 then
CE <= '1';
D <= x"00";
elsif count = 3 then
CE <= '0';
elsif count = 4 then
OE <= '1';
WE <= '0';
elsif count = 5 then
CE <= '1';
elsif count = 6 then
CE <= '0';

co mam zrobic: chce zeby ten uklad testujacy potrafil sam z siebie wyrzucac
na out D7-D0 oraz czasami odczytywac D7-D0?

--
AdamS



Poprzedni Następny
Wiadomość
Spis treści
From: "Górski Adam" <gorskia_at_nospam_wp.pl>
Subject: Re: mam problem z S-RAM w vhdl-u
Date: Sun, 03 Nov 2002 21:08:30 GMT


ENTITY GEN IS
-- GENERIC ( MemSize: integer := 3);
PORT ( clk: in std_logic;
D : inout std_ulogic_vector(7 downto 0); --to cos powoduje pozniej blad
(tzn. nie moge tego nadpisac w trakcie)
count : buffer integer; -- to tylko po to abym widzial w symulatorze na
ktorym councie jestem
rst: in std_logic );
END GEN;

ARCHITECTURE GEN OF GEN IS

SIGNAL WE, OE, CE : std_logic;
SIGNAL A : integer range 0 to 15; - tu oczywiscie jest tylko A0-A4 - dla
uproszczenia

BEGIN
ram1: SRAM
--GENERIC MAP(<association list>)
PORT MAP(A => A, D => D, WE => WE, OE => OE, CE => CE);

enable: process(clk, rst)
begin
if rst = '1' then
CE <= '0';
WE <= '0';
OE <= '0';
count <= 0;
A <= 0;
elsif clk'event and clk = '1' then
if count = 1 then
WE <= '1';
D <= x"0f"; -- TU JEST BLAD - WARP pisze mi ze: 'd(7)' -- Can't
handle registered multi driver.
elsif count = 2 then
CE <= '1';
D <= x"00";
elsif count = 3 then
CE <= '0';
elsif count = 4 then
OE <= '1';
WE <= '0';
elsif count = 5 then
CE <= '1';
elsif count = 6 then
CE <= '0';

co mam zrobic: chce zeby ten uklad testujacy potrafil sam z siebie
wyrzucac
na out D7-D0 oraz czasami odczytywac D7-D0?

Zmiana wartości sygnału dozwolona jest tylko w jednym procesie- tu jest w
dwóch.

adam



Poprzedni Następny
Wiadomość
Spis treści
From: "Adam Ślosarski" <adamslosarski_at_nospam_tlen.pl>
Subject: Re: mam problem z S-RAM w vhdl-u
Date: Sun, 3 Nov 2002 22:12:44 +0100


ENTITY GEN IS
-- GENERIC ( MemSize: integer := 3);
PORT ( clk: in std_logic;
D : inout std_ulogic_vector(7 downto 0); --to cos powoduje pozniej
blad
(tzn. nie moge tego nadpisac w trakcie)
count : buffer integer; -- to tylko po to abym widzial w symulatorze
na
ktorym councie jestem
rst: in std_logic );
END GEN;

ARCHITECTURE GEN OF GEN IS

SIGNAL WE, OE, CE : std_logic;
SIGNAL A : integer range 0 to 15; - tu oczywiscie jest tylko A0-A4 - dla
uproszczenia

BEGIN
ram1: SRAM
--GENERIC MAP(<association list>)
PORT MAP(A => A, D => D, WE => WE, OE => OE, CE => CE);

enable: process(clk, rst)
begin
if rst = '1' then
CE <= '0';
WE <= '0';
OE <= '0';
count <= 0;
A <= 0;
elsif clk'event and clk = '1' then
if count = 1 then
WE <= '1';
D <= x"0f"; -- TU JEST BLAD - WARP pisze mi ze: 'd(7)' -- Can't
handle registered multi driver.
elsif count = 2 then
CE <= '1';
D <= x"00";
elsif count = 3 then
CE <= '0';
elsif count = 4 then
OE <= '1';
WE <= '0';
elsif count = 5 then
CE <= '1';
elsif count = 6 then
CE <= '0';

co mam zrobic: chce zeby ten uklad testujacy potrafil sam z siebie
wyrzucac
na out D7-D0 oraz czasami odczytywac D7-D0?

Zmiana wartości sygnału dozwolona jest tylko w jednym procesie- tu jest w
dwóch.


tzn. gdzie w dwóch procesach?
zmieniam w entity GEN w procesie "enable:"

no i zmieniam tez w entity RAM-u ale tam musze zmieniac bo ram moze odbierac
i wysylac przez D0-D7


ps. dzieki, od godziny czekalem na jakas odpowiedz :)

--
adams




Poprzedni Następny
Wiadomość
Spis treści
From: "Radosław Gala" <oberix_at_nospam_poczta.onet.pl>
Subject: Re: mam problem z S-RAM w vhdl-u
Date: Mon, 4 Nov 2002 00:15:28 +0100



co mam zrobic: chce zeby ten uklad testujacy potrafil sam z siebie
wyrzucac
na out D7-D0 oraz czasami odczytywac D7-D0?

Aby dwa układy komunikowały się ze sobą to trzeba aby jeden z nich zawsze
podawał stan wysokiej impedancji 'Z' tzn.
jeżeli chcesz aby Gen przesłał do ramu, to ram musi w tym czasie wystawiać
'Z'
wystarczy taki zapis wewnątrz ramu np.
if CE /= '1' and OE /='1' then
D<= (others =>'Z');
end if;
wtedy ram będzie widział to co przesyła Gen, tak jak jest na magistrali,
jeden wystawia dane, a reszta układów na magistrali wystawiają wysoką
impedancje
to samo w druga strona, jeżeli chcesz aby gen odczytał to co ram wystawia to
wystarczy aby gen wystawił D<= (others=> 'Z' ), wtedy na D w układzie Gen
pojawi się to co wystawi ram. W VHDL te funkcje realizuje się poprzez
funkcje rezolucji, w std_logic_1164 jest tablica dla STD_logic, można z niej
odczytać co będzie się działo jak na jednej linii spotka się '0' i '1'
CONSTANT resolution_table : stdlogic_table := (
-- ---------------------------------------------------------
-- | U X 0 1 Z W L H - | |
-- ---------------------------------------------------------
( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- | U |
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | X |
( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X' ), -- | 0 |
( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X' ), -- | 1 |
( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X' ), -- | Z |
( 'U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X' ), -- | W |
( 'U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X' ), -- | L |
( 'U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X' ), -- | H |
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ) -- | - |

Pozdrawiam
Radek