Forum: FPGA, VHDL & Co. großen Counter simulieren


von Peter (Gast)


Lesenswert?

Hallo alle zusammen.

Ich habe mir über einen Counter nen 50MHz Takt auf 1MHz, 0,5MHZ herunter 
getaktet.

Mein Problem besteht darin, diesen Code zu simulieren, da das sehr sehr 
lage dauert.

Kann mir da jemand nen Tipp geben, wie ich da herangehen kann?

MFG
Peter

von Der Besucher (Gast)


Lesenswert?

zeig doch einfach mal, wie du den teiler beschrieben hast.

von Peter (Gast)


Lesenswert?

...
signal counter : std_logic_vector (0 to 43);

begin
process(reset,clk)
begin

   if reset='0' then
      counter <= "00000000000000000000000000000000000000000000";
    elsif rising_edge(clk)then
      counter <= counter +1;

end if;
end process;
Q_0_1s <= counter(15) and counter(13) and counter(12) and counter(11) 
and counter(10) and counter(9) and counter(7) and counter(5) and 
counter(4) and counter(3) and counter(2);

Hab so einen großen Vector, damit ich auch 20s zeitverzögern kann..

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


Lesenswert?

> (0 to 43)
Das kann aber ins Auge gehen...
> "00000000000000000000000000000000000000000000"
Wo ist denn hier dein Bit 0 und welches das Bit 43? LSB? MSB?
> Q_0_1s <= counter(15) and counter(13) and counter(12)....


Wenn du 20s simulieren willst, dauert das.
Da beißt keine Maus keine Faden ab ;-)


BTW:
Mach Zähler besser mit Integer, das sieht schöner aus.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
:
5
signal cnt : integer range 0 to 20*50000000; -- 20 sec bei 50MHz
6
signal counter : std_logic_vector (43 downto 0); -- DOWNTO: so werden Vektoren definiert
7
:
8
begin
9
process(reset,clk)
10
begin
11
   if reset='0' then
12
      cnt <= 0;
13
   elsif rising_edge(clk)then
14
      cnt <= cnt+1;
15
   end if;
16
end process;
17
:
18
counter <= std_logic_vector(unsigned(cnt,44));
19
Q_0_1s <= counter(15) and counter(13) and counter(12) and counter(11)
20
and counter(10) and counter(9) and counter(7) and counter(5) and
21
counter(4) and counter(3) and counter(2);

von Peter (Gast)


Lesenswert?

OK. So genau hab ich das noch garnicht betrachtet. Danke.



Was macht eigentlich "std_logic_vector(unsigned(cnt,44)"?

Ich nehme an du machst ein casting um von Integer auf std_logic__vector 
zu

kommen?!

Wie frage ich dann ein Signal bei 20sec.,oder 1 sec. ab?

MFG

von Peter (Gast)


Lesenswert?

Ah OK!!

Hab gerade mitgeschnitten..!!!


Danke dir für deine Hilfe!!!:-)


MFG

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


Lesenswert?

> std_logic_vector(unsigned(cnt,44)
Oh, ein Typo :-/

Richtig heißen muß das
1
 ... std_logic_vector(to_unsigned(cnt,44));
to_unsigned ist in der Standdard-Lib numeric_std definiert.
Du solltest die herstellerabhängigen signed bzw, unsigned Libs nicht 
verwenden.

von Der Besucher (Gast)


Lesenswert?

Eine Frage: Sind 50 MHz Taktfrequenz notwendig?
Wenn die restliche Schaltung mit geringerer Clockfrequnz auskommt, 
solltest du sie verringern. Hat normalerweise auch Vorteile in der 
Leistungsaufnahme und im EMV-Verhalten.
Wenn es nicht möglich ist, kannst du in der Simulation tricksen, um die 
20 Sekunden abzukürzen. Einige Simulatoren gestatten das direkte 
Verändern von Signalwerten (forcen). Da kann man z.B. den counter 
einfach mal während der Simulation hochsetzen und somit viel Zeit 
sparen.

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.