📄 i2c_cmd.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 + -