Forum: FPGA, VHDL & Co. XC6SLX16 Spartan 6 Entwicklungsboard


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Carl (Gast)


Angehängte Dateien:

Lesenswert?

Im Internet gibt es relativ günstige Spartan-6 Dev-Boards für knapp 30 
Euro.

https://www.amazon.de/JENOR-XC6SLX16-Spartan-Entwicklungsboard-Speicher/dp/B07JGLM71T/

Allerdings sehe ich nirgends einen Schaltplan. Es ist wirklich nervig, 
wenn Leute ein Board verkaufen, aber keine Unterlagen anhängen.

Ist das der Richtige?:

https://usermanual.wiki/Document/QMXC6SLX16SDRAMUserManual.551225584

Ärgerlich ist, dass die Boards keinen eindeutigen Namen haben. Das von 
Amazon heißt Jenor, aber das Wiki ist von QM-Tech.

von googlemeister (Gast)


Lesenswert?


von A. B. (Gast)


Lesenswert?


von Carl (Gast)


Angehängte Dateien:

Lesenswert?

googlemeister
>https://www.dropbox.com/s/dxl57tcf26mqvpy/XC6SLX16__Schematic.pdf?dl=0

Sehr gut, der Link scheint zu passen. Zumindest kann ich mit Hilfe des 
Schematics eine der LEDs blinken.

