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:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert

von A. B. (Gast)


Bewertung
0 lesenswert
nicht lesenswert

von Carl (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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-)


Bewertung
0 lesenswert
nicht lesenswert
> Autor: Dike Scarring (Gast)

Glaubt ihm nichts, das ist nur ein billiges Fake!

von Carl (Gast)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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-)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all; 

entity ledsButtonsMemory is
  port (
    CLK_50MHz  : in std_logic;
    SWITCH_SW2  : in std_logic;
    SWITCH_SW3  : in std_logic;
    LED_D1    : out std_logic;
    LED_D3    : out std_logic;
    
    SDRAM_CLK   : out  STD_LOGIC;
    SDRAM_CKE   : out  STD_LOGIC;
    SDRAM_CS    : out  STD_LOGIC;
    SDRAM_nRAS  : out  STD_LOGIC;
    SDRAM_nCAS  : out  STD_LOGIC;
    SDRAM_nWE   : out  STD_LOGIC;
    SDRAM_DQM   : out  STD_LOGIC_VECTOR( 1 downto 0);
    SDRAM_ADDR  : out  STD_LOGIC_VECTOR (12 downto 0);
    SDRAM_BA    : out   STD_LOGIC_VECTOR( 1 downto 0);
    SDRAM_DQ    : inout  STD_LOGIC_VECTOR (15 downto 0)
       );
end ledsButtonsMemory;


architecture Behavioral of ledsButtonsMemory is

  constant sdram_address_width : natural := 22; -- for 32 MByte the sdram address with should be 25 bits
  constant sdram_column_bits   : natural := 8; -- what's that?
  constant sdram_startup_cycles: natural := 10100; -- 100us, plus a little more
  constant cycles_per_refresh  : natural := (64000*100)/4196-1;

  COMPONENT SDRAM_Controller
  generic (
    sdram_address_width : natural;
    sdram_column_bits   : natural;
    sdram_startup_cycles: natural;
    cycles_per_refresh  : natural
  );
  PORT(
    clk             : IN std_logic;
    reset           : IN std_logic;
      
  -- Interface to issue commands
    cmd_ready       : OUT std_logic;
    cmd_enable      : IN  std_logic;
    cmd_wr          : IN  std_logic;
    cmd_address     : in  STD_LOGIC_VECTOR(sdram_address_width-2 downto 0); -- address to read/write
    cmd_byte_enable : IN  std_logic_vector(3 downto 0);
    cmd_data_in     : IN  std_logic_vector(31 downto 0);    
      
  -- Data being read back from SDRAM
    data_out        : OUT std_logic_vector(31 downto 0);
    data_out_ready  : OUT std_logic;

  -- SDRAM signals
    SDRAM_CLK       : OUT   std_logic;
    SDRAM_CKE       : OUT   std_logic;
    SDRAM_CS        : OUT   std_logic;
    SDRAM_RAS       : OUT   std_logic;
    SDRAM_CAS       : OUT   std_logic;
    SDRAM_WE        : OUT   std_logic;
    SDRAM_DQM       : OUT   std_logic_vector(1 downto 0);
    SDRAM_ADDR      : OUT   std_logic_vector(12 downto 0);
    SDRAM_BA        : OUT   std_logic_vector(1 downto 0);
    SDRAM_DATA      : INOUT std_logic_vector(15 downto 0)     
  );
  END COMPONENT;
  
  -- SDRAM Controller Signals
  signal  cmd_ready       : std_logic;
  signal  cmd_enable      : std_logic:='0';
  signal  cmd_wr          : std_logic:='0';
  signal  cmd_address     : STD_LOGIC_VECTOR(sdram_address_width-2 downto 0); -- address to read/write
  signal  cmd_byte_enable : std_logic_vector(3 downto 0):="0000";
  signal  cmd_data_in     : std_logic_vector(31 downto 0);    
  signal  data_out        : std_logic_vector(31 downto 0);
  signal  data_out_ready  : std_logic;
  
  -- state machine
  signal counter: integer :=0 ;
  signal state: integer :=0 ;
  signal stateVector:std_logic_vector(4 downto 0);
  signal address: integer:=0;
  signal ledDisplay: std_logic_vector(1 downto 0):="00";
  
  signal slowClk: std_logic:='0';
  signal slowClk_counter: integer:=0;
  
begin
  SDRAM_ControllerInstance : SDRAM_Controller
  GENERIC MAP (
    sdram_address_width => sdram_address_width,
    sdram_column_bits   => sdram_column_bits,
    sdram_startup_cycles=> sdram_startup_cycles,
    cycles_per_refresh  => cycles_per_refresh
  )
  port map (  
    clk              => slowClk,
    reset            => '0',
    cmd_ready        => cmd_ready,       
    cmd_enable       => cmd_enable,      
    cmd_wr           => cmd_wr,          
    cmd_address      => cmd_address,     
    cmd_byte_enable  => cmd_byte_enable, 
    cmd_data_in      => cmd_data_in,     
    data_out         => data_out,        
    data_out_ready   => data_out_ready,  
    
    SDRAM_CLK   => SDRAM_CLK  ,
    SDRAM_CKE   => SDRAM_CKE  ,
    SDRAM_CS    => SDRAM_CS   ,
    SDRAM_RAS   => SDRAM_nRAS ,
    SDRAM_CAS   => SDRAM_nCAS ,
    SDRAM_WE    => SDRAM_nWE  ,
    SDRAM_DQM   => SDRAM_DQM  ,
    SDRAM_ADDR  => SDRAM_ADDR ,
    SDRAM_BA    => SDRAM_BA   ,
    SDRAM_DATA  => SDRAM_DQ   
    );
  
  process 
  begin
    
    wait until rising_edge(CLK_50MHz);
    
    --clock divider for ram clock
    if(slowClk_counter<5)then
  slowClk_counter <= slowClk_counter +1;
    else
  slowClk_counter <=0;
  slowClk<=not slowClk;
    end if;
    
    --if(counter<50000000)then
    if(counter<10)then
  counter <= counter +1;
    else
  counter <=0;
  
  -- state machine 
  if(state=5) then
    state<=0;
  else 
    state<=state+1;
  end if;

  --state0: increment address counter
  if(state=0)then
    if(address=10) then
      address<=0;
    else 
      address<=address+1;
    end if;
    ledDisplay(0)<='1'; -- indicate state 0
  end if;
  
  -- state1: read value
  if(state=1)then
    ledDisplay(0)<='0'; -- indicate state 0 ended
    ledDisplay(1)<=data_out(1); -- display read data bit
  end if;
  
  -- state2: read switch, set data, set wr
  if(state=2)then
    cmd_data_in(0)<=SWITCH_SW2;
    cmd_data_in(1)<=SWITCH_SW3;
    cmd_wr<='1';
  end if;
  
  -- state3: set command enable
  if(state=3)then
    cmd_enable<='1';
  end if;
  
  -- state4: reset command enable
  if(state=4)then
    cmd_enable<='0';
    cmd_wr<='0';
  end if;
  
    end if;
  
  end process ;
  
  stateVector<=std_logic_vector(to_unsigned(state, stateVector'length));
  cmd_address<=std_logic_vector(to_unsigned(address, cmd_address'length));
  
  LED_D1 <= not ledDisplay(0);
  LED_D3 <= not ledDisplay(1);

end Behavioral;




von Carl (Gast)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.