Forum: FPGA, VHDL & Co. Mit einer Prozedur seriel Zeichen senden


von noips (Gast)


Lesenswert?

Hallo zusammen,

ich möchte den VHDL-Code zum Senden von eines Strings über UART in eine 
Prozedur "kapseln". Darin wird aus einem String per hochgezähltem Index 
(1 bis String'length) die Zeichen in TX-Schieberegister des Uart-Moduls 
übergeben, sobald das vorhergehende Zeichen weggeschickt wurde. Die 
Prozedur sieht so aus:
1
  procedure SEND_UART (signal STR      : in string;
2
             signal tx_data_s  : out std_logic_vector(7 downto 0);
3
             signal tx_busy_s  : in std_logic;
4
             signal tx_start_s  : out std_logic;
5
             signal CLK_in    : in std_logic;
6
             signal var_cnt    : out integer) is
7
  variable cnt : integer := 1;
8
  begin
9
  var_cnt <= cnt;
10
  --if(CLK'event and CLK = '1') then
11
  wait until rising_edge(CLK);
12
    if tx_busy_s = '0' then
13
      --tx_data_s <= STR(cnt);
14
      tx_data_s <= std_logic_vector(to_unsigned(character'pos(STR(cnt)),8)); -- nächstes Zeichen in Schieberegister
15
      tx_start_s <= '1'; -- Sendevorgang durch UART auslösen
16
      if cnt /= STR'length then
17
        cnt := cnt + 1;
18
      else
19
        cnt := 0;
20
      end if;
21
    -- end if;
22
    -- if tx_start_s = '1' then
23
    else
24
      tx_start_s <= '0';
25
    end if;
26
  --end if;
27
  end SEND_UART;

Sind denn Prozeduren überhaupt für so etwas gedacht?

Wenn ich jetzt die Prozedur "aufrufe", wird ständig nur das erste Byte 
des Strings gesendet. Der Zähler cnt wird nicht hochgezählt. Was mache 
ich denn falsch? Oder ist es grundsätzlich eine schlecht Idee, so etwas 
mit Prozedur zu lösen.

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


Lesenswert?

noips schrieb:
> Wenn ich jetzt die Prozedur "aufrufe", wird ständig nur das erste Byte
> des Strings gesendet.
Wie stellst du das fest?

> Der Zähler cnt wird nicht hochgezählt.
Zeig mal, von wo du die Prozedur aufrufst...

> Sind denn Prozeduren überhaupt für so etwas gedacht?
Nein, nicht für die Synthese.
Aber für die Simulation sollte das schon gehen...

von noips (Gast)


Lesenswert?

>> Wenn ich jetzt die Prozedur "aufrufe", wird ständig nur das erste Byte
>> des Strings gesendet.
> Wie stellst du das fest?

Simulation.

> Zeig mal, von wo du die Prozedur aufrufst...

1
  process (CLK) begin
2
  --if(CLK'event and CLK = '1') then
3
    if trig = '1' then
4
      SEND_UART (STR => tx_string, tx_data_s => tx_data_s, tx_busy_s => tx_busy_s, tx_start_s => tx_start_s, CLK_in => CLK, var_cnt => var_cnt);
5
    end if;
6
  --end if;
7
  end process;


> Nein, nicht für die Synthese.
Dann ist es ein Fehlversuch, denn ich wollte den Code synthetisieren.

von noips (Gast)


Lesenswert?

>> Sind denn Prozeduren überhaupt für so etwas gedacht?
> Nein, nicht für die Synthese.
> Aber für die Simulation sollte das schon gehen...

Wozu sind die Prozeduren gut in der Synthese?

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


Lesenswert?

noips schrieb:
> Wozu sind die Prozeduren gut in der Synthese?
Für kombinatorische Beschreibungen, die mehr als 1 Wert ändern sollen...
Auf jeden Fall sind das keine "Unterprogramme", die erst beendet werden, 
wenn sie "fertig" sind. Sowas gibt es in der Hardware nicht.

Funktionen wie z.B. rising_edge() sind ja auch für einiges gut...

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

noips schrieb:
> Wenn ich jetzt die Prozedur "aufrufe", wird ständig nur das erste Byte
> des Strings gesendet.

Dazu brauchst du auch in der Prozedur eine Schleife, die gibt es aber 
nicht in deiner Prozedur. Und wie Lothar schon sagte, wird es mit 
Prozeduren in der Synthese schwer. Dazu brauchst du dann einen Takt und 
eine FSM.

Tom

von Uwe (Gast)


Lesenswert?

Und auch das Signal String ist glaub ich nicht wirklich gut für die 
Synthese.

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


Lesenswert?

Uwe schrieb:
> Und auch das Signal String ist glaub ich nicht wirklich gut für die
> Synthese.
Das wird eher halbherzig unterstützt, genauso wie auch das Attribut 
'pos...

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.