Forum: FPGA, VHDL & Co. Cyclone II Stromverbrauch steigt drastisch an


von Marko ⚠. (mos6502) Benutzerseite Flattr this


Angehängte Dateien:

Lesenswert?

Ich hab mir eins dieser EP2C5 Mini Boards aus China gekauft:

http://land-boards.com/blwiki/index.php?title=Cyclone_II_EP2C5_Mini_Dev_Board

Darauf ist ab Werk ein Demoprojekt installiert: die drei LEDs blinken im 
Takt von ca. 0,5Hz. Der Stromverbrauch liegt dabei zwischen 30mA (LEDs 
aus) und 34mA (LEDs an). Das Board wird von einem Labornetzteil mit 5V 
versorgt.

Jetzt habe ich in Quartus ein kleines Testprojekt erstellt:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
entity testboardProj is
5
  Port (PB : in STD_LOGIC;
6
      LED0 : out STD_LOGIC;
7
      LED1 : out STD_LOGIC;
8
      LED2 : out STD_LOGIC);
9
end testboardProj;
10
11
architecture Behavioral of testboardProj is
12
begin
13
  LED0 <= PB;
14
  LED1 <= PB;
15
  LED2 <= PB;
16
end Behavioral;

Dieses funktioniert auch einwandfrei. Solange ich den Taster drücke 
leuchten die LEDs. Das Problem ist aber: sobald ich das Projekt auf den 
FPGA lade steigt die Stromaufnahme auf über 200mA! Genauer gesagt: 205mA 
wenn die LEDs aus sind, 209mA wenn der Taster gedrückt ist und die LEDs 
leuchten.

Wenn ich den Strom aus- und wieder einschalte, also der Werks-Democode 
aus dem Flash-ROM wieder geladen wird, ist die Stromaufnahme wieder bei 
30-34mA. Es liegt also offensichtlich an meinem Code.

Ich habe im Assignment Editor schon einige Einstellungen probiert (siehe 
Screenshot), brachte jedoch keinerlei Veränderung.

Hat jemand eine Idee?

von Dr. Sommer (Gast)


Lesenswert?

Sind alle Pins auf definierten Pegeln und nicht floatend, also z.B. 
auf Input mit Pull-Up/Down?

von Markus F. (mfro)


Lesenswert?

Was hast Du mit den ungenutzen Pins gemacht?

Assignments->Device->Device and Pin Options...->Unused Pins

Zu jedem Altera-Chip gibt's eine "Pin Connection Guideline", die man 
befolgen sollte. Für ungenutzte Pins steht für den Cyclone II da:

6) Make sure that unused pins are set to input tristated in the Quartus 
II software. For instructions on how to set this, refer to the Quartus 
II Handbook

gemacht?

Beitrag #5406353 wurde vom Autor gelöscht.
von Marko ⚠. (mos6502) Benutzerseite Flattr this


Lesenswert?

Markus F. schrieb:
> Was hast Du mit den ungenutzen Pins gemacht?
>
> Assignments->Device->Device and Pin Options...->Unused Pins
>
> Zu jedem Altera-Chip gibt's eine "Pin Connection Guideline", die man
> befolgen sollte. Für ungenutzte Pins steht für den Cyclone II da:
>
> 6) Make sure that unused pins are set to input tristated in the Quartus
> II software. For instructions on how to set this, refer to the Quartus
> II Handbook
>
> gemacht?

Das wars, Danke. Jetzt zieht er nur noch 29mA :-)

Ich hab gerade mal 1 Stunde Erfahrung mit FPGAs. Ich hab mich an dem 
Video hier orientiert:

https://www.youtube.com/watch?v=le6Jo5DpLao

Immerhin hab ich sofort gemerkt, dass er den Pull-Up nicht aktiviert hat 
und dass deswegen bei ihm der Taster nicht funktioniert ...

Die andere Frage ist, warum Quartus das nicht automatisch macht, wenn 
man man ein neues Projekt erstellt. "As output driving GND" ist IMHO 
eine wenig sinnvolle Defaulteinstellung.

: Bearbeitet durch User
von Win DJ Ammer (Gast)


Lesenswert?

Default auf was ?

Wenn's so einfach waere haetten die Hersteller das schon lange gemacht. 
Mir persoenlich waere am Liebsten gewesen : input mit internem pullup. 
Gibt's aber nicht.

von FPGAschlumpf (Gast)


Lesenswert?

> "As output driving GND" ist IMHO eine wenig sinnvolle Defaulteinstellung.

Bei einem so sparsam bestuecktem Board, sollte man es ja auch
schaffen die wenigen mit Peripherie belegten Pins im Toplevel
als Inputs oder Outputs zu belegen.

> Ich hab mich an dem Video hier orientiert:

Tja, das Datenblatt und die Schaltung waeren eine bessere Orientierung
gewesen.

Und die Pullups sind ausserdem so schwach, dass durch kapazitives
Uebersprechen durchaus noch nennenswerte Reste bei den Pins
ankommen koennen. "As output driving Ground" schafft da
deutlich uebersichtlichere Verhaeltnisse.

So wird das nix mit FPGAs.

von Marko ⚠. (mos6502) Benutzerseite Flattr this


Angehängte Dateien:

Lesenswert?

FPGAschlumpf schrieb:
> So wird das nix mit FPGAs.

