Forum: FPGA, VHDL & Co. Synchronisatzionsprobleme zwischen 2 Modulen


von Chris (Gast)


Lesenswert?

Hallo!


ich scheine ein leichtes synchronisationsproblem zwischen 2 modulen zu 
haben. ich konnte das ganze nicht mittels waveform testen, da dort keine 
variablen angezeigt werden.


der folgende code stammt vom submodul
1
sendDataYToMainModule : PROCESS(ECNN_CLK_50, sigInternalProcessingFinished)
2
      variable counter : integer    := 0;
3
      variable stepsize : integer    := 16; -- 16 bit for a pixel
4
      variable varECNN_Y_valid : std_logic := '0';
5
    
6
    BEGIN
7
      IF ECNN_CLK_50'EVENT AND ECNN_CLK_50 = '1' THEN
8
9
-- wenn die interne bildverarbeitung fertig ist, wird das signal auf '1' gesetzt, das ist das zeichen für das speichern des bildes - pixel für pixel
10
        IF sigInternalProcessingFinished = '1' THEN
11
          -- if signal is equal '1' then the main module will fetch the data    
12
-- ECNN_PROCESSING_FINISHED - hieran ist das main modul interessiert. wenn das signal 1 ist, schreibt das main modul die daten vom submodul direkt in den sram
13
          ECNN_PROCESSING_FINISHED <= sigInternalProcessingFinished;
14
        
15
-- mein bild hat 100 pixel. ich speichere jeden pixel einzeln. danach wird ein flag gesetzt - zeichen für das mainmodul, dass es nichts mehr speichern muss
16
          IF counter < 100 THEN          
17
-- das datensignal, welches zum main modul kommt ist gültig, wenn = '1'
18
            ECNN_Y_valid <= varECNN_Y_valid;
19
            IF varECNN_Y_valid = '1' THEN
20
                        
21
--ECNN_Y ist der vektor der vom mainmodul gespeichert wird
22
              ECNN_Y(15)  <= Y_internal(counter * stepsize + 15);
23
              ECNN_Y(14)  <= Y_internal(counter * stepsize + 14);
24
              ECNN_Y(13)  <= Y_internal(counter * stepsize + 13);
25
              ECNN_Y(12)  <= Y_internal(counter * stepsize + 12);
26
              ECNN_Y(11)  <= Y_internal(counter * stepsize + 11);
27
              ECNN_Y(10)  <= Y_internal(counter * stepsize + 10);
28
              ECNN_Y(9)  <= Y_internal(counter * stepsize + 9);
29
              ECNN_Y(8)  <= Y_internal(counter * stepsize + 8);
30
            
31
              ECNN_Y(7)  <= Y_internal(counter * stepsize + 7);
32
              ECNN_Y(6)  <= Y_internal(counter * stepsize + 6);
33
              ECNN_Y(5)  <= Y_internal(counter * stepsize + 5);
34
              ECNN_Y(4)  <= Y_internal(counter * stepsize + 4);
35
              ECNN_Y(3)  <= Y_internal(counter * stepsize + 3);
36
              ECNN_Y(2)  <= Y_internal(counter * stepsize + 2);
37
              ECNN_Y(1)  <= Y_internal(counter * stepsize + 1);
38
              ECNN_Y(0)  <= Y_internal(counter * stepsize + 0);
39
              
40
            ELSE
41
-- nächster pixel
42
              counter        := counter + 1;
43
              varECNN_Y_valid   := varECNN_Y_valid XOR '1';          
44
            END IF;
45
            
46
          ELSE  -- counter more than 100 loops
47
            ECNN_Y_finished      <= '1';            
48
          END IF;
49
        END IF;
50
      END IF;
51
    END PROCESS sendDataYToMainModule;



der folgende code stammt aus dem hauptmodul:
1
instance : sumbodul
2
    PORT MAP(
3
      ECNN_RESET => RESET,
4
      ECNN_CLK_50 => CLK_50,
5
      ECNN_U_finished => ECNN_U_finished_sig,
6
      ECNN_U_valid => ECNN_U_valid_sig,
7
      ECNN_U => ECNN_U_sig,
8
      ECNN_PROCESSING_FINISHED => sigStoreData,
9
      ECNN_Y_finished => ECNN_Y_finished_sig,
10
      ECNN_Y_valid => ECNN_Y_valid_sig,
11
      ECNN_Y => ECNN_Y_sig
12
  );
13
14
prototype_interact_with_sram : process(CLK_50, sigStoreData, sigStoreDummyImage)
15
    variable varCounter : integer := 0;
16
    variable varRead_write : std_logic := '0';
17
    variable varMem_address : std_logic_vector (17 downto 0) := "000000000000000000";
