Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

i2c only master VHDL

Moderatorzy: Jacek Bogusz, Moderatorzy

nowak8383
-
-
Posty: 4
Rejestracja: 5 gru 2009, o 21:20
Lokalizacja: Police

i2c only master VHDL

Postautor: nowak8383 » 5 gru 2009, o 21:30

Witam, chce zbudować prosty (bez przerwań, z prescalerem na normal i fast mode, transmisja 8-bitowa) interfejs i2c master, rozrysowałem sobie to na blok rejestrów(Status, Control, Command, Data_In, Data_Out), oraz na blok Receiver/Transmiter.

Kod: Zaznacz cały

library IEEE; use IEEE.STD_LOGIC_1164.all; entity registers is port( CLK : in STD_LOGIC; RST : in STD_LOGIC; SEL : in STD_LOGIC; WR : in STD_LOGIC; ADDR : in STD_LOGIC_VECTOR(2 downto 0); Data_In : in STD_LOGIC_VECTOR(7 downto 0); Data_Out : out STD_LOGIC_VECTOR(7 downto 0); BUSY : in STD_LOGIC; Rx_Data : in STD_LOGIC_VECTOR(7 downto 0); Rx_Ready : in STD_LOGIC; Data_Send : out STD_LOGIC_VECTOR(7 downto 0); Rx_Req : out STD_LOGIC; Tx_Req : out STD_LOGIC ); end registers; --}} End of automatically maintained section architecture registers of registers is type REGS is array (0 to 7) of std_logic_vector(7 downto 0); signal Registers : REGS; signal RxAck : std_logic; signal TiP : std_logic; signal EN : std_logic; signal STA : std_logic; signal STO : std_logic; signal RxD : std_logic; signal TxR : std_logic; signal ACK : std_logic; begin process(SEL, ADDR, Registers) begin case ADDR is when "000" => Data_Out <= Registers(0);-- Status Register when "001" => Data_Out <= Registers(1);-- Control/Command Register when "010" => Data_Out <= Registers(2);-- Output Data Register when "011" => Data_Out <= Registers(3);-- Input Data Register when "100" => Data_Out <= Registers(4); when "101" => Data_Out <= Registers(5); when "110" => Data_Out <= Registers(6); when "111" => Data_Out <= Registers(7); when others => null; end case; end process; -- Status Register process(RST, CLK, BUSY) begin if RST='1' then Registers(0)<=(others=>'0'); elsif CLK'event and CLK='1' then Registers(0)(7) <= BUSY; Registers(0)(6) <= RxAck; -- Received acknowledge from slave Registers(0)(5) <= TiP; -- Transfer in progress end if; end process; -- Control.Command Register process (RST, CLK, EN, STA, STO, RxD, TxR, ACK) begin if RST = '1' then Registers(1) <= (others=>'0'); elsif CLK'event and CLK= '1' then Registers(1)(7) <= EN; Registers(1)(6) <= STA; Registers(1)(5) <= STO; Registers(1)(4) <= RxD; Registers(1)(3) <= TxR; Registers(1)(2) <= ACK; end if; end process; -- Output Data Register process(RST, CLK, SEL, WR, ADDR) begin if RST = '1' then Registers(2) <= (others=>'0'); Data_Send <= (others=>'0'); Tx_Req <= '0'; elsif CLK'event and CLK = '1' then if SEL = '1' and WR = '1' and ADDR = "010" then Tx_Req <= '1'; Registers(2) <= Data_In; -- z magistrali Data_Send <= Data_In; else Tx_Req<='0'; end if; end if; end process; -- Input Data Register process(RST, CLK, Rx_Data) begin if RST = '1' then Registers(3) <= (others=>'0'); Rx_Req <= '0'; elsif CLK'event and CLK='1' then if Rx_Ready='1' then Registers(3) <= Rx_Data; -- odbior end if; if SEL = '1' and WR = '1' and ADDR = "011" then Rx_Req <= '1'; Registers(3) <= (others=>'0'); else Rx_Req<='0'; end if; end if; end process; end registers;
Jednak mam problem z organizacją bloku Transmit/Receiver. Wiem że na necie jest dużo gotowych kodów do i2c, jednak trudno jest mi się połapać w tych kodach, ze względu na duża ilość użytych zmiennych i zawiłość tych kodów. Proszę o pomoc, jeśli może ktoś ma jakieś przykłady.
Pozdrawiam

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 23 gości