von Carl (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch eine Beispiel zur Ansteuerung der Tasten und Leds.
Das Board hat 3 Tasten und 4 LEDs.
Man kann aber nur zwei Tasten und zwei Leds ansteuern.

Die Taste "Prog B" ist wohl für das neu laden des FPGA aus dem 
SPI-Flasch reserviert. Wenn man sie drückt, geht die FPGA_DONE Led aus, 
bis die Daten wieder aus dem SPI-Flash in das FPGA geladen sind. Das 
geht in etwas 2 Sekunden. Wenn man ein Gerät mit dem FPGA baut, muss man 
also den Bootvorgang von ca. 2 Sekunden beachten.

von Dike Scarring (Gast)


Lesenswert?

Carl schrieb:
> Die Taste "Prog B" ist wohl für das neu laden des FPGA aus dem
> SPI-Flasch reserviert.
Ja, das ist bei Xilinx so üblich.
Bei den anderen Herstellern heißt der Pin ähnlich.

> Das geht in etwas 2 Sekunden.
> Wenn man ein Gerät mit dem FPGA baut, muss man
> also den Bootvorgang von ca. 2 Sekunden beachten.
Das kann man so pauschal nicht sagen:
Es hängt von der Größe der FPGA-Konfiguration, der SPI-Geschwindigkeit 
und der SPI-Busbreite ab.

Ich habe hier FPGAs mit 4xSPI (QSPI) und 25 MHz SPI-Clock, da geht die 
Konfiguration in deutlich unter 500 ms.

Duke

von Gustl B. (-gb-)


Lesenswert?

> Autor: Dike Scarring (Gast)

Glaubt ihm nichts, das ist nur ein billiges Fake!

von Carl (Gast)


Lesenswert?

>Es hängt von der Größe der FPGA-Konfiguration,

Ich hätte gedacht, dass die Zeitdauer für einen FPGA-Typ konstant ist 
und immer die selbe Anzahl Bits geladen werden.
Das obige Led/Taster Beispiel wird mit einer Auslastung von 1% angegeben 
und trotzdem braucht der Bootvorgang schon ca. 2 Sekunden.

von Carl (Gast)


Angehängte Dateien:

Lesenswert?

Ich hänge mal noch den Schaltplan an, damit dieser Thread vollständig 
ist und man schnell mit dem Board beginnen kann.

Leider fehlt noch ein SDRAM Beispiel, aber das dürfte etwas 
komplizierter werden.

von Gustl B. (-gb-)


Lesenswert?

Carl schrieb:
> Ich hätte gedacht, dass die Zeitdauer für einen FPGA-Typ konstant ist
> und immer die selbe Anzahl Bits geladen werden.
> Das obige Led/Taster Beispiel wird mit einer Auslastung von 1% angegeben
> und trotzdem braucht der Bootvorgang schon ca. 2 Sekunden.

Nein.
Die Anzahl der zu ladenen Bits ist konstant, also die Größe des 
Bitstreams. Aber wie lange das dauert hängt davon ab wie diese Bits in 
das FPGA geladen werden.
Das kann über langsames 1x SPI laufen, über schnelleres 4x SPI oder auch 
noch schneller über ein paralleles Interface.

Aber ja, für ein Board das Du vorliegen hast ist es konstant wenn Du es 
über immer den gleichen Mechanismus konfigurierst. Aber auch da hast Du 
ja zumindest zwei zur Auswahl:
1. Über JTAG
2. Aus dem Flash

von Pat A. (patamat)


Lesenswert?

Gustl B. schrieb:
> Die Anzahl der zu ladenen Bits ist konstant,

Das ist so nicht ganz richtig. Erstens gibt es auch FPGAs, die mit 
komprimierten Bitstreams umgehen können und da ist es leicht einsichtig, 
dass die Länge von Natur aus differiert. Und zweitens hängt die Länge 
des Bitstreams stark davon ab, ob Blockrams vorbelegt werden - 
komprimiert oder nicht!

Um die Konfigurationsdauer zu verkürzen, lässt sich in der Regel die 
SPI-Taktrate in weiten Bereichen einstellen. Wie schnell das wirklich 
funktioniert, hängt natürlich vom SPI-Flash ab.

von Christian R. (supachris)


Lesenswert?

Pat A. schrieb:
> Das ist so nicht ganz richtig. Erstens gibt es auch FPGAs, die mit
> komprimierten Bitstreams umgehen können und da ist es leicht einsichtig,
> dass die Länge von Natur aus differiert. Und zweitens hängt die Länge
> des Bitstreams stark davon ab, ob Blockrams vorbelegt werden -
> komprimiert oder nicht!

Bei Xilinx ist die Größe des nicht komprimierten Bitstreams für einen 
FPGA Typ in der Tat immer konstant, egal ob und wieviel Block RAM belegt 
sind, weil immer alle Bits initialisiert werden.
Mit der BitStream Kompression geht das schnell runter. Was natürlich 
auch hilft, ist die Config Rate einzustellen, aus einem SPI Flash kann 
man locker mit 50...100MHz booten. (Toleranz des CCLK beachten!)

: Bearbeitet durch User
von Carl (Gast)


Angehängte Dateien:

Lesenswert?

Bis jetzt habe ich mit dem teuren JTAG-Adapter

https://store.digilentinc.com/xup-usb-jtag-programming-cable/

die ganze Zeit nur ins RAM programmiert.

Ich hoffe, die Einstellungen für's Flash stimmen so.

von Carl (Gast)


Lesenswert?

Ich suche noch nach einem günstigeren JTAG-Programmer für das Board, da 
ich den jetzigen nur geliehen habe.

Wäre der hier geeignet?
https://www.amazon.de/Compatible-Platform-Cable-USB-Programmer/dp/B00KM70UFG

von Hans Hämmerle (Gast)


Lesenswert?

Carl schrieb:
> Wäre der hier geeignet?
> https://www.amazon.de/Compatible-Platform-Cable-USB-Programmer/dp/B00KM70UFG

Kommt auf dein persönlichen Glück an.

von Fitzebutze (Gast)


Lesenswert?

Du kannst eigentlich irgend einen FT2232H-basierten Programmer nehmen 
und mit xc3sprog glücklich werden. Lädt deutlich schneller als Impact.
Setzen wir auch für die Serienproduktion ein.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Carl schrieb:
> Wäre der hier geeignet?
> https://www.amazon.de/Compatible-Platform-Cable-USB-Programmer/dp/B00KM70UFG

Ich wuerde auf Ebay schauen, gibts da deutlich guenstiger. Oder gleich 
bei AliExpress.

: Bearbeitet durch User
von Carl (Gast)


Lesenswert?

>Du kannst eigentlich irgend einen FT2232H-basierten Programmer nehmen
>und mit xc3sprog glücklich werden. Lädt deutlich schneller als Impact.
>Setzen wir auch für die Serienproduktion ein.
Danke für den Hinweis.

Wie ich sehe, gab es hier im Forum schon mal ein längere Diskussion zu 
dem Thema:
Beitrag "Re: Neue Version von XC3SPROG"
Die Frage ist, ob die Exe von 2013 noch auf Win10 läuft ....

Ich habe dieses FDTI-Board und hoffe, dass es damit laufen könnte:

https://de.aliexpress.com/item/32961246303.html

von Friedhelm (Gast)


Angehängte Dateien:

Lesenswert?

>Wäre der hier geeignet?
>https://www.amazon.de/Compatible-Platform-Cable-USB-Programmer/dp/B00KM70UFG

Ich habe mich doch für diesen entschieden, weil ich davon ausging, dass 
man damit am wenigsten Softwareproblem hat. Und tatsächlich: 
anschließen, funktioniert.
Allerdings scheinen die auf dem Spartan-6-Board die Pins ein wenig 
verdreht zu haben, deshalb muss man mit dem mitgelieferten Adapter die 
Pins einzeln anschließen.

Auf dem Programmierer steht "Xilinx - Platform Cable USB" aber es 
scheint eher die Version II von hier zu sein.

https://www.xilinx.com/support/documentation/data_sheets/ds593.pdf

von Fitzebutze (Gast)


Lesenswert?

Carl schrieb:
> Die Frage ist, ob die Exe von 2013 noch auf Win10 läuft ....
>

Die Treiber sind eher das Problem, aber nur, wenn eine andere PID als 
6010 benutzt wird.

> Ich habe dieses FDTI-Board und hoffe, dass es damit laufen könnte:
>
> https://de.aliexpress.com/item/32961246303.html

xc3sprog läuft mit allen FT[2,4]232-Boards, allenfalls musst du 
VID/PID in der Software anpassen. Es gibt auch eine weiterentwickelte 
Version namens 'papilio-prog', die allenfalls mit dem Spartan6 besser 
tut, bin aber nicht auf dem Stand. Gibt auch fertige Entwicklungskits 
mit on-board-Programmer (wie http://papilio.cc/, 
https://hackaday.io/project/162259-netpp-node), die allerdings nicht im 
Bastler-Budget liegen, da teils einiges an Software-Support mit 
reingeht. Das ist bei den Billigboards teils unterirdisch, abgesehen von 
der teils miserablen Stabilität wegen unzureichender Bestückung mit 
Low-ESR-Caps.

Wir nutzen für die ganze Software einen Linux-Container, da ist alles 
fertig drin und läuft in einer VM. Es empfiehlt sich allenfalls, sich so 
etwas zu bauen um aktuelle xc3sprog-Versionen zu übersetzen. Es waren 
hier ab und an auch Anpassungen nötig (an andere Flash-Hersteller).

von Carl (Gast)


Angehängte Dateien:

Lesenswert?

Hier

http://hamsterworks.co.nz/mediawiki/index.php/Simple_SDRAM_Controller#Version_0.1_-_minimal_controller

gibt es einen Treiber für das SDRAM

MT48LC16M16A2

wie es auf dem Board verbaut ist.


Leider funktioniert mein Testprogramm für das RAM noch nicht.

Vielleicht hat jemand eine Idee:
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.all;
3
USE ieee.numeric_std.all; 
4
5
entity ledsButtonsMemory is
6
  port (
7
    CLK_50MHz  : in std_logic;
8
    SWITCH_SW2  : in std_logic;
9
    SWITCH_SW3  : in std_logic;
10
    LED_D1    : out std_logic;
11
    LED_D3    : out std_logic;
12
    
13
    SDRAM_CLK   : out  STD_LOGIC;
14
    SDRAM_CKE   : out  STD_LOGIC;
15
    SDRAM_CS    : out  STD_LOGIC;
16
    SDRAM_nRAS  : out  STD_LOGIC;
17
    SDRAM_nCAS  : out  STD_LOGIC;
18
    SDRAM_nWE   : out  STD_LOGIC;
19
    SDRAM_DQM   : out  STD_LOGIC_VECTOR( 1 downto 0);
20
    SDRAM_ADDR  : out  STD_LOGIC_VECTOR (12 downto 0);
21
    SDRAM_BA    : out   STD_LOGIC_VECTOR( 1 downto 0);
22
    SDRAM_DQ    : inout  STD_LOGIC_VECTOR (15 downto 0)
23
       );
24
end ledsButtonsMemory;
25
26
27
architecture Behavioral of ledsButtonsMemory is
28
29
  constant sdram_address_width : natural := 22; -- for 32 MByte the sdram address with should be 25 bits
30
  constant sdram_column_bits   : natural := 8; -- what's that?
31
  constant sdram_startup_cycles: natural := 10100; -- 100us, plus a little more
32
  constant cycles_per_refresh  : natural := (64000*100)/4196-1;
33
34
  COMPONENT SDRAM_Controller
35
  generic (
36
    sdram_address_width : natural;
37
    sdram_column_bits   : natural;
38
    sdram_startup_cycles: natural;
39
    cycles_per_refresh  : natural
40
  );
41
  PORT(
42
    clk             : IN std_logic;
43
    reset           : IN std_logic;
44
      
45
  -- Interface to issue commands
46
    cmd_ready       : OUT std_logic;
47
    cmd_enable      : IN  std_logic;
48
    cmd_wr          : IN  std_logic;
49
    cmd_address     : in  STD_LOGIC_VECTOR(sdram_address_width-2 downto 0); -- address to read/write
50
    cmd_byte_enable : IN  std_logic_vector(3 downto 0);
51
    cmd_data_in     : IN  std_logic_vector(31 downto 0);    
52
      
53
  -- Data being read back from SDRAM
54
    data_out        : OUT std_logic_vector(31 downto 0);
55
    data_out_ready  : OUT std_logic;
56
57
  -- SDRAM signals
58
    SDRAM_CLK       : OUT   std_logic;
59
    SDRAM_CKE       : OUT   std_logic;
60
    SDRAM_CS        : OUT   std_logic;
61
    SDRAM_RAS       : OUT   std_logic;
62
    SDRAM_CAS       : OUT   std_logic;
63
    SDRAM_WE        : OUT   std_logic;
64
    SDRAM_DQM       : OUT   std_logic_vector(1 downto 0);
65
    SDRAM_ADDR      : OUT   std_logic_vector(12 downto 0);
66
    SDRAM_BA        : OUT   std_logic_vector(1 downto 0);
67
    SDRAM_DATA      : INOUT std_logic_vector(15 downto 0)     
68
  );
69
  END COMPONENT;
70
  
71
  -- SDRAM Controller Signals
72
  signal  cmd_ready       : std_logic;
73
  signal  cmd_enable      : std_logic:='0';
74
  signal  cmd_wr          : std_logic:='0';
75
  signal  cmd_address     : STD_LOGIC_VECTOR(sdram_address_width-2 downto 0); -- address to read/write
76
  signal  cmd_byte_enable : std_logic_vector(3 downto 0):="0000";
77
  signal  cmd_data_in     : std_logic_vector(31 downto 0);    
78
  signal  data_out        : std_logic_vector(31 downto 0);
79
  signal  data_out_ready  : std_logic;
80
  
81
  -- state machine
82
  signal counter: integer :=0 ;
83
  signal state: integer :=0 ;
84
  signal stateVector:std_logic_vector(4 downto 0);
85
  signal address: integer:=0;
86
  signal ledDisplay: std_logic_vector(1 downto 0):="00";
87
  
88
  signal slowClk: std_logic:='0';
89
  signal slowClk_counter: integer:=0;
90
  
91
begin
92
  SDRAM_ControllerInstance : SDRAM_Controller
93
  GENERIC MAP (
94
    sdram_address_width => sdram_address_width,
95
    sdram_column_bits   => sdram_column_bits,
96
    sdram_startup_cycles=> sdram_startup_cycles,
97
    cycles_per_refresh  => cycles_per_refresh
98
  )
99
  port map (  
100
    clk              => slowClk,
101
    reset            => '0',
102
    cmd_ready        => cmd_ready,       
103
    cmd_enable       => cmd_enable,      
104
    cmd_wr           => cmd_wr,          
105
    cmd_address      => cmd_address,     
106
    cmd_byte_enable  => cmd_byte_enable, 
107
    cmd_data_in      => cmd_data_in,     
108
    data_out         => data_out,        
109
    data_out_ready   => data_out_ready,  
110
    
111
    SDRAM_CLK   => SDRAM_CLK  ,
112
    SDRAM_CKE   => SDRAM_CKE  ,
113
    SDRAM_CS    => SDRAM_CS   ,
114
    SDRAM_RAS   => SDRAM_nRAS ,
115
    SDRAM_CAS   => SDRAM_nCAS ,
116
    SDRAM_WE    => SDRAM_nWE  ,
117
    SDRAM_DQM   => SDRAM_DQM  ,
118
    SDRAM_ADDR  => SDRAM_ADDR ,
119
    SDRAM_BA    => SDRAM_BA   ,
120
    SDRAM_DATA  => SDRAM_DQ   
121
    );
122
  
123
  process 
124
  begin
125
    
126
    wait until rising_edge(CLK_50MHz);
127
    
128
    --clock divider for ram clock
129
    if(slowClk_counter<5)then
130
  slowClk_counter <= slowClk_counter +1;
131
    else
132
  slowClk_counter <=0;
133
  slowClk<=not slowClk;
134
    end if;
135
    
136
    --if(counter<50000000)then
137
    if(counter<10)then
138
  counter <= counter +1;
139
    else
140
  counter <=0;
141
  
142
  -- state machine 
143
  if(state=5) then
144
    state<=0;
145
  else 
146
    state<=state+1;
147
  end if;
148
149
  --state0: increment address counter
150
  if(state=0)then
151
    if(address=10) then
152
      address<=0;
153
    else 
154
      address<=address+1;
155
    end if;
156
    ledDisplay(0)<='1'; -- indicate state 0
157
  end if;
158
  
159
  -- state1: read value
160
  if(state=1)then
161
    ledDisplay(0)<='0'; -- indicate state 0 ended
162
    ledDisplay(1)<=data_out(1); -- display read data bit
163
  end if;
164
  
165
  -- state2: read switch, set data, set wr
166
  if(state=2)then
167
    cmd_data_in(0)<=SWITCH_SW2;
168
    cmd_data_in(1)<=SWITCH_SW3;
169
    cmd_wr<='1';
170
  end if;
171
  
172
  -- state3: set command enable
173
  if(state=3)then
174
    cmd_enable<='1';
175
  end if;
176
  
177
  -- state4: reset command enable
178
  if(state=4)then
179
    cmd_enable<='0';
180
    cmd_wr<='0';
181
  end if;
182
  
183
    end if;
184
  
185
  end process ;
186
  
187
  stateVector<=std_logic_vector(to_unsigned(state, stateVector'length));
188
  cmd_address<=std_logic_vector(to_unsigned(address, cmd_address'length));
189
  
190
  LED_D1 <= not ledDisplay(0);
191
  LED_D3 <= not ledDisplay(1);
192
193
end Behavioral;

von Carl (Gast)


Lesenswert?

Das Testprogramm funktioniert doch, wenn man die Zeile

cmd_enable<='0';

in state 4 auskommentiert.

Scheinbar muss das cmd_enable immer auf 1 sein, damit sich das RAM 
angesprochen fühlt.

von Carl (Gast)


Angehängte Dateien:

Lesenswert?

Hier die funktionierende Version. Zusammen mit dem UCF-File und dem 
SDRAM-Controller von oben lässt sich daraus das lauffähige Konfiguration 
"ledsbuttonsmemory_bitFile" synthetisieren.

Das Für- und Wider der Verwendung von SDRAMS wird hier ausufernd 
diskutiert:
Beitrag "VHDL SDRAM Controller"

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Carl schrieb:
> Scheinbar muss das cmd_enable immer auf 1 sein, damit sich das RAM
> angesprochen fühlt.

Ja, und das hat auch einen Sinn. Mit dem CMD sagt man ja dem Controller, 
was man tun möchte. Lesen oder Schreiben z.B. Warum das aber in dem Code 
so gelöst ist, weiß ich nicht. Normalerweise macht man das einen Takt 
lang an.

von Ale (Gast)


Lesenswert?

>  constant sdram_column_bits   : natural := 8; -- what's that?

Das SDRAM hat 2 "Strobes": Row Address Strobe (RAS) und Column Address 
Strobe (CAS).

Column bits sind die bits die man rausschicken muss werend CAS auf Null 
gesetzt wird, i.e. A0..A7.

1 Bank = Rows x Cols

von Ned (Gast)


Lesenswert?

Hello, Please excuse the English.
I just received my board and although I was too cheap to buy a nice 
Digilent JTAG USB lead, I did buy one similar to that pictured by 
Friedhelm.
I've worked with Xilinx in a production environment but never created 
any designs of my own with them. I just wanted to post this link I found 
of QMTECH's demo projects. LED's, Keys, SDRAM and a couple more using 
their development daughter board which has a 330MHz DAC (ADV7123) 
connected to an SVGA interface as well as the venerable CY7C68013 USB 
FIFO chip. They seem to include a slave FIFO demo project as well. 
Anyone know where we can buy the carrier board? (They call it a 
"daughter board" and the main board they call a "core board" even though 
the core board is physically being carried by the daughter board).

Their demos:

https://github.com/ChinaQMTECH

Ned

von Ned (Gast)


Angehängte Dateien:

Lesenswert?

I forgot to mention that, in response to the original thread, their file 
of demos also includes circuit diagrams and lots of datasheets of the 
XC6SLX16 Spartan 6  as well as datasheets of the SDRAM, FIFO, DAC and 
all the other chips on both boards.

https://github.com/ChinaQMTECH/QM_XC6SLX16_SDRAM

von Bernd (Gast)


Lesenswert?

>Anyone know where we can buy the carrier board? (They call it a
>"daughter board" and the main board they call a "core board" even though
>the core board is physically being carried by the daughter board).

Hi Ned,
the Board can be found on Ali-Express, it is named

"Xilinx FPGAIO Expansion Board mit 64 Mbit Flash 32 Mbyte SDRAM"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.