18
    variable varUpperBoundary : integer := constDimensionNOfNxNImage;
19
    
20
    variable varStoreDataFromBuffer   : std_logic := '0';
21
    variable varStoreDataToBuffer  : std_logic := '0';
22
      
23
    begin
24
    if (CLK_50'event and CLK_50 = '1') then
25
    
26
27
-- wenn das submodul das signal zum speichern sendet, wird überprüft, ob es das schon getan hat - für die initialisierung des counters etc.
28
      if (sigStoreData = '1' and varStoreDataFromCNNBuffer = '0') THEN
29
        varMem_address        := constStartMemoryAddressOfImageY;
30
        varStoreDataFromBuffer  := sigStoreData;
31
        varCounter          := 0;
32
        varRead_write        := '0';
33
      END IF;
34
      
35
36
-- 100 pixel werden gespeichert
37
      if (varCounter < 100 and varStoreDataFromCNNBuffer = '1') then
38
        
39
        CNN_DATA_ADDRESS <= varMem_address;
40
        
41
        ----------------
42
        -- writing modus
43
        ----------------
44
        if (varRead_write = '1') THEN       -- write        
45
          READ_WRITE <= '1';
46
          NEW_ADDR <= '1';
47
          
48
          -----  
49
            IF (varCounter = 5) THEN
50
              LEDR <= "00" & ECNN_Y_sig;
51
            END IF;
52
            -------
53
          
54
          IF (varStoreDataFromCNNBuffer = '1' and ECNN_Y_valid_sig = '1' and ECNN_Y_finished_sig = '0') THEN
55
            DATA_IN <= ECNN_Y_sig;
56
          END IF;
57
          
58
          
59
          varCounter := varCounter + 1;
60
61
        ----------------
62
        -- reading modus
63
        ----------------
64
        ELSE
65
          READ_WRITE <= '0';
66
          NEW_ADDR <= '0';
67
          
68
          if varCounter > 0 then
69
            varMem_address := varMem_address + "000000000000000001";
70
            --LEDR <= varMem_address;
71
          end if;
72
              
73
        end if;        
74
        varRead_write := not varRead_write;  
75
      end if;
76
      
77
    end if;
78
    end process prototype_interact_with_sram;



das modul für die speicherung in den sram funktioniert fehlerfrei - habe 
es ausgibig getestet. ich weiß dass das submodul vektoren mit lauter 
1ser schickt. wenn ich den sram mit einem externen programm auslese, so 
werden aber nur 0er gespeichert.
irgendwie gibt es probleme beim synchronisieren. jedoch arbeiten beide 
module mit der selben clock.
ich bin langsam etwas ratlos.

lg

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


Lesenswert?

> die speicherung in den sram funktioniert fehlerfrei...
> wenn ich den sram mit einem externen programm auslese, so
> werden aber nur 0er gespeichert.
Wie passt das zusammen?

>  READ_WRITE <= '1';
Ist das das Signal ans SRAM? Wie ist dein WR# und OE# am SRAM 
beschaltet? Darfst du dein SRAM direkt vom Schreibzustand in den 
Lesezustand umschalten?

von Chris (Gast)


Lesenswert?

Hallo!

SRAM modul funktioniert fehlerfrei. ich verwende ein modul dass direkt 
aus einem tutorial der herstellerfirma stammt.
das umschalten zwischen read und write funktioniert ohne probleme...


>> die speicherung in den sram funktioniert fehlerfrei...
>> wenn ich den sram mit einem externen programm auslese, so
>> werden aber nur 0er gespeichert.
> Wie passt das zusammen?

also es ist so zu verstehen. ich habe im hauptmodul einige werte in den 
sram gespeichert. diese werte sind alle richtig gespeichert worden.

was ist nun mein problem?
ich schicke vom submodul lauter 1nser zum "speicherprocess".
wenn ich nun mit einem externen programm den sram auslese, so sind an 
den stellen, an denen die 1nser sein sollten, lauter 0er.

deswegen liegt die vermutung nahe, dass ich in einem der beiden obinge 
codestücke der hund begraben liegt :P

anbei die ports für das sram-modul
1
COMPONENT entity_sram_controller is
2
    PORT
3
    (
4
      CLK_50        :  IN std_logic;
5
            
6
      SRAM_DQ        :  INOUT std_logic_vector (15 downto 0);
7
      SRAM_ADDR      :  OUT std_logic_vector (17 downto 0);
8
      SRAM_UB_N      :  OUT std_logic;
9
      SRAM_LB_N      :  OUT std_logic;
10
      SRAM_WE_N      :  OUT std_logic;
11
      SRAM_CE_N      :  OUT std_logic;
12
      SRAM_OE_N      :  OUT std_logic;
13
      GPIO_0        :  INOUT std_logic_vector(35 downto 0);
14
      GPIO_1        :  INOUT std_logic_vector(35 downto 0);     
15
16
17
18
      NEW_ADDR    :  IN std_logic;
19
      READ_WRITE    :  IN std_logic;
20
      DATA_ADDRESS  :  IN std_logic_vector (17 downto 0);
21
      DATA_IN      :  IN std_logic_vector (15 downto 0)
22
    );
23
  END COMPONENT;

von SuperWilly (Gast)


Lesenswert?

>SRAM modul funktioniert fehlerfrei. ich verwende ein modul dass direkt
>aus einem tutorial der herstellerfirma stammt.


Allein die Tatsache, dass das Modul aus einem Tutorial stammt, gibt
Dir die Gewissheit, dass es funktioniert ???

Hast Du das "SRAM Modul" tatsächlich mal in Hardware laufen gehabt und 
in Hardware Debugging betrieben?

Hast Du die Schaltung simuliert ?


SuperWilly

von Chris (Gast)


Lesenswert?

Hallo!

Wie ich bereits oben geschrieben habe:
> ich habe im hauptmodul einige werte in den
sram gespeichert. diese werte sind alle richtig gespeichert worden.

ich habe schaltung für das speichern in sram also getestet - in hardware 
wie auch simuliert. beides erfolgreich.


wie auch schon vorhin geschrieben, habe ich leider mehrere variablen in 
den processen verwendet. wenn ich die in signale umwandle bekomme ich 
nicht wirklich etwas sinnvolles als resultat - aus einer simulation.

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


Lesenswert?

> für das speichern in sram also getestet
Dann gib doch mal an den entsprechenden Schnittstellen bekannte Daten an 
das RAM aus.
Da z.B.:
1
--ECNN_Y ist der vektor der vom mainmodul gespeichert wird
2
              ECNN_Y(15)  <= '0';
3
              :
4
              ECNN_Y(1)  <= '1';
5
              ECNN_Y(0)  <= '0');

