Forum: FPGA, VHDL & Co. Process aufsplitten bzw Multisource Problem


von Manuel K. (manuel1139)


Lesenswert?

Ich habe (hatte) hier einen gößeren "process" der mir daten von einem
ADC ins SRAM geschrieben hat. Danach hab ich das ganze per Seriell an
den PC geschickt. Nun will ich da noch etwas Logik dazubauen und wollte
den schon etwas stark ausgewachsenen vorhanden process aufsplitten.

Konkret will ich jetzt einen Prozess der die Daten liest, einer der das
ganze zurückschreibt und einen der z.B. die SRAM Adresse zurücksetzt.

Nun kann ich ja aber nicht schreibend auf ein Signal aus mehreren
Prozessen zugreifen. Wie würde man das lösen? Ich würde den Prozess auf
jeden fall gerne aufsplitten oder bin ich da auf dem Holzweg?




/relevante code teile:

send_sram_data: process (clock)
begin
  if rising_edge(clock) then

  if (send_to_uart = '1') then
           send_active <= '1';
    end if;  --send_to_uart

         if ( addr_in >= 250000 ) then
     send_active <= '0';
  end if;

  if (send_active = '1')then
    --if last_byte --> send_active=0;
    -- only send when buffer not half-full (else do nothing)
  if (buffer_half_full = '0') then

  if (write_to_uart = '0') then

----problem:
  addr_in <= addr_in + '1';
------------
  --clock in an byte
  write_to_uart <= '1';
  else
    write_to_uart <= '0';
  end if;
      end if; --buffer_half_full
    end if; --send active
   end if; --risign edge
end process;



write_adc_to_sram: process(adc_clock)
begin
if rising_edge(adc_clock) then
  if (counter < "111111111111111111") then
    if (counter = "111111111111111100") then
      write_done <= '1';
    end if;

  if (write_done = '0') then
    --write data
    srwrite <= '1';
    ram_data_out <= data(8 downto 1);

--problem:
    addr_in <= addr_in + '1';
-------------
´   end if;
   else
srwrite <= '0';
end if;

counter <= counter + 1;
end if;  --rising edge
end process;

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Mach doch einen eigenen Prozess für das addr_in-Inkrement:
1
if (write_to_uart = '0') or (write_done = '0') then
2
  addr_in <= addr_in + 1; -- "+ '1'" sieht komisch aus
3
end if;

Übrigens darfst du gerne Boolean-Variablen verwenden, damit kannst du 
dir die vielen ='0' und ='1' sparen und der Code wird übersichtlicher.

von Falk (Gast)


Lesenswert?

@  Manuel Kampert (manuel1139)

>Nun kann ich ja aber nicht schreibend auf ein Signal aus mehreren
>Prozessen zugreifen. Wie würde man das lösen? Ich würde den Prozess auf
>jeden fall gerne aufsplitten oder bin ich da auf dem Holzweg?

1.) Prüfen ob man WIRKLICH auf ein Signal mehrfach schreibend zugreifen 
muss.
2.) Nach Möglichkeit mehrere Signale verwenden und dann über eine MUX 
zusammenführen.

MfG
Falk

P.S. Bei IF abfragen kann man auch gegen normale Dezimalzahlen 
vergleichen, das macht den Code lesbarer.

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.