i2c.vhd
来自「vhdl的很多例子」· VHDL 代码 · 共 815 行 · 第 1/4 页
VHD
815 行
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 <= writeData_reg(7);
inner_state <= first;
i2c_state <= write_data;
END IF;
WHEN OTHERS =>
NULL;
END CASE;
WHEN write_data => ---写入数据
CASE inner_state IS
WHEN first =>
IF (phase3 = '1') THEN
link <= '1';
sda_buf <= writeData_reg(6);
inner_state <= second;
END IF;
WHEN second =>
IF (phase3 = '1') THEN
link <= '1';
sda_buf <= writeData_reg(5);
inner_state <= third;
END IF;
WHEN third =>
IF (phase3 = '1') THEN
link <= '1';
sda_buf <= writeData_reg(4);
inner_state <= fourth;
END IF;
WHEN fourth =>
IF (phase3 = '1') THEN
link <= '1';
sda_buf <= writeData_reg(3);
inner_state <= fifth;
END IF;
WHEN fifth =>
IF (phase3 = '1') THEN
link <= '1';
sda_buf <= writeData_reg(2);
inner_state <= sixth;
END IF;
WHEN sixth =>
IF (phase3 = '1') THEN
link <= '1';
sda_buf <= writeData_reg(1);
inner_state <= seventh;
END IF;
WHEN seventh =>
IF (phase3 = '1') THEN
link <= '1';
sda_buf <= writeData_reg(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;
ELSE
IF (phase3 = '1') THEN
link <= '1';
sda_buf <= '0';
inner_state <= stop;
END IF;
END IF;
WHEN stop =>
IF (phase1 = '1') THEN
sda_buf <= '1';
END IF;
IF (phase3 = '1') THEN
main_state <= "00";
END IF;
WHEN OTHERS =>
NULL;
END CASE;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?