Leider falsch geraten, es läuft bereits ein 6502-Computer mit BASIC und 
serieller Schnittstelle drauf.

http://searle.hostei.com/grant/Multicomp/

von Michael W. (Gast)


Lesenswert?

Das schaut interessant aus! Ist das ein selbst entwickeltes Projekt? 
Wenn Ich je mehr Zeit hätte, täte Ich das auch machen. Der C64 war mein 
erster Computer :-)

Andere Frage: Wie hast Du die Sondersymbole in Deinen Namen 
reinbekommen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus W. schrieb:
> Andere Frage: Wie hast Du die Sondersymbole in Deinen Namen
> reinbekommen?
Unicode.
ZB von dort:
https://www.weblog-deluxe.de/sonderzeichen-und-symbole-ascii-art-fur-second-life/
Herauskopiert:
Kartensymbole: ♠ ♥ ♦ ♣

von Michael W. (Gast)


Lesenswert?

Nette Spielerei :-)

von FPGAschlumpf (Gast)


Lesenswert?

Grant Searle:
"ALL other diagrams, text, software and VHDL are MY OWN WORK"

Ja, der Grant hat auch Plan von sowas.

von Markus F. (mfro)



Lesenswert?

selber ätsch ;)

von Marko ⚠. (mos6502) Benutzerseite Flattr this


Angehängte Dateien:

Lesenswert?

Cool.

Ich hab mal einen I/O Port gestrickt. Noch nicht getestet, wird aber 
korrekt synthetisiert (zumindest sieht der resultierende Schaltplan für 
mich gut aus, s. Anhang):
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
entity ioport is
5
  Port (n_reset : in STD_LOGIC;
6
    n_wr    : in  std_logic;
7
    n_rd    : in  std_logic;
8
    regSel  : in  std_logic;    -- 0=ddr, 1=output register
9
    dataIn  : in  std_logic_vector(7 downto 0);
10
    dataOut  : out  std_logic_vector(7 downto 0);
11
    portA    : inout std_logic_vector(7 downto 0)
12
); 
13
end ioport;
14
15
architecture rtl of ioport is
16
17
signal dd_reg : std_logic_vector(7 downto 0) := (others => '0');
18
signal out_reg : std_logic_vector(7 downto 0) := (others => '0');
19
20
begin
21
22
  portA(0) <= out_reg(0) when (dd_reg(0) = '1') else 'Z';
23
  portA(1) <= out_reg(1) when (dd_reg(1) = '1') else 'Z';
24
  portA(2) <= out_reg(2) when (dd_reg(2) = '1') else 'Z';
25
  portA(3) <= out_reg(3) when (dd_reg(3) = '1') else 'Z';
26
  portA(4) <= out_reg(4) when (dd_reg(4) = '1') else 'Z';
27
  portA(5) <= out_reg(5) when (dd_reg(5) = '1') else 'Z';
28
  portA(6) <= out_reg(6) when (dd_reg(6) = '1') else 'Z';
29
  portA(7) <= out_reg(7) when (dd_reg(7) = '1') else 'Z';
30
31
  process(n_rd, n_reset)
32
  begin
33
    if falling_edge(n_rd) then -- Standard CPU - present data on leading edge of rd
34
      if regSel = '1' then
35
        dataOut <= dd_reg;
36
      else
37
        dataOut <= portA;
38
      end if;
39
    end if;
40
    if n_reset = '0' then
41
      dataOut <= (others => '0');
42
    end if;
43
  end process;
44
45
  process(n_wr, n_reset)
46
  begin
47
    if rising_edge(n_wr) then -- Standard CPU - capture data on trailing edge of wr
48
      if regSel='1' then
49
        out_reg <= dataIn;
50
      else
51
        dd_reg <= dataIn;
52
      end if;
53
    end if;
54
    if n_reset = '0' then
55
      out_reg <= (others => '0');
56
      dd_reg <= (others => '0');
57
    end if;
58
  end process;
59
end rtl;

Ein SRAM müsste ich auch noch dranbasteln. Und einen VGA und PS/2 Port. 
Dann gehts erst richtig los :-)

: Bearbeitet durch User
von Markus F. (mfro)


Lesenswert?

Marko ⚠. schrieb:
1
portA(0) <= out_reg(0) when (dd_reg(0) = '1') else 'Z';
2
portA(1) <= out_reg(1) when (dd_reg(1) = '1') else 'Z';
3
portA(2) <= out_reg(2) when (dd_reg(2) = '1') else 'Z';
4
portA(3) <= out_reg(3) when (dd_reg(3) = '1') else 'Z';
5
portA(4) <= out_reg(4) when (dd_reg(4) = '1') else 'Z';
6
portA(5) <= out_reg(5) when (dd_reg(5) = '1') else 'Z';
7
portA(6) <= out_reg(6) when (dd_reg(6) = '1') else 'Z';
8
portA(7) <= out_reg(7) when (dd_reg(7) = '1') else 'Z';

Tipp: um solche Code-Wüsten zu vermeiden, hat man "generate" erfunden:
1
    gen: for i in 0 to 7 generate
2
        portA(i) <= out_reg(i) when (dd_reg(i) = '1') else 'Z';
3
    end generate;

Noch 'n Tipp: um VHDL hübsch zu formatieren, hat man hier das 'VHDL'-Tag 
erfunden ;)

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.