Forum: FPGA, VHDL & Co. Merkwürdiges Verhalten mit diesem VHDL-Programm.


von Peter B. (funkheld)


Lesenswert?

Hallo, guten Tag.
Ich habe ein merkwürdiges verhalten mit diesme Programm am DE1-Board.
Es funktioniert soweit. Es blinkt die LED0.
Aber beim DE1-Board gehen dann die RXD, die TXD und bei den 
4-Hex-Anzeigen sind alle Balken angeschaltet.

Was habe ich falsch gemacht?

Danke.
GRuss

-------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity blink1 is
    Port ( clk : in  STD_LOGIC;
           led : out  STD_LOGIC);
end blink1;

architecture Behavioral of blink1 is
signal c     : integer range 0 to 24999999 := 0; -- 0,5s bei 50MHz fosc
signal x     : std_logic:= '0';

begin
   process begin
      wait until rising_edge(clk); -- warten bis zum nächsten Takt
      if (c<24999999) then         -- 0…24999999 = 25000000 Takte = 1/2 
Sekunde bei 50MHz
          c <= c+1;                -- wenn kleiner: weiterzählen
      else                         -- wenn Zählerende erreicht:
          c <= 0;                  -- Zähler zurücksetzen
          x <= not x;              -- und Signal x togglen
      end if;
   end process;
   led <= x;                       -- Signal x an LED ausgeben
end Behavioral;
-------------------------------

von lulu (Gast)


Lesenswert?

Peter Bierbach schrieb:
> Aber beim DE1-Board gehen dann die RXD, die TXD
Was bedeutet das?

Peter Bierbach schrieb:
> Port ( clk : in  STD_LOGIC;
>            led : out  STD_LOGIC);

Clock als Eingang
Ein Signal als Ausgang.
Was soll dann deiner Meinung nach die 7 Segment Anzeige tun?

Je nach dem, was du am FPGA eingestellt hast, können die Leitungen mit 
einem Pull-up auf logisch '1' gezogen sein. Wie genau das bei Altera 
aussieht weiß ich nicht, ich bin von der Xilinx Welt.


Deinen weiteren Beiträgen zu Folge befindest du dich ganz, ganz am 
Anfang. Ich würde dir sehr Nahe legen ein Buch zur Hand zu nehmen. 
Meistens ist das gut und deutlich erklärt.

Btw. Bei VHDL handelt es sich um KEIN Programm, sondern um eine 
HARDWAREBESCHREIBUNG.
Diese Unterscheidung ist sehr wichtig, um das Verhalten eines FPGAs zu 
verstehen!

Grüße

von Peter B. (funkheld)


Lesenswert?

Jup danke.

Darum findet meine Programmlogik kein Ziel.
Ich suche ein gebrauchtes Buch für Anfänger für VHDL.

Danke.
Gruss

von Peter B. (funkheld)


Lesenswert?

Noch eine Frage dazu:
Hier blinken die beiden LED0/1.

Warum sind da die Hexzahlen aus und die LED für TXD und RXD?
-------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity blink1 is
    Port ( clk : in  STD_LOGIC;
           led : out  std_logic);
end blink1;

architecture Behavioral of blink1 is
signal c     : integer range 0 to 24999999 := 0; -- 0,5s bei 50MHz fosc
signal x     : std_logic:= '0';

begin
   process begin
      wait until rising_edge(clk); -- warten bis zum nächsten Takt
      if (c<24999999) then         -- 0…24999999 = 25000000 Takte = 1/2 
Sekunde bei 50MHz
          c <= c+1;                -- wenn kleiner: weiterzählen
      else                         -- wenn Zählerende erreicht:
          c <= 0;                  -- Zähler zurücksetzen
          x <= not x;              -- und Signal x togglen
      end if;
   end process;
   led <= x;                       -- Signal x an LED ausgeben
end Behavioral;
--------------------------------

Danke.
Gruss

von Peter B. (funkheld)


