Forum: FPGA, VHDL & Co. SRAM - IS61LV25616AL Ansteuerung


von Ramon F. (tronixx)



Lesenswert?

Hallo zusammen,

ich habe ein Problem mit der Ansteuerung meines SRAMs, wobei ich eure 
Hilfe gebrauchen könnte. Hab mich schon durch alle Beiträge hierzu 
durchgebissen, hilft aber iwie nichts .

zu meiner Ausgangssituation:
- Spartan 3 Board (Digilent)
- SRAM IS61LV25616AL
- 16 Bit mit 8,8MHz einlesen/speichern
- 16 Bit mit 25MHz auslesen

Datenblatt zu SRAM : http://www.issi.com/pdf/61LV25616AL.pdf

Verhältnis Eingangstakt vs -Daten siehe Abbildung 1 (Gelb: 8,8MHz, Blau: 
Daten. Die Daten ändern sich ca. 10ns vor der steigenden Taktflanke.

Momentan lese ich die Daten gemäß Abbildung 2 ein (Eingangsdaten 
simuliert).
Timing dazu in Abb. 3


Ausgelesen werden diese siehe Abb. 4.  Die 50 MHz stehen noch drinn weil 
ich es vorher mit der READ-Variante Nr. 2 versucht habe, auch leider 
ohne erfolg. Wie man sehen kann sollen die daten auch nur alle 25ns 
ausgegeben werden.


Fazit: Mein Bild was ich an meinem Display sehe zeigt nur abwechselnd 
2-3 eine Farben an, jede Farbe aber über den Ganzen Schirm + 
"SChwarzflackern". Das Ursprungsbild besitzt unteranderem diese Farben, 
sodass ich zu der Annahme komme, das mein Ram iwie nicht jeden einzelnen 
Pixel speichert / ausgibt.
Was sagt Ihr denn zu meinem Timing. Iwo muss doch ein Fehler sein.
wäre euch sehr dankbar

MfG

von bko (Gast)


Lesenswert?

Dieses ist laut Datenblatt ein asyncrones RAM und hat damit
keinen Takt Eingang. Das Signal "WE" gibt den Zeitbezug beim
Schreiben vor!. Wie lange liegt die Adresse vor der fallenden
"WE" flanke an, und wielange danach?

von Ramon F. (tronixx)


Lesenswert?

Hallo,

>Dieses ist laut Datenblatt ein asyncrones RAM und hat damit
>keinen Takt Eingang.
der Takt spielt an sich auch keine Rolle. dieser soll nur zeigen (siehe 
Abb. 1) wie die Daten vorliegen.

>Das Signal "WE" gibt den Zeitbezug beim
>Schreiben vor!. Wie lange liegt die Adresse vor der fallenden
>"WE" flanke an, und wielange danach?
Mit der fallenden Flanke von WE ändert sich auch die Adresse,
da "tha" und "tsa" beide minumum 0ns haben (siehe Abb 3.)

MfG

von bko (Gast)


Lesenswert?

Tsa >0ns ist wie sichergestellt?

Und auch mal mit dem Oszi am RAM-Chip oder auch am Stecker angesehen?

Und ist "We(not)" etwa vom Takt kombinatorisch abgeleitet?
(sieht auf der Waveform zumindest danach aus..)
Wenn ja, dann mal hier nachlesen:
Beitrag "Clk auf Portausgang"

von Ramon F. (tronixx)


Lesenswert?

>Tsa >0ns ist wie sichergestellt?
ich versteh diese Frage leider nicht so ganz

>Und auch mal mit dem Oszi am RAM-Chip oder auch am Stecker angesehen?
Am RAM noch nicht -> folgt
Signale am Eingang liegen an, wurden auch schon separat getestet.
Pinbelegung mehrfach überprüft.
muss ich hinsichtlich der RAM-leitungen in der ucf-file was beachten?

>Und ist "We(not)" etwa vom Takt kombinatorisch abgeleitet?
ja, WE entspricht (not)clk. Da wir hier aber nur von 8,8 MHz sprechen 
brauch ich doch wohl kein extra buffer, DCM (geht ehh erst ab 25 MHz) 
etc.

was ist den generell mit dem Timing? Soweit ist doch alles so wie es das 
Datenblatt verlang, oder irre ich mich?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ramon F. schrieb:
>>Und auch mal mit dem Oszi am RAM-Chip oder auch am Stecker angesehen?
> Am RAM noch nicht -> folgt
Dann klemm die Masse jedes einzelnen Tastkopfs auch direkt in der Nähe 
an. Dann klingelt es nicht so...

Ramon F. schrieb:
> - 16 Bit mit 8,8MHz einlesen/speichern
> - 16 Bit mit 25MHz auslesen
Das ist eigentlich recht entspannt...
Und du hast da zwei "Teilnehmer"?

Ramon F. schrieb:
> Iwo muss doch ein Fehler sein.
Ja, vermutlich aber nicht im zeitlichen Zugriff, sondern bei der 
Arbittrierung des RAMs. Wie schaltest du zeichen den beiden 
Teilnehmern/Clockdomänen um?

von Ramon F. (tronixx)


Lesenswert?

Hallo,
da das ganze schon etwas unübersichtlicher wird, wollte ich einmal mit 
einem kleinen Code mein SRAM testen und es auch so besser zu verstehen.
wenn das hier klappt kann ich das ganze auch auf mein Prob. anwenden.
Nur leider will das ganze nicht so ganz.

Der Code soll einfach nur die RAM Adresse 3 abwechselnt lesen und neu 
beschreiben. Die Daten werden durch 3 switches vorgegeben. Ausgabe 
erfolgt dann über die LEDs.
Nun fängt das theater schon an .

bei der Synthese gibt er folgende Warnungen aus. (gilt für alle 
data_write Signale (0-15)

WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch 
<data_write_0> has a constant value of 0 in block <SRAM_Tester>. This 
FF/Latch will be trimmed during the optimization process.

und bei Place & Route:
WARNING:Par:100 - Design is not completely routed. There are 26 signals 
that are not completely routed in this design

finde / verstehn den Fehler nicht
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_arith.ALL;
4
use IEEE.STD_LOGIC_unsigned.ALL;
5
6
library UNISIM; 
7
use UNISIM.vcomponents.all;
8
9
10
entity SRAM_Tester is
11
    Port ( clk : in   STD_LOGIC;
12
   
13
        led  :  out STD_Logic_vector (2 downto 0);
14
        
15
        switch   : in  STD_LOGIC_vector (2 downto 0);
16
   
17
        sram_a_out  : out STD_Logic_vector (17 downto 0);
18
        sram_io    : inout STD_Logic_vector (15 downto 0);
19
        ub     : out  STD_LOGIC;
20
        lb     : out  STD_LOGIC; 
21
        oe     : out  STD_LOGIC;
22
        ce     : out  STD_LOGIC;
23
        we     : out  STD_LOGIC);
24
        
25
end SRAM_Tester;
26
27
28
29
30
architecture Behavioral of SRAM_Tester is
31
32
33
signal zustand     :  STD_LOGIC_VECTOR (2 downto 0)   :=  "000";
34
35
signal data_read    :  STD_LOGIC_VECTOR (15 downto 0)   := "0000000000000000";
36
signal data_write    :  STD_LOGIC_VECTOR (15 downto 0)   := "0000000000000000";
37
signal read_write    :  STD_LOGIC                := '0';  --(read = '1', write ='0')
38
39
40
component IOBUF_LVCMOS33 
41
port  (
42
  O : out   std_logic;
43
  IO: inout std_logic;
44
  I : in   std_logic;
45
  T : in   std_logic
46
  );
47
end component;
48
49
-----------------------------------------------------------------------------
50
begin
51
52
53
loop1: For i IN sram_io'RANGE generate
54
IOB_1: IOBUF_LVCMOS33 port map
55
  (O   => data_read(i),
56
  IO  => sram_io(i),
57
  I   => data_write(i),
58
  T  => read_write);
59
 end generate loop1;
60
61
-----------------------------------------------------------------------------
62
63
64
ub     <= '0';
65
lb     <= '0';
66
67
68
write_data: process (clk)
69
begin
70
    if rising_edge (clk)
71
    then
72
      
73
    if (zustand = "000")        --INIT
74
    then
75
        sram_a_out <= "000000000000000000";
76
        oe          <= '0';
77
        ce        <= '1';
78
        we        <= '1';
79
        
80
        read_write  <= '0';
81
        data_write  <= "0000000000000000";
82
        
83
        zustand     <= "001";
84
    
85
    -- WE controlled write-------------------------------------------------
86
    elsif (zustand = "001")      
87
    then
88
        sram_a_out <= "000000000000000011";      --schreibe in Adresse 3
89
        oe          <= '0';
90
        ce        <= '0';
91
        we        <= '0';
92
        
93
        read_write  <= '0';
94
        data_write  <= "0000000000000" & switch;
95
        
96
        zustand     <= "010";
97
    
98
    
99
    --Clear----------------------------------------------------------------
100
    elsif (zustand = "010")
101
    then
102
        sram_a_out <= "000000000000000000";      
103
        oe          <= '0';
104
        ce        <= '1';
105
        we        <= '1';
106
        
107
        read_write  <= '0';
108
        data_write  <= "0000000000000000";
109
        
110
        zustand     <= "011";
111
112
    
113
    --Read Adress Controlled-----------------------------------------------
114
    elsif (zustand = "011")
115
    then
116
        sram_a_out <= "000000000000000011";      
117
        oe          <= '0';
118
        ce        <= '0';
119
        we        <= '1';      
120
        read_write  <= '1';  
121
        zustand     <= "100";
122
    -----------------------------------------------------------------------
123
    
124
    --Clear and read value-------------------------------------------------
125
    elsif (zustand = "100")
126
    then
127
        sram_a_out <= "000000000000000011";      
128
        oe          <= '0';
129
        ce        <= '1';
130
        we        <= '1';      
131
        read_write  <= '0';
132
        
133
        led(0)    <= data_read(0);
134
        led(1)    <= data_read(1);
135
        led(2)    <= data_read(2);
136
        
137
        zustand     <= "001";
138
    end if;
139
      
140
    end if;
141
end process;
142
end Behavioral;

und dazu folgende ucf:
1
NET "clk"           LOC = "T9";
2
3
NET "led(0)"        LOC = "K12";
4
NET "led(1)"        LOC = "P14";
5
NET "led(2)"        LOC = "L12";
6
7
8
NET "switch(0)"        LOC = "K13";
9
NET "switch(1)"        LOC = "K14";
10
NET "switch(2)"        LOC = "J13";
11
12
NET "we"              LOC = "G3";
13
NET "ce"              LOC = "P7";
14
NET "oe"              LOC = "K4";
15
NET "lb"              LOC = "P6";
16
NET "ub"              LOC = "T4";
17
18
NET "sram_io(0)"          LOC = "N7";
19
NET "sram_io(1)"          LOC = "T8";
20
NET "sram_io(2)"          LOC = "R6";
21
NET "sram_io(3)"          LOC = "T5";
22
NET "sram_io(4)"          LOC = "R5";
23
NET "sram_io(5)"          LOC = "C2";
24
NET "sram_io(6)"          LOC = "C1";
25
NET "sram_io(7)"          LOC = "B1";
26
NET "sram_io(8)"          LOC = "D3";
27
NET "sram_io(9)"          LOC = "P8";
28
NET "sram_io(10)"          LOC = "F2";
29
NET "sram_io(11)"          LOC = "H1";
30
NET "sram_io(12)"          LOC = "J2";
31
NET "sram_io(13)"          LOC = "L2";
32
NET "sram_io(14)"          LOC = "P1";
33
NET "sram_io(15)"          LOC = "R1";
34
35
36
NET "sram_a_out(0)"          LOC = "L5";
37
NET "sram_a_out(1)"          LOC = "N3";
38
NET "sram_a_out(2)"          LOC = "M4";
39
NET "sram_a_out(3)"          LOC = "M3";
40
NET "sram_a_out(4)"          LOC = "L4";
41
NET "sram_a_out(5)"          LOC = "G4";
42
NET "sram_a_out(6)"          LOC = "F3";
43
NET "sram_a_out(7)"          LOC = "F4";
44
NET "sram_a_out(8)"          LOC = "E3";
45
NET "sram_a_out(9)"          LOC = "E4";
46
NET "sram_a_out(10)"          LOC = "G5";
47
NET "sram_a_out(11)"          LOC = "H3";
48
NET "sram_a_out(12)"          LOC = "H4";
49
NET "sram_a_out(13)"          LOC = "J4";
50
NET "sram_a_out(14)"          LOC = "J3";
51
NET "sram_a_out(15)"          LOC = "K3";
52
NET "sram_a_out(16)"          LOC = "K5";
53
NET "sram_a_out(17)"          LOC = "L3";

von Ramon F. (tronixx)


Lesenswert?

ok das mit der Synthese Warnung hab ich nun kapiert und ist auch 
nachvollziehbar, da ich nur die ersten 3 Bits verändere.

Aber ohne Warning implementieren und somit ein programming file 
erstellen kann ich nicht :(

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ramon F. schrieb:
> Aber ohne Warning implementieren und somit ein programming file
> erstellen kann ich nicht :(
Eine Warnung verhindert das Erstellen einen Bitfiles nicht! Du musst 
also noch irgendwo einen Fehler haben...


BTW:
1
loop1: For i IN sram_io'RANGE generate
2
IOB_1: IOBUF_LVCMOS33 port map
3
  (O   => data_read(i),
4
  IO  => sram_io(i),
5
  I   => data_write(i),
6
  T  => read_write);
7
 end generate loop1;

Einen Tristate-Bus kann man kompakter generisch beschreiben:
1
    sram_io   <= data_write when read_write='0' else (others=>'Z');
2
    data_read <= sram_io;

von Ramon F. (tronixx)


Lesenswert?

vielen Dank Lothar,

so funktioniert es einwandfrei. Versteh zwar nicht so 100% warum aber 
das passt schon und ist simpler. Dann werd ich mich aufbauend dessen mal 
um mein eigentliches Problem kümmern.

von Duke Scarring (Gast)


Lesenswert?

Ramon F. schrieb:
> use IEEE.STD_LOGIC_arith.ALL;
> use IEEE.STD_LOGIC_unsigned.ALL;

Auch wenn es etwas pedantisch ist, aber irgendwie muß man ja mal das 
Übel der std_logic_arith loswerden:

1. Du brauchst die beiden Biblitheken in Deinem Beispiel gar nicht, da 
Du den Typ unsigned nicht verwendest und auch sonst nicht gerechnet 
wird.

2. falls doch mal was mit Vektoren gerechnet werden soll, siehe:
Beitrag "Re: IEEE.STD_LOGIC_ARITH.ALL obsolete"

Duke

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.