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
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?
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
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"
>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?
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?
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"; |
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 :(
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; |
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.