|
程序有错误 ,求高人指\(^o^)/~
------------------------------------------------------------------
-- 写数据到AT24C08,在读取显示到数码管。
------------------------------------------------------------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY IIC IS
GENERIC(clkcnt : INTEGER:=50);--时钟源分频
PORT(
reset,clk : IN STD_LOGIC;
scl : INOUT STD_LOGIC;
en : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--数码管位选
led_data : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--数码管段选
sda : INOUT STD_LOGIC
);
END ENTITY IIC;
ARCHITECTURE ART OF IIC IS
------------------------------------------------------
TYPE STATE_1 IS(start,transmit,ack,sub,ack1,start1,slave,ack2,reading,ack3,stop);
SIGNAL STATE : STATE_1;
SIGNAL bclk : STD_LOGIC;
SIGNAL t_data : STD_LOGIC_VECTOR(7 DOWNTO 0):="10101010";--准备发送的数据
SIGNAL r_data : STD_LOGIC_VECTOR(7 DOWNTO 0);--读取到的数据寄存器
------------------------------------------------------
BEGIN
-----------------------------------------------------------
en<="0000";
------------400KHz--IIC---------40MHz时钟源----------------
FenPin:PROCESS(clk,reset)
VARIABLE cnt : INTEGER:=0;
BEGIN
IF(reset='0')THEN
cnt:=0;
ELSIF(clk'EVENT AND clk='1')THEN
IF(cnt=clkcnt-1)THEN
cnt:=0;
bclk<=NOT bclk;
ELSE
cnt:=cnt+1;
END IF;
END IF;
END PROCESS FenPin;
-----------------------写数据到AT24C08---------------------------
main:PROCESS(bclk,reset)
VARIABLE x_address: STD_LOGIC_VECTOR(7 DOWNTO 0):="10100000";
VARIABLE d_address: STD_LOGIC_VECTOR(7 DOWNTO 0):="10100001";
VARIABLE count : INTEGER RANGE 0 TO 40;
VARIABLE cnt : INTEGER RANGE 0 TO 7;
BEGIN
IF(reset='0')THEN
scl<='1';
sda<='1';
count:=0;
cnt:=7;
STATE<=start;
ELSIF(bclk'EVENT AND bclk='1')THEN
CASE STATE IS
WHEN start=>
count:=count+1;
CASE count IS
WHEN 1 => SDA<='1';
WHEN 2 => SCL<='1';
WHEN 5 => SDA<='0';
WHEN 7 => SCL<='0';
WHEN 15=> count:=0;
STATE<=transmit;
WHEN OTHERS=> NULL;
END CASE;
WHEN transmit=>
count:=count+1;
CASE count IS
WHEN 1=> SDA<=x_address(cnt);
WHEN 2=> SCL<='1';
WHEN 3=> SCL<='0';
WHEN 4=> cnt:=cnt-1;
count:=0;
IF(cnt=0)THEN
cnt:=7;
STATE<=ack;
ELSE
STATE<=transmit;
END IF;
WHEN OTHERS=>NULL;
END CASE;
WHEN ack =>
count:=count+1;
CASE count IS
WHEN 1=> SDA<='0';
WHEN 2=> SCL<='1';
WHEN 3=> SCL<='0';
WHEN 4=> STATE<=sub;
count:=0;
WHEN OTHERS=>NULL;
END CASE;
WHEN sub =>
count:=count+1;
CASE count IS
WHEN 1=> SDA<=t_data(cnt);
WHEN 2=> SCL<='1';
WHEN 3=> SCL<='0';
WHEN 4=> cnt:=cnt-1;
count:=0;
IF(cnt=0)THEN
cnt:=7;
STATE<=ack1;
ELSE
STATE<=sub;
END IF;
WHEN OTHERS=>NULL;
END CASE;
WHEN ack1 =>
count:=count+1;
CASE count IS
WHEN 1=> SDA<='0';
WHEN 2=> SCL<='1';
WHEN 3=> SCL<='0';
WHEN 4=> STATE<=start1;
count:=0;
WHEN OTHERS=>NULL;
END CASE;
WHEN start1 =>
count:=count+1;
CASE count IS
WHEN 1 => SDA<='1';
WHEN 2 => SCL<='1';
WHEN 3 => SDA<='0';
WHEN 4 => SCL<='0';
WHEN 5=> count:=0;
STATE<=slave;
WHEN OTHERS=> NULL;
END CASE;
WHEN slave =>
count:=count+1;
CASE count IS
WHEN 1 => SDA<=d_address(cnt) ;
WHEN 2 => SCL<='1';
WHEN 3 => SCL<='0';
WHEN 4 => SCL<='0';
WHEN 5=> count:=0;
STATE<=slave;
WHEN OTHERS=> NULL;
END CASE;
WHEN ack2 =>
count:=count+1;
CASE count IS
WHEN 1=> SDA<='0';
WHEN 2=> SCL<='1';
WHEN 3=> SCL<='0';
WHEN 4=> STATE<=reading;
count:=0;
WHEN OTHERS=>NULL;
END CASE;
WHEN reading =>
count:=count+1;
CASE count IS
WHEN 1 => SDA<='1';
WHEN 4 => SCL<='1';
WHEN 8 => r_data(cnt)<=sda;
WHEN 10=> SCL<='0';
WHEN 12=> cnt:=cnt-1;
count:=0;
IF(cnt=0)THEN
cnt:=7;
STATE<=ack3;
ELSE
STATE<=reading;
END IF;
WHEN OTHERS=>NULL;
END CASE;
WHEN ack3 =>
count:=count+1;
CASE count IS
WHEN 1=> SDA<='0';
WHEN 2=> SCL<='1';
WHEN 3=> SCL<='0';
WHEN 4=> STATE<=stop;
count:=0;
WHEN OTHERS=>NULL;
END CASE;
WHEN stop =>
count:=count+1;
CASE count IS
WHEN 1=> SDA<='0';
WHEN 3=> SCL<='1';
WHEN 5=> SDA<='1';
WHEN 7=> STATE<=start;
count:=0;
WHEN OTHERS=>NULL;
END CASE;
WHEN OTHERS=> STATE<=start;
END CASE;
led_data<=r_data;
END IF;
END PROCESS main;
END ARCHITECTURE ART;
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|