Soluções do capítulo 10

Exercício 10.6.5


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
LIBRARY ieee;capa_1ra
USE ieee.std_logic_1164.ALL;

ENTITY std1164m IS
  PORT( sel : IN BIT;                                -- direcao
        a_m  : INOUT STD_LOGIC_VECTOR (3 DOWNTO 0) BUS ;  
        b_m  : INOUT STD_LOGIC_VECTOR (3 DOWNTO 0) BUS);
  END std1164m;

ARCHITECTURE exemplo OF std1164m IS
BEGIN                            

  bloco_1: BLOCK (sel = '0')  -- sel=0 -> a_m<= b_m
  BEGIN
     a_m<= GUARDED b_m;
  END BLOCK;

  bloco_2: BLOCK (sel = '1')  -- sel=1 -> b_m<= NOT a_m
  BEGIN
    b_m<= GUARDED NOT a_m;
  END BLOCK;

END exemplo;


Exercício 10.6.9

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
34
35
36
37
38
39
4
0
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
LIBRARY ieee;capa_1ra
USE ieee.std_logic_1164.ALL;

ENTITY i2c_s01 IS
  PORT (scl      : IN     STD_LOGIC;    -- relogio serial
        sda      : INOUT  STD_LOGIC;    -- dado serial
        rec_env  : IN     STD_LOGIC;    -- rec_env=1, entrada serial de dados via sda
        reset    : IN     STD_LOGIC;    -- reset=0
        rd_wr    : IN     STD_LOGIC;    -- rd_wr=0 grava novo dado para transmitir
        ce       : IN     STD_LOGIC;    -- ce=0 habilita controle rd_wr e saida dados
        dado     : INOUT  STD_LOGIC_VECTOR(3 DOWNTO 0));
 END i2c_s01;

ARCHITECTURE teste OF i2c_s01 IS

SIGNAL sda_i  : STD_LOGIC;
SIGNAL di, ds : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL estado : INTEGER RANGE 1 DOWNTO 0;
SIGNAL passo  : INTEGER RANGE 3 DOWNTO 0;

BEGIN
  abc: PROCESS (scl, reset)
  BEGIN
    IF reset ='0' THEN   --
      estado <=0;        -- 
    ELSIF rising_edge(scl) THEN
      IF rec_env ='0' THEN   -- envia dados
        CASE estado IS
          WHEN 0 =>  
            di(3 DOWNTO 1) <= ds(2 DOWNTO 0);
            sda_i <= ds(3);
            estado <= 1;
            passo <= 3;
          WHEN 1 =>
            IF passo =0 THEN estado <= 0;  -- se passo  =0 ultimo deslocamento

            ELSE passo <= passo -1;        -- se passo /=0 decremento
            END IF;          
            di(3 DOWNTO 1) <= di(2 DOWNTO 0);
            sda_i <= di(3);  
          END CASE;
       ELSE  -- recebe dados
         CASE estado IS
           WHEN 0 =>
            di(3 DOWNTO 0) <= di(2 DOWNTO 0) & sda;
            sda_i <= di(3);
            estado <= 1;
            passo <= 3;
          WHEN 1 =>
            IF passo = 0 THEN estado <= 0;
            ELSE passo <= passo -1;
            END IF;
            di(3 DOWNTO 0) <= di(2 DOWNTO 0) & sda;
          END CASE;
       END IF;
     END IF;
  END PROCESS;

  -- controle de escrita em ds 
  def: PROCESS(rd_wr)
  BEGIN
    IF rising_edge(rd_wr) THEN
      IF ce ='0' THEN
        ds <= dado;

      END IF;
    END IF;
  END PROCESS;
 
  -- controle da saida sda      
  WITH rec_env SELECT
    sda <= 'Z'    WHEN '1',
            sda_i WHEN OTHERS;
           
  -- controle da saida dados
  ghi: PROCESS (rd_wr, ce)
  BEGIN
    IF ce ='0' AND rd_wr ='1' THEN
      dado <= di;
    ELSE
      dado <= "ZZZZ";
    END IF;
  END PROCESS;

END teste;