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