Cyclone II Stromverbrauch steigt drastisch an

Persönliche Seite #5406330
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?
Angehängte Dateien:
#5406347
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 von einem Moderator gelöscht.
Persönliche Seite #5406357
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.
Gast #5406448
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.
Persönliche Seite #5407682
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 :-)
Angehängte Dateien:
#5408487
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 ;)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren