Forum: FPGA, VHDL & Co. Falsche Hardwareausgabe mit XC2C256


von Julian (Gast)


Lesenswert?

Hallo,
Ich habe in VHDL einen Frequenzteiler programmiert, der auf der Hardware 
(Design Kit CoolRunnerII) eine LED blinken lassen sollte. Nur leuchtet 
die LED durchgehend.
1.8432MHz auf 1Hz ==> 2^n = 1.8432MHz / 1Hz ==> n ca. 21
Zählt bis auf 2097152 und gibt Übertrag

VHDL-Code

process(clk)    -- Vorteiler
begin
  if rising_edge(clk) then
    rco <= '0';
    counter <= counter + 1;
    if counter = 2097152 then
      rco <= '1';
      counter <= 0;
    end if;
    led <= rco;
  end if;
end process;

UCF - File
NET "clk"  LOC = "P38";
NET "led"  LOC = "P92"  ;

Bitte um Hilfe.
julian



von Falk (Gast)


Lesenswert?

@Julian

Tja, die LED wird nur für einen Takt (1.8432 MHz) auf '1' gesetzt, sonst 
auf '0'. Ausserdem brauchst du bei ein 2^n Zähler keinen Overflow 
explizit programmieren, das machen die alleine. Probier mal das.

process(clk)    -- Vorteiler
begin
  if rising_edge(clk) then
    counter <= counter + 1;
    if counter = 0 then
      rco <= not rco;
    end if;
    led <= rco;
  end if;
end process;


MFG
Falk

von Julian (Gast)


Lesenswert?

Hallo,
Die LED leuchtet immer noch durchgehend trotz der Änderung.


signal counter : integer range 0 to 2097152;
signal rco : std_logic;
begin
process(clk)    -- Vorteiler
begin
  if rising_edge(clk) then
    counter <= counter + 1;
    if counter = 0 then
      rco <= not rco;
    end if;
    led <= rco;
  end if;
end process;

von Rick Dangerus (Gast)


Lesenswert?

Probier mal:
1
signal counter : integer range 0 to 2097152;
2
signal rco : std_logic;
3
begin
4
process(clk)    -- Vorteiler
5
begin
6
  if rising_edge(clk) then
7
    counter <= counter - 1; -- minus statt plus
8
    if counter = 0 then
9
      counter <= 2097152;   -- neuer Startwert
10
      rco <= not rco;
11
    end if;
12
    led <= rco;
13
  end if;
14
end process;

Bei 50MHz Systemclock sollten 50Mhz/2/2097152 = 12Hz rauskommen. Das 
sollte man flimmern sehen.

Rick

von Falk (Gast)


Lesenswert?

@Julian

>Hallo,
>Die LED leuchtet immer noch durchgehend trotz der Änderung.

Hast du wirklich das neue Design compiliert und geladen? Sind die Pins 
richtig zugeordnet?
Der Code unten sollte laufen, das Einzige was noch dazwischenfunken kann 
ist deine counter Definition. Nimm mal lieber

signal counter : std_logic_vector(21 downto 0);

MFG
Falk

von Julian (Gast)


Lesenswert?

Danke für die Antworten, jetzt funktioniert's.

Komischerweise hab ich auf das Board ein paar mal das selbe Programm 
raufgeladen und auf einmal hats geklappt.
Vielleicht liegt das an der JTAG USB  Schnitstelle.

julian

von Falk (Gast)


Lesenswert?

@Julian

>Komischerweise hab ich auf das Board ein paar mal das selbe Programm
>raufgeladen und auf einmal hats geklappt.
>Vielleicht liegt das an der JTAG USB  Schnitstelle.

Nö, der CPLD braucht einen Reset, denn die Coolrunner II sind eigentlich 
FPGAs + FLASH in einem IC. Die laden beim Power-Up ganz schnell und 
heimlich ihre Konfiguration. Wenn die duch die Programmierung per JTAG 
geändert wird, muss sie aber wieder in den "FPGA im CPLD-Pelz" geladen 
werden. Sollte die Software eigentlich machen, da gibts glaub ich ein 
paar Häckchen in den Optionen.

MFG
Falk

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.