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.