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;![]() 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; |
|
|
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 40 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;![]() 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; |