Lesenswert?

Hmm.. ein falsches Programm oben drin 16.04.2014 21:19, dieses ist 
richtig
----------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity blink is
    port (
        clk : in  std_logic;
        led : out std_logic_vector (1 downto 0)
        );
end entity blink;

architecture blink_arch of blink is

    signal state          : std_logic_vector(1 downto 0);
    signal terminal_count : std_logic;
    signal count          : unsigned(24 downto 0) := (others => '0');

begin

    led <= state;

    process
    begin
        wait until rising_edge(clk);
        count <= count + 1;
        if count > 30000000 then
            terminal_count <= '1';
            count          <= (others => '0');
        else
            terminal_count <= '0';
        end if;
    end process;

    process
    begin
        wait until rising_edge(clk);

        if terminal_count = '1' then
            case state is
                when "01" =>
                    state <= "10";
                when "10" =>
                    state <= "01";
                when others =>
                    state <= "01";
            end case;
        end if;

    end process;

end architecture blink_arch;
------------------------------------------

von lulu (Gast)


Lesenswert?

Peter Bierbach schrieb:
> Warum sind da die Hexzahlen aus und die LED für TXD und RXD?

Ich will dir nicht auf den Schlipps treten, aber bei diesem Satz fehlt 
schon wieder irgendwie was?!

Peter Bierbach schrieb:
> Hmm.. ein falsches Programm

Es ist kein PROGRAMM!!!! Nenn es Design, Hardwarebeschreibung, Logik, 
... aber nicht Program!

von R. F. (rfr)


Lesenswert?

Du hast in deinem UCF-file eine Zuordnung eingegeben, die die Ausgänge 
des FPGA den angeschlossenen Bauelementen zuordnet. Möglicherweise ist 
hier der Fehler.

Gruss

Robert

von Peter B. (funkheld)


Lesenswert?

Danke.
Aber wo finde ich die Zuordnung bei Quartus2 wenn ich ein Projekt 
erstelle?

Gruss

von Mike (Gast)


Lesenswert?

Peter Bierbach schrieb:
> Danke.
> Aber wo finde ich die Zuordnung bei Quartus2 wenn ich ein Projekt
> erstelle?
>
> Gruss

Unter Assignments -> Pins. Dazu musst du aber in den Schaltplan schauen. 
Am Anfang ist es aber deutlich einfacher wenn du dir das UCF-File von 
einem der Beispielprojekte nimmst.

Noch sehr viel besser wäre es allerdings wenn du einfach einmal das "PDF 
Tutorial for VHDL Users" durcharbeiten würdest (findest du unter Help). 
Dort ist eigentlich alles erklärt.

Das mit den leuchtenden LEDs könnte auch an den Einstellungen für 
unbenutzte Pins liegen. Normalerweise ist sind die auf Eingang mit Weak 
Pullups konfiguriert. Das kann man bei den Einstellungen für das Device 
ändern. Hier einfach herumzuspielen könnte allerdings im schlimmsten 
Fall zu Beschädigungen auf dem Board führen, z.B. wenn Ram und FPGA 
unterschiedliche Pegel auf ein Pin geben (-> Buskonflikt). Besser wäre 
es die unbenutzte Peripherie im Toplevel zu deaktivieren.

von Christoph Z. (christophz)


Lesenswert?

Peter Bierbach schrieb:
> Darum findet meine Programmlogik kein Ziel.
> Ich suche ein gebrauchtes Buch für Anfänger für VHDL.

Für Einsteiger ein recht gutes Buch ist "VHDL Synthese" von J. Reichardt 
und B Schwarz. Ist eines der wenigen deutschsprachigen Bücher und führt 
dich langsam an die Denkweise von Hardwarebeschreibungssprachen heran.

Für den Einstieg reicht eine eine der älteren Auflagen aus, die findet 
man auch gebraucht.

von Peter B. (funkheld)


Lesenswert?

Jup, danke für die Info.


Gruss

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.