Bonjour,
Je suis entrain de coder le comportement du bus i2c en vhdl.
J'ai trouver ce bout de code pour la génération de l'horloge mais j'ai pas compris pourquoi le cycle d'horloge est divisé en 4 et pourqoui scl_clk et data_clk prennent ces valeurs à chaque quart du cycle.merci d'avance pour votre aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 PROCESS(clk, reset_n) VARIABLE count : INTEGER RANGE 0 TO divider*4; --timing for clock generation BEGIN IF(reset_n = '0') THEN --reset asserted --stretch <= '0'; count := 0; ELSIF(clk'EVENT AND clk = '1') THEN IF(count = divider*4-1) THEN --end of timing cycle count := 0; --reset timer ELSIF(stretch = '0') THEN --clock stretching from slave not detected count := count + 1; --continue clock generation timing END IF; CASE count IS WHEN 0 TO divider-1 => --first 1/4 cycle of clocking scl=0 et sda=0 start sequence scl_clk <= '0'; data_clk <= '0'; WHEN divider TO divider*2-1 => --second 1/4 cycle of clocking scl=0 et sda=1 lecture scl_clk <= '0'; data_clk <= '1'; WHEN divider*2 TO divider*3-1 => --third 1/4 cycle of clocking ecriture ???? scl_clk <= 'Z'; --release scl IF(scl = '0') THEN --detect if slave is stretching clock stretch <= '1'; ELSE stretch <= '0'; END IF; data_clk <= '1'; WHEN OTHERS => --last 1/4 cycle of clocking sda =0 donc stop sequence scl_clk <= 'Z'; data_clk <= '0'; END CASE; END IF; END PROCESS;
Partager