oder kürzer:
1
--ECNN_Y ist der vektor der vom mainmodul gespeichert wird
2
              ECNN_Y  <= x"1234";


Was ist denn das hier für eine haarsträubende Muxerei:
1
              ECNN_Y(15)  <= Y_internal(counter * stepsize + 15);
2
              :
3
              ECNN_Y(0)  <= Y_internal(counter * stepsize + 0);
wie breit ist dein Y_internal ?
Wenn counter ein uneingeschränkter Integer ist, dann muß das ein 
megamäßiger Monstermux sein... :-o
Was sagt eigentlich deine Synthese zu solchen Konstrukten?
Wie schnell ist dein Design?


BTW:
Wie geht das, dass du aus dem SRAM mit einem externen Programm etwas 
auslesen kannst?

von Chris (Gast)


Lesenswert?

hallo!

alsooo :)

ich verarbeite intern ein bild, dass in y_internal gespeichert ist.
es handelt sich also um einen vektor der 1600 lang ist. da ich immer nur 
16 bit zum sram schicke, muss ich diese 16bit erstmal selektieren. das 
mache ich über diese methode.

externes programm...
ich verwende das altera de2 board, welches software für das auslesen und 
manipulieren jedes bausteins zur verfügung stellt. dazu muss man eine 
.sof datei vom hersteller auf das board synthetisieren und laufen 
lassen. das externe programm - (sprich auf dem rechner) "kommuniziert" 
dann mit dem board. damit ist es dann ein leichtes den sraminhalt 
auszulesen.

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


Lesenswert?

> vektor der 1600 lang... muss ich diese 16bit erstmal selektieren.
Mit einem Multiplexer wirst du da kaum Freude haben...

Warum machst du es nicht mit einem Schieberegister?
Die ersten 16 Bit ausgeben, danach das Scheiberegister um 16 bit 
weiterschieben, dann wieder die ersten 16 Bit ausgeben, dann das 
Schieberegister....

Schieben geht in einem FPGA ruckzuck, ein 16 Bit breiter 100:1 Mux 
(16*100=1600) braucht da schon signifikant länger. Wahrscheinlich zu 
lang, aber das solltest du in der Timing-Analyse sehen. Zumindest sollte 
dir eine Zahl ausgegeben werden, wie schnell das Design überhaupt 
getaktet werden kann.

von Chris (Gast)


Lesenswert?

danke für den tipp!

nun ich bin ja noch beim lernen.
das problem hab ich übrigens gelöst, es gab ein paar verzögerungen beim 
setzen der variablen...

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.