Forum: FPGA, VHDL & Co. ISE Spartan 3E Starter Kit > PIN Problem


von Richard B. (rbrose)


Lesenswert?

Hallo,

ich habe mir das Spartan 3E Starter Kit gekauft. Fange erst jetzt mit 
FPGA an.
Ich habe mir ein Project mit ISE erstellt. Folgende Einstellungen 
benutzt:

Family: Spartan3E
Device: XC3S500E
Package: CP132
Speed:   -5

Hab einen kleinen counter in VHDL geschrieben:
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
---- Uncomment the following library declaration if instantiating
7
---- any Xilinx primitives in this code.
8
--library UNISIM;
9
--use UNISIM.VComponents.all;
10
11
entity counter is
12
    Port ( CLOCK : in  STD_LOGIC;
13
           DIRECTION : in  STD_LOGIC;
14
           COUNT_OUT : out  STD_LOGIC_VECTOR (3 downto 0));
15
end counter;
16
17
architecture Behavioral of counter is
18
19
signal count_int : STD_LOGIC_VECTOR (3 downto 0) := "0000";
20
21
begin
22
23
process (CLOCK) 
24
begin
25
   if CLOCK='1' and CLOCK'event then
26
      if DIRECTION='1' then   
27
         count_int <= count_int + 1;
28
      else
29
         count_int <= count_int - 1;
30
      end if;
31
   end if;
32
end process;
33
34
COUNT_OUT <= count_int;
35
36
end Behavioral;


Hab jetzt aber ein Problem beim Verbinden der PINS. Im User Manual:
http://www.xilinx.com/support/documentation/boards_and_kits/ug230.pdf
steht das folegnde PINs zu den LEDs führen:


NET "LED<7>" LOC = "F9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<6>" LOC = "E9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<5>" LOC = "D11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 
;
NET "LED<4>" LOC = "C11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 
;
NET "LED<3>" LOC = "F11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 
;
NET "LED<2>" LOC = "E11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 
;
NET "LED<1>" LOC = "E12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 
;
NET "LED<0>" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 
;


Wenn ich aber E12 Verbinden will, geht es nicht. Genau so bei E11 und 
F11.
F12 geht. Wieso ist das so? Ist das der falsche FPGA? Was mache ich 
falsch?


Vielen Dank im voraus für die Hilfe.

von TheMason (Gast)


Lesenswert?

>NET "LED<7>" LOC = "F9"

heißt soviel wie das LED nr 7 am pin F9 angeschlossen ist.
unter ise verwendest du nur noch LED(7).

die ports die du in der entity verwendest müssen auch in dieser 
pin-beschreibung auftauchen, sonst weist ISE/PACE die unbekannten 
signale irgendwelchen pins zu.

in diesem falle müsstest du dein count_out auf die leds ausgeben.

so in etwa :

entity counter is
    Port ( CLOCK : in  STD_LOGIC;
           DIRECTION : in  STD_LOGIC;
           LED : out  STD_LOGIC_VECTOR (7 downto 0));
end counter;

architecture Behavioral of counter is

signal count_int : STD_LOGIC_VECTOR (3 downto 0) := "0000";

begin

process (CLOCK)
begin
   if CLOCK='1' and CLOCK'event then
      if DIRECTION='1' then
         count_int <= count_int + 1;
      else
         count_int <= count_int - 1;
      end if;
   end if;
end process;

LED(3 downto 0) <= count_int;
LED(7 downto 4) <= (others => '0');

end Behavioral;


und du musst dafür sorgen das das signal DIRECTION bekannt ist.
vllt. nimmst du besser ein signal an dem ein schalter angeschlossen ist.

hintergrund des ganzen ist das du mit dem vhdl design abstrakt (ohne 
"kenntnis" des verwendeten fpgas) beschreibst was du willst. die 
anbindung an die "hardware" erfolgt über diese pin-zuweisung.
somit bist du einfach in der lage das design von fpga zu fpga zu tragen 
und kannst bei jeder portierung auf die unterschiedlichen pinne des 
fpgas "gleich" reagieren.
sprich dein design kann in einem qfp144, cp132, ft256 laufen und du 
änderst dazu nur dein ucf file ab. thats it.

gruß
rene

von Richard B. (rbrose)


Lesenswert?

Moment, du hast was falsch verstanden.
Von wo weiss mein ISE das LED<x> eine gewisse LOC ist?
Diese Informationen habe ich aus dem Spartan3E Starter Kit User Manual 
herausgelesen.

Er findet bei mir aber die Pins E12 ... nicht oder Sie sind besetzt.
Das heißt ich muss einen falchen FPGA drin haben.
Ist auf dem Spartan3E Starter Kit ein qfp144, cp132 oder ft256 drauf?

von TheMason (Gast)


Lesenswert?

aso meinst du das .... :-)

du musst ein ucf-file erstellen (entweder mit einem text-editor oder mit 
dem pace-tool welches beim ise dabei ist).
dieses ucf lädst du zu deinem projekt und damit hast du die verbindung 
zwischen deinem design und den hardware-pins.
wichtig ist halt nur das du alle pins in deiner haupt-entity auch im ucf 
definiert hast. die müssen namensmässig übereinstimmen (sonst weiß ise 
nix damit anzufangen)

