⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c_cmd.vhd

📁 这是一个I2C串行数据通信协议以VHDL硬件描述语言实现的IP核
💻 VHD
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity i2c_cmd is
port(clk,reset,ack_i:      in std_logic;
     fi2c,fcore:       out std_logic;
     start_i,stop_i:     out std_logic;
     txreg:  out std_logic_vector(7 downto 0);
     exnt_ack:   in std_logic
    );
end i2c_cmd;
architecture behav of i2c_cmd is
signal ctreg:   std_logic_vector(7 downto 0);
signal count_fc: std_logic_vector(3 downto 0);
signal count_fi:   std_logic_vector(9 downto 0);
signal fcorereg:  std_logic_vector(2 downto 0);
signal fi2creg:   std_logic_vector(4 downto 0);
signal ackint:    std_logic_vector(6 downto 0);
signal n:     std_logic_vector(1 downto 0);
begin
ackc:process(reset,ack_i,exnt_ack,clk)
variable nint,ackc:std_logic;
begin
if(reset='1') then
ackint<=(others=>'0');
n<="00";
ackc:='0';
nint:='0';
elsif rising_edge(clk) then
if(exnt_ack='1') then
nint:='1';
elsif(nint='1') then
nint:='0';
ackint<=ackint-n;
n<="00";
elsif (ack_i='1') then
ackc:='1';
elsif(ackc='1') then
ackc:='0';
if(n="10") then
n<="00";
else
n<=n+"01";
end if;
if ackint="1001101" then
ackint<="0000000";
else
ackint<=ackint+"0000001";
end if;
end if;
end if;
end process ackc;



txreg<="01001000" when ackint="0000000" else
       "00000010" when ackint="0000001" else
      "11000011" when ackint="0000010" else
       "01001000" when ackint="0000011" else
       "00000011" when ackint="0000100" else
       "00100011" when ackint="0000101" else
      "01001000" when ackint="0000110" else
       "00000100" when ackint="0000111" else
      "00000000" when ackint="0001000" else
       "01001000" when ackint="0001001" else
       "00000101" when ackint="0001010" else
       "00000000" when ackint="0001011" else
       "01001000" when ackint="0001100" else
       "00000110" when ackint="0001101" else
       "11101011" when ackint="0001110" else
       "01001000" when ackint="0001111" else
       "00000111" when ackint="0010000" else
       "11100000" when ackint="0010001" else
       "01001000" when ackint="0010010" else
       "00001000" when ackint="0010011" else
       "10001000" when ackint="0010100" else
       "01001000" when ackint="0010101" else
       "00001001" when ackint="0010110" else
      "00000001" when ackint="0010111" else
       "01001000" when ackint="0011000" else
       "00001010" when ackint="0011001" else
       "10000000" when ackint="0011010" else
       "01001000" when ackint="0011011" else
       "00001011" when ackint="0011100" else
       "01000111" when ackint="0011101" else
       "01001000" when ackint="0011110" else
       "00001100" when ackint="0011111" else
      "01000000" when ackint="0100000" else
       "01001000" when ackint="0100001" else
       "00001101" when ackint="0100010" else
      "00000000" when ackint="0100011" else
      "01001000" when ackint="0100100" else
       "00001110" when ackint="0100101" else
       "00000001" when ackint="0100110" else
       "01001000" when ackint="0100111" else
       "00001111" when ackint="0101000" else
       "00000000" when ackint="0101001" else
       "01001000" when ackint="0101010" else
      "00010000" when ackint="0101011" else
       "01000000" when ackint="0101100" else
      "01001000" when ackint="0101101" else
       "00010001" when ackint="0101110" else
       "00001000" when ackint="0101111" else
       "01001000" when ackint="0110000" else
     "00010010" when ackint="0110001" else
       "00000000" when ackint="0110010" else
      "01001000" when ackint="0110011" else
       "00010011" when ackint="0110100" else
      "00000000" when ackint="0110101" else
      "01001000" when ackint="0110110" else
       "00010101" when ackint="0110111" else
      "00000000" when ackint="0111000" else
       "01001000" when ackint="0111001" else
       "00010110" when ackint="0111010" else
       "00000000" when ackint="0111011" else
       "01001000" when ackint="0111100" else
       "00010111" when ackint="0111101" else
      "00000000" when ackint="0111110" else
      "01001000" when ackint="0111111" else
      "00011011" when ackint="1000000" else
       "00111000" when ackint="1000001" else
       "01001000" when ackint="1000010" else
      "00011100" when ackint="1000011" else
       "00111111" when ackint="1000100" else
       "01001000" when ackint="1000101" else
      "00011101" when ackint="1000110" else
      "00000000" when ackint="1000111" else
       "01001000" when ackint="1001000" else
      "00011110" when ackint="1001001" else
       "00000000" when ackint="1001010" else
       "01001000" when ackint="1001011" else
       "00011111" when ackint="1001100" else
       "10100001" when ackint="1001101" else
       "00000000";

bb:process(clk,reset)

variable ctreg1:std_logic;
begin
if (reset='1') then
fcore<='0';
fi2c<='0';
ctreg1:='0';
count_fc<=(others=>'0');
count_fi<=(others=>'0');
ctreg<="10000000";
--tmreg<="10011001";
elsif rising_edge(clk) then
if(ackint="1001101") then
ctreg<="01000000";
elsif(exnt_ack='1') then
ctreg<="01000000";
ctreg1:='1';
elsif(ctreg1='1') then
ctreg<="10000000" ;
ctreg1:='0';
end if;
if(ctreg="10000000") then
 start_i<='1';
else 
 start_i<='0';
end if;
if(ctreg="01000000") then
  stop_i<='1';
else
 stop_i<='0';
end if;
count_fc<=count_fc+1;
if(count_fc="0101") then
fcore<='1';
elsif(count_fc="1001") then
count_fc<="0000";
fcore<='0';
end if;
count_fi<=count_fi+1;
if(count_fi="111110100") then
fi2c<='1';
elsif(count_fi="1111100111") then
count_fi<="0000000000";
fi2c<='0';
end if;
end if;
end process bb;

end behav;




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -