Soluções do capítulo 8

Exercício 8.8.4


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

ENTITY sb_prc3 IScapa_1ra
  PORT (a_i, b_i   : IN  BIT_VECTOR (3 DOWNTO 0);
        c_i        : IN  BIT; 
        s_o        : OUT BIT_VECTOR (3 DOWNTO 0);
        c_o        : OUT BIT);
END sb_prc3;

ARCHITECTURE exemplo OF sb_prc3 IS

PROCEDURE soma (       a, b, c     : IN   BIT;    -- modo IN,  classe default= constant
                SIGNAL soma, vai_1 : OUT  BIT) IS -- modo OUT, classe default= variable
BEGIN                                          
  soma  <=  a XOR b  XOR c;
  vai_1 <= (a AND b) OR (a AND c) OR (b AND c);
END soma;

SIGNAL c  : BIT_VECTOR (3 DOWNTO 1);  -- vai um interno

BEGIN
  soma (a_i(0), b_i(0), c_i,   s_o(0), c(1));
  soma (a_i(1), b_i(1), c(1),  s_o(1), c(2));
  soma (a_i(2), b_i(2), c(2),  s_o(2), c(3));
  soma (a_i(3), b_i(3), c(3),  s_o(3), c_o);
END exemplo;


Exercício 8.8.6

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
ENTITY sb_cnv1 IScapa_1ra
  PORT (e_inteiro : IN INTEGER RANGE 0 to 7;        -- entrada formato inteiro
        s_bit     : BUFFER BIT_VECTOR (2 DOWNTO 0); -- saida convertida para vetor de bits

        s_inteiro : OUT INTEGER RANGE 0 to 7);      -- saida convertida para inteiro
END sb_cnv1;

ARCHITECTURE teste OF sb_cnv1 IS

FUNCTION converte_inteiro (b_x : BIT_VECTOR) RETURN INTEGER  IS
  VARIABLE temp : INTEGER;
BEGIN
  temp := 0;
  FOR i IN 0 TO (b_x'LENGTH -1) LOOP  -- numero de iteracoes funcao do tamanho do vetor entrada

    IF b_x(i) = '1' THEN temp := temp + 2**i;
    END IF;
  END LOOP;
  RETURN temp;
END converte_inteiro;

PROCEDURE converte_bit (SIGNAL inteiro_e : IN INTEGER;
                        SIGNAL bit_s    : OUT BIT_VECTOR) IS
  VARIABLE temp_entrada : INTEGER;
  VARIABLE temp_saida   : BIT_VECTOR (bit_s'LENGTH-1 DOWNTO 0); -- variavel com mesmo tamanho do vetor saida
BEGIN
  temp_entrada := inteiro_e;
  FOR i IN 0 TO (bit_s'LENGTH - 1) LOOP   -- numero de iteracoes funcao do tamanho do vetor saida
    IF (temp_entrada MOD 2 = 1) THEN temp_saida(i) := '1';
    ELSE temp_saida(i) := '0';
    END IF;
    temp_entrada := temp_entrada / 2;
  END LOOP;
    bit_s <= temp_saida;
END converte_bit;

BEGIN
  converte_bit (e_inteiro, s_bit);    -- dado formato inteiro convertido para bit_vector
  s_inteiro <= converte_inteiro (s_bit);  -- dado formato bit_vector convertido novamente para inteiro
END teste;