Soluções do capítulo 11

Exercício 11.5.1


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
-- versao VDHL-1993 para os operadores sll, srl rol e rorcapa_1ra
LIBRARY ieee;
USE ieee.numeric_std.ALL;

ENTITY std1076x IS
  PORT (x_s              : IN   SIGNED  (3 DOWNTO 0);
        x_u              : IN   UNSIGNED(3 DOWNTO 0);

       
        s_shift_left     : OUT  SIGNED  (3 DOWNTO 0);
        u_shift_left     : OUT  UNSIGNED(3 DOWNTO 0);
        s_sll            : OUT  SIGNED  (3 DOWNTO 0);
        u_sll            : OUT  UNSIGNED(3 DOWNTO 0);         
       
        s_shift_right    : OUT  SIGNED  (3 DOWNTO 0);
        u_shift_right    : OUT  UNSIGNED(3 DOWNTO 0);
        s_srl            : OUT  SIGNED  (3 DOWNTO 0);       
        u_srl            : OUT  UNSIGNED(3 DOWNTO 0);
                       
        s_rotate_left    : OUT  SIGNED  (3 DOWNTO 0);
        u_rotate_left    : OUT  UNSIGNED(3 DOWNTO 0);
        s_rol            : OUT  SIGNED  (3 DOWNTO 0);               
        u_rol            : OUT  UNSIGNED(3 DOWNTO 0);

              
        s_rotate_right   : OUT  SIGNED  (3 DOWNTO 0);
        u_rotate_right   : OUT  UNSIGNED(3 DOWNTO 0);
        s_ror            : OUT  SIGNED  (3 DOWNTO 0);
        u_ror            : OUT  UNSIGNED(3 DOWNTO 0);               
                    
        n                : IN   NATURAL RANGE  0 TO 3;
        i                : IN   INTEGER RANGE -3 TO 3);
END std1076x;

ARCHITECTURE teste OF std1076x IS
BEGIN
  s_shift_left  <= shift_left (x_s, n);
  s_shift_right <= shift_right(x_s, n);
 
  s_rotate_left  <= rotate_left (x_s, n);
  s_rotate_right <= rotate_right(x_s, n);

 
  s_sll <= x_s sll i;       -- ou notacao chamada de funcao: s_sll <= "sll"(x_s, i);
  s_srl <= x_s srl i;       -- ou notacao chamada de funcao: s_srl <= "srl"(x_s, i);
 
  s_rol <= "rol"(x_s, i);   -- ou notacao operador: s_rol <= x_s rol i;  
  s_ror <= "ror"(x_s, i);   -- ou notacao operador: s_ror <= x_s ror i;

  u_shift_left  <= shift_left (x_u, n);
  u_shift_right <= shift_right(x_u, n);
 
  u_rotate_left  <= rotate_left (x_u, n);
  u_rotate_right <= rotate_right(x_u, n);
 
  u_sll <= "sll"(x_u, i);   -- ou notacao operador
  u_srl <= "srl"(x_u, i);   -- ou notacao operador
 
  u_rol <= "rol"(x_u, i);   -- ou notacao operador
  u_ror <= "ror"(x_u, i);   -- ou notacao operador
END teste;


Exercício 11.5.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
39
4
0
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

LIBRARY ieee;capa_1ra
USE ieee.numeric_bit.ALL;

ENTITY std1076n IS
  GENERIC (n : NATURAL RANGE 32 DOWNTO 1 := 4);

  PORT (rs               : IN   SIGNED (n-1 DOWNTO 0);
        ss               : IN   SIGNED (n-1 DOWNTO 0);        
        opr              : IN   BIT_VECTOR (2 DOWNTO 0);
        ci               : IN   BIT;                     -- carry in     
        ov               : OUT  BIT;                     -- overflow
        zr               : OUT  BIT;                     -- zero
        ts               : OUT  SIGNED  (n-1 DOWNTO 0)); 
END std1076n;

ARCHITECTURE teste OF std1076n IS
  SIGNAL zero_a : SIGNED(n-1 DOWNTO 0) := (OTHERS => '0');
  SIGNAL zero_b : SIGNED(n-2 DOWNTO 0) := (OTHERS => '0');
BEGIN                                   

  alu:PROCESS (rs, ss, ci, opr)
    VARIABLE over : BIT_VECTOR(2 DOWNTO 0);
    VARIABLE tis  : SIGNED(n-1 DOWNTO 0);
    VARIABLE soma : BOOLEAN;
  BEGIN
  CASE opr IS
    WHEN "000" => tis := rs  +  ss;                soma := TRUE;
    WHEN "001" => tis := rs  +  ss + (zero_b &ci); soma := TRUE;
    WHEN "010" => tis := rs  -  ss;                soma := FALSE;
    WHEN "011" => tis := rs  -  ss - (zero_b &ci); soma := FALSE;
    WHEN "100" => tis := rs AND ss;                soma := FALSE;             
    WHEN "101" => tis := rs  OR ss;                soma := FALSE;           
    WHEN "110" => tis := rs XOR ss;                soma := FALSE;
    WHEN "111" => tis := NOT rs;                   soma := FALSE;
  END CASE;
 
  over := rs(n-1) &ss(n-1) &tis(n-1);
  CASE soma IS
    WHEN TRUE =>

      CASE over IS                       --  0     0     1,   1     1     0
        WHEN "001" | "110" => ov <= '1'; -- pos + pos = neg, neg + neg = pos
        WHEN OTHERS        => ov <= '0';
      END CASE;
    WHEN FALSE =>
      CASE over IS                       --  1     0     0,   0     1     1
        WHEN "100" | "011" => ov <= '1'; -- neg - pos = pos, pos - neg = neg
        WHEN OTHERS        => ov <= '0';
      END CASE;
  END CASE;
  
  IF tis = zero_a THEN zr <= '1';
  ELSE               zr <= '0';
  END IF;
 
  ts <= tis;
  END PROCESS;
  
END teste;