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
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.STD_LOGIC_ARITH.ALL;
4
useIEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
---- Uncomment the following library declaration if instantiating
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.
>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
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?
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
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.
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?
>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.
>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 ...
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?
>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
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?
>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 ...;
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.
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.
Aha ... gibt es irgendwo ein gutes tutorial zum timing?
Da ich im Source Code
1
ifCLOCK='1'andCLOCK'eventthen
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.
>> 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/Taktsignalhttp://de.wikipedia.org/wiki/Periode_(Physik)
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.