Forum: FPGA, VHDL & Co. Wire fixed auf GND


von Stefan (Gast)


Lesenswert?

Hallo Forum,

ich möchte eine entity bauen, die folgende Aufgabe erfüllen soll: durch 
ein Start-Impuls (START) sollen an einem Ausgang (IMPULSE_OUT) die 
nächsten 250 Clock-Pulse ausgegeben werden. Nach diesen 250 Pulsen geht 
der Ausgang READY auf logisch "1" und verweilt in diesem Zustand bis der 
nächste START-Impuls kommt.
1
entity ClockProvider is
2
   port ( CLK : in std_logic;
3
          START : in std_logic;
4
          RESET : in std_logic;
5
          READY : out std_logic;
6
          IMPULSE_OUT : out std_logic);
7
end ClockProvider;
8
9
architecture Behavioral of ClockProvider is
10
   signal cnt : integer range 0 to 249 := 0;
11
   signal isrunning : std_logic;
12
begin
13
   ClockCounter : process (CLK)
14
      variable tmp : std_logic := '0';
15
      begin
16
         if ((CLK = '1') AND (CLK'event)) then
17
            READY <= '0';
18
            if (RESET = '1') then
19
               isrunning <= '0';
20
            else
21
               if ((START = '1') AND (isrunning = '0')) then 
22
                  isrunning <= '1';
23
                  tmp := '1';
24
               else
25
                  if ((isrunning = '1') OR (tmp = '1')) then
26
                     tmp := '0';
27
                     if (cnt < 250) then
28
                        cnt <= cnt + 1;
29
                     else
30
                        cnt <= 0;
31
                        isrunning <= '0';
32
                        READY <= '1';
33
                     end if;
34
                  end if;
35
               end if;
36
            end if;
37
         end if;
38
   end process;
39
40
   ClockGenerator: process (CLK, isrunning)
41
      begin
42
         IMPULSE_OUT <= CLK AND isrunning;
43
   end process;
44
end Behavioral;

Zwei Fragen:
1. Ist das irgendwie einfacher /eleganter zu lösen?
2. Wenn ich die Synthese durchführe und mir das RTL-Schematic anschaue, 
dann ist das Signal READY fest mit GND verbunden!? Die Simulation zeigt 
aber das von mir gewünschte Verhalten

Wäre nett, wenn mit jemand einen Tipp und das Wochenende retten könnte! 
:-)

Viele Grüße
Stefan

von jochen (Gast)


Lesenswert?

Hallo Stefan

Also ich verstehe den Sinn von tmp nicht. Das müsste auch ohne gehen.

Weiter würde ich die zuweisung nicht in einem Prozess machen.
IMPULSE_OUT <= CLK AND isrunning;

Du solltest ausserdem cnt initialisieren.

Und: cnt ist immer < 250. Also wird READY auch nie auf '1' gesetzt.

von Christian R. (supachris)


Lesenswert?

Was soll eigentlich damit angesteuert werden? Weitere Schaltung im FPGA? 
Dann sollte man das tunlichst nicht so machen, denn das gibt einen gated 
Clock, und das mögen FPGA interne Register nicht so. Lieber über Clock 
Enable arbeiten.

von Stefan (Gast)


Lesenswert?

Hallo Jochen,

ja Du hast recht: es geht auch ohne tmp.

cnt sollte aber doch mit der Zeile
1
signal cnt : integer range 0 to 249 := 0;
initialisiert sein!?

Gruß
Stefan

von Stefan (Gast)


Lesenswert?

Hallo Christian,

ja das clock-Signal sollte eigentlich weiter verteilt werden!

VHDL ist noch relativ neu für mich und ich muss noch viel lernen.

Ich werde meine Entity auf Clock-Enable-Signal umbauen.

Gruß
Stefan

von jochen (Gast)


Lesenswert?

So wie ich es gelernt habe funktioniert eine solche initalisierung nur 
in der Simulation:
1
signal cnt : integer range 0 to 249 := 0;

ich würde sowas vorschlagen:
1
if ((START = '1') AND (isrunning = '0')) then 
2
isrunning <= '1';
3
cnt <= 0;
4
...

und mach den range bis 250.

von Christian R. (supachris)


Lesenswert?

Die Initialisierung bei der Deklaration funktniert mittlerweile bei den 
Sythesizern auch. Eigentlich schon seit Jahren. Xilinx kann es 
definitiv, soweit ich weiß, Lattice und Altera ebenso. Den Aufwand kann 
man sich also 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.