i2c.vhd
来自「vhdl的很多例子」· VHDL 代码 · 共 815 行 · 第 1/4 页
VHD
815 行
WHEN OTHERS =>
main_state <= "00";
END CASE;
WHEN "10" => --读EEPROM
IF (phase0 = '1') THEN
scl_xhdl1 <= '1';
ELSE
IF (phase2 = '1') THEN
scl_xhdl1 <= '0';
END IF;
END IF;
CASE i2c_state IS
WHEN ini =>
CASE inner_state IS
WHEN start =>
IF (phase1 = '1') THEN
link <= '1';
sda_buf <= '0';
END IF;
IF ((phase3 AND link) = '1') THEN
inner_state <= first;
sda_buf <= '1';
link <= '1';
END IF;
WHEN first =>
IF (phase3 = '1') THEN
sda_buf <= '0';
link <= '1';
inner_state <= second;
END IF;
WHEN second =>
IF (phase3 = '1') THEN
sda_buf <= '1';
link <= '1';
inner_state <= third;
END IF;
WHEN third =>
IF (phase3 = '1') THEN
sda_buf <= '0';
link <= '1';
inner_state <= fourth;
END IF;
WHEN fourth =>
IF (phase3 = '1') THEN
sda_buf <= '0';
link <= '1';
inner_state <= fifth;
END IF;
WHEN fifth =>
IF (phase3 = '1') THEN
sda_buf <= '0';
link <= '1';
inner_state <= sixth;
END IF;
WHEN sixth =>
IF (phase3 = '1') THEN
sda_buf <= '0';
link <= '1';
inner_state <= seventh;
END IF;
WHEN seventh =>
IF (phase3 = '1') THEN
sda_buf <= '0';
link <= '1';
inner_state <= eighth;
END IF;
WHEN eighth =>
IF (phase3 = '1') THEN
link <= '0';
inner_state <= ack;
END IF;
WHEN ack =>
IF (phase0 = '1') THEN
sda_buf <= sda;
END IF;
IF (phase1 = '1') THEN
IF (sda_buf = '1') THEN
main_state <= "00";
END IF;
END IF;
IF (phase3 = '1') THEN
link <= '1';
sda_buf <= addr(7);
inner_state <= first;
i2c_state <= sendaddr;
END IF;
WHEN OTHERS =>
NULL;
END CASE;
WHEN sendaddr =>
CASE inner_state IS
WHEN first =>
IF (phase3 = '1') THEN
link <= '1';
sda_buf <= addr(6);
inner_state <= second;
END IF;
WHEN second =>
IF (phase3 = '1') THEN
link <= '1';
sda_buf <= addr(5);
inner_state <= third;
END IF;
WHEN third =>
IF (phase3 = '1') THEN
link <= '1';
sda_buf <= addr(4);
inner_state <= fourth;
END IF;
WHEN fourth =>
IF (phase3 = '1') THEN
link <= '1';
sda_buf <= addr(3);
inner_state <= fifth;
END IF;
WHEN fifth =>
IF (phase3 = '1') THEN
link <= '1';
sda_buf <= addr(2);
inner_state <= sixth;
END IF;
WHEN sixth =>
IF (phase3 = '1') THEN
link <= '1';
sda_buf <= addr(1);
inner_state <= seventh;
END IF;
WHEN seventh =>
IF (phase3 = '1') THEN
link <= '1';
sda_buf <= addr(0);
inner_state <= eighth;
END IF;
WHEN eighth =>
IF (phase3 = '1') THEN
link <= '0';
inner_state <= ack;
END IF;
WHEN ack =>
IF (phase0 = '1') THEN
sda_buf <= sda;
END IF;
IF (phase1 = '1') THEN
IF (sda_buf = '1') THEN
main_state <= "00";
END IF;
END IF;
IF (phase3 = '1') THEN
link <= '1';
sda_buf <= '1';
inner_state <= start;
i2c_state <= read_ini;
END IF;
WHEN OTHERS =>
NULL;
END CASE;
WHEN read_ini =>
CASE inner_state IS
WHEN start =>
IF (phase1 = '1') THEN
link <= '1';
sda_buf <= '0';
END IF;
IF ((phase3 AND link) = '1') THEN
inner_state <= first;
sda_buf <= '1';
link <= '1';
END IF;
WHEN first =>
IF (phase3 = '1') THEN
sda_buf <= '0';
link <= '1';
inner_state <= second;
END IF;
WHEN second =>
IF (phase3 = '1') THEN
sda_buf <= '1';
link <= '1';
inner_state <= third;
END IF;
WHEN third =>
IF (phase3 = '1') THEN
sda_buf <= '0';
link <= '1';
inner_state <= fourth;
END IF;
WHEN fourth =>
IF (phase3 = '1') THEN
sda_buf <= '0';
link <= '1';
inner_state <= fifth;
END IF;
WHEN fifth =>
IF (phase3 = '1') THEN
sda_buf <= '0';
link <= '1';
inner_state <= sixth;
END IF;
WHEN sixth =>
IF (phase3 = '1') THEN
sda_buf <= '0';
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?