gruß
rene

von TheMason (Gast)


Lesenswert?

nachtrag :

>Ist auf dem Spartan3E Starter Kit ein qfp144, cp132 oder ft256 drauf?

du kannst dein vhdl-design ja auch für andere fpga's (oder denselben, 
aber mit anderer gehäuseform) synthetisieren.

auf deinem board ist (laut deiner beschreibung oben) ein spartan3e-500 
mit der gehäuseform CP132 drauf.

von Richard B. (rbrose)


Lesenswert?

Mhhh ich glaube du hast mich immer noch nicht verstanden.
Im pace-tool kann ich die Pins E12,E11 usw. nicht auswählen. Mit anderen 
geht es Problem los und es funktioniert.

Aber ich brauche diese PINS weil es auf dem Spartan3E Starter Kit Board 
schon so fest ist.


Ist auf dem Spartan3E Starter Kit ein qfp144, cp132 oder ft256 drauf?
Ich habe cp132 Ausgewähl ... ist das der Fehler? Was ist da drauf?

von TheMason (Gast)


Lesenswert?

>Im pace-tool kann ich die Pins E12,E11 usw. nicht auswählen. Mit anderen
>geht es Problem los und es funktioniert.

ok. jetzt verstanden.

>Ist auf dem Spartan3E Starter Kit ein qfp144, cp132 oder ft256 drauf?
>Ich habe cp132 Ausgewähl ... ist das der Fehler? Was ist da drauf?


also wenn es das ist :

http://www.xilinx.com/products/devkits/HW-SPAR3E-SK-US-G.htm

dann steht in der produktbeschreibung (bei key features) :

Spartan-3E FPGA (XC3S500E-4FG320C)

und das wäre ein FG302 (wenns diese gehäuseform denn gibt). dann kannst 
du evtl. keinen pin e12/e13 anwählen weil der beim CP132 entweder nicht 
vorhanden, oder aber ein versorgungs-pin ist.

von Richard B. (rbrose)


Lesenswert?

Es ist ein FG320 Gehäuse :-) Jeppi jetzt passt es und die Pins sind 
frei.
Wie kommst du auf FG302 ? Zahlendreher?

Danke dir!!

von TheMason (Gast)


Lesenswert?

>Wie kommst du auf FG302 ? Zahlendreher?

jup!

genauso wie beim rezitieren von E11,E12 (hab da kurzerhand e12/e13 draus 
gemacht) ....

na ja ... wer schnell tippt, tippt sich schnell ver ...

von Richard B. (rbrose)


Lesenswert?

Und schon die nächste Frage.

Momentan müssten meine LEDS mit 25Mhz/4 = 6,25 Mhz blinken. Richtig?
Das sieht natürlich kein Mensch.
Wie kann ich den Clock Takt Teilen? So das die LEDs in 1sec. Takt 
blinken?

Ich könnte mir denken man macht sich paar Variablen und zählt sie hoch.

Aber wie macht man es richtig?

von TheMason (Gast)


Lesenswert?

>Ich könnte mir denken man macht sich paar Variablen und zählt sie hoch.

ziemlich genau so.

ich mach sowas meist mit signalen :

entity ...
 port (
 ...
  blink_out : out std_logic;
 ...
end ...

architecture xxx of yyy
  signal counter : std_logic_vector (24 downto 0);

begin
  if clk'event and clk = '1' then
    counter <= counter + '1';
    blink_out <= counter (24);
  end if;
end xxx

ist nur grob skizziert. aber so sollte es funktionieren (wenn sich nicht 
wieder tipp oder logikfehler eingeschlichen haben).
im endeffekt ist das ein 25 bit zähler der sein 25. bit ausgibt.
2^25 sind ca 32 millionen, d.h. deine led dürfte etwas langsamer als 1 
sek. blinken.

gruß
rene

von Richard B. (rbrose)


Lesenswert?

Ok nur zum Verständnis, habe ja erst heute FPGA und VHDL Angefangen zu 
lernen.

signal counter : std_logic_vector (24 downto 0);
ist also so zu sagen:
0000000000000000000000000

blink:out wird immer das 25 Bit zugewiesen ... also immer 0 bis es 
irgenwann 1111111111111111111111111 ist ... richtig?

Kann ich auf sowas machen in VHDL:

if counter = '25000000' then
   blink_out <= '1';
end if;


Geht das?

von TheMason (Gast)


Lesenswert?

>blink:out wird immer das 25 Bit zugewiesen ... also immer 0 bis es
>irgenwann 1111111111111111111111111 ist ... richtig?


fast ... nur das es nicht 1111111111111111111111111 sondern 
1000000000000000000000000 ist.

und bleibt bis 1111111111111111111111111 auf 1. danach sind ja alle bits 
wieder 0, und das 25. bit ebenfalls ...

>Kann ich auf sowas machen in VHDL:

>if counter = '25000000' then
>   blink_out <= '1';
>end if;

prinzipiell richtig (weiß allerdings nicht wie die syntax für 
dezimalzahlen bei signalen in vhdl aussieht) es fehlen allerdings noch 2 
sachen :

- das rücksetzen des zählers
- das toggeln der led (sonst bleibt die led dauerhaft auf 1).

das würde so gehen :

if counter = '25000000' then
  counter <= (others => '0');
  blink_out <= not blink_out;
end if;

allerdings braucht man noch ein zwischensignal für blink_out (da 
blink_out ja "nur" als ausgangssignal, und nicht als flip-flop 
existiert, und ise von einem "nur-ausgangs" signal nicht "lesen" kann 
[is doof erklärt, mir fällt aber nichts besseres ein]).
sieht dann so aus :

architecture ...
  signal blink_int : std_logic;
  ...
begin

  if counter = '25000000' then
    counter <= (others => '0');
    blink_int <= not blink_int;
    blink_out <= blink_int;
  end if;


end ...;

von Richard B. (rbrose)


Lesenswert?

Ahh verstehe danke!

Mmhhh ich glaube ich werden noch viel Spass mit FPGA und VHDL haben :-)

