Forum: FPGA, VHDL & Co. CLK test bench


von Michael K. (manhunt)


Lesenswert?

Hallo

mit folgendem Prozess würde ich gernen meinen sck für meinen spi slave 
erzeugen leider wird der prozess nur einmal ausgeführt danach bleibt er 
ruhig, wo liegt mein denkfehler wie müsste ich es schreiben das er 
ständig ausgeführt wird?(und sonst wartet)
1
  sck_spi_o_process :process
2
  begin
3
    sck_s <= '1';
4
    wait until sel_sck_en_s  =  '1' and ncs_i =  '0';
5
      sck_s <= '0';
6
      wait for sck_spi_o_period/2;
7
      sck_s <= '1';
8
      wait for sck_spi_o_period/2;
9
   end process;

lg Mike

von Duke Scarring (Gast)


Lesenswert?

Michael K^3 schrieb:
> wait until sel_sck_en_s  =  '1' and ncs_i =  '0';
Sind denn diese Bedingungen immer erfüllt?

Duke

von Michael K. (manhunt)


Lesenswert?

ja sind sie

von berndl (Gast)


Lesenswert?

da fehlt loop... end loop; wait;

von Anderl (Gast)


Lesenswert?

>wait until sel_sck_en_s  =  '1' and ncs_i =  '0';

Was genau möchtest du denn damit ausdrücken?


VG, Anderl

von Michael K. (manhunt)


Lesenswert?

Ich möchte damit ausdrücken das die Clock generierung nur bei Chipselect 
und einem Enable aktiv wird.

die loop hilft nichts ich verstehe auch nicht warum den prinzipell 
sollte der Prozess ja ständig aufgerufen werden ohne Senitivityliste.

lg Michael

von Duke Scarring (Gast)


Lesenswert?

Michael K^3 schrieb:
> sollte der Prozess ja ständig aufgerufen werden ohne Senitivityliste.
Es könnte sein, das er bei Deinem ersten wait auf eine Flanke wartet.

Schreibs mal so (ohne process, aber sck_s initialisiert):
1
  sck_s <= not sck_s after sck_spi_o_period/2 when sel_sck_en_s = '1' and ncs_i = '0';

Duke

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


Lesenswert?

Duke Scarring schrieb:
> Es könnte sein, das er bei Deinem ersten wait auf eine Flanke wartet.
Richtig: wait wartet auf irgend eine Signaländerung ... :-o

Michael K^3 schrieb:
> wo liegt mein denkfehler wie müsste ich es schreiben das er
> ständig ausgeführt wird?(und sonst wartet)
Ich würde das mal so probieren:
1
  sck_spi_o_process :process
2
  begin
3
    sck_s <= '1';
4
    if (sel_sck_en_s='1' and ncs_i='0') then
5
      sck_s <= '0';
6
      wait for sck_spi_o_period/2;
7
    end if;
8
    sck_s <= '1';
9
    wait for sck_spi_o_period/2;
10
  end process;
Der Nachteil: du hast eine Granulatität von sck_spi_o_period/2 wenn die 
Taktbedingungen nicht erfüllt sind...
Der Vorteil: dein Takt wird nicht "mittendrin" abgebrochen...

von Michael K. (manhunt)


Lesenswert?

Hallo

Lothar Miller schrieb:
> Der Nachteil: du hast eine Granulatität von sck_spi_o_period/2 wenn die
>
> Taktbedingungen nicht erfüllt sind...

das ist mehr oder weniger nicht ganz akzeptabel.

Allerdings habe ich es jetzt so gelöst.
1
  sck_spi_o_process :process
2
  begin
3
    sck_s <= '1';
4
    if (sel_sck_en_s='1' and ncs_i='0') then
5
      sck_s <= '0';
6
      wait for sck_spi_o_period/2;
7
    sck_s <= '1';
8
    wait for sck_spi_o_period/2;
9
   else
10
    wait on sel_sck_en_s, ncs_i;
11
   end if;
12
  end process;

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.