von Richard B. (rbrose)


Lesenswert?

Ich habe folgenden VHDL Source:
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
---- Uncomment the following library declaration if instantiating
7
---- any Xilinx primitives in this code.
8
--library UNISIM;
9
--use UNISIM.VComponents.all;
10
11
entity counter is
12
    Port ( CLOCK : in  STD_LOGIC;
13
           RICHTUNG : in  STD_LOGIC;
14
           LED : out  STD_LOGIC);
15
end counter;
16
17
architecture Behavioral of counter is
18
19
signal count_int : STD_LOGIC_VECTOR (24 downto 0) := "0000000000000000000000000";
20
21
begin
22
23
process (CLOCK)
24
begin
25
  if CLOCK='1' and CLOCK'event then
26
    if RICHTUNG='1' then
27
      count_int <= count_int + 1;
28
    else
29
      count_int <= count_int - 1;
30
    end if;
31
  end if;
32
end process;
33
LED <= count_int (24);
34
35
end Behavioral;

Die LED blikt jetzt auch ganz schön. Aber in welchem Takt blinkt die 
genau?
Müsste etwas schneller als 1 Sekunde sein ... ca 500 millisekunden.

Aber wie rechne ich das genau nach? Ich benutze ein Spartan 3E Starter 
Kit. Das hat einen 50Mhz Clock.

von Da M. (damicha)


Lesenswert?

Hallo.

Das lässt sich wie folgt bestimmen:
Wäre Dein Count Vektor nur ein Bit breit, so würdest Du den Takt 
halbieren (50MHz/2^1), den mit jedem Takt ändert sich der Zustand des 
Bits und der LED von 0 nach 1 und umgekehrt. Wäre der Vektor zwei Bit 
breit würde der Takt geviertelt werden (50MHz/2^2), bei drei Bit 
geachtelt (50MHz/2^3), usw.
Dein Vektor ist 25 Bit breit also teilst Du den 50MHz Takt durch 2^25. 
So sollte die LED laut meinem Taschenrechner mit einer Periorde von 
1.49Hz (0.57 Sekunden) blinken.

Gruß DaMicha.

von Richard B. (Gast)


Lesenswert?

Aha ... gibt es irgendwo ein gutes tutorial zum timing?

Da ich im Source Code
1
 if CLOCK='1' and CLOCK'event then

nur bei Positiver flanke die Zählung mache müssten hier nicht schon 50/2 
= 25Mhz sein?

Oder ist ein voller takt von 1 bis 1 ? Das heißt ich könnte die 50Mhz 
verdoppelt wenn ich 1 und 0 hochzählen würde, also 100Mhz?

Irgendwie stehe ich auf dem Schlauch.

von Da M. (damicha)


Lesenswert?

> Da ich im Source Code
>
1
 if CLOCK='1' and CLOCK'event then
>
> nur bei Positiver flanke die Zählung mache müssten hier nicht schon 50/2
> = 25Mhz sein?
Nein.

> Oder ist ein voller takt von 1 bis 1 ?
Ja genau.
Eine Taktperiode ist die Dauer zwischen zwei aufeinander folgenden 
steigenden Flanken (oder fallenden Flanken).
Das ist das Gleiche wie bei einer Sinusschwingung und deren Peride bzw. 
Frequenz.

> Das heißt ich könnte die 50Mhz
> verdoppelt wenn ich 1 und 0 hochzählen würde, also 100Mhz?
Nein.
Du könntest sowohl bei der steigenden und bei der fallenden Flanke etwas 
tun. Damit erhöht sich die Frequenz jedoch nicht - nur die Anzahl der 
Operation pro Taktperiode. Davon ist aber im Normalfall abzuraten und es 
ist auch meistens nicht nötig.

>
> Irgendwie stehe ich auf dem Schlauch.
http://de.wikipedia.org/wiki/Taktsignal
http://de.wikipedia.org/wiki/Periode_(Physik)

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.