📄 i2c.vhd
字号:
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 <= '0';
inner_state <= first;
i2c_state <= read_data;
END IF;
WHEN OTHERS =>
NULL;
END CASE;
WHEN read_data =>
CASE inner_state IS
WHEN first =>
IF (phase0 = '1') THEN
sda_buf <= sda;
END IF;
IF (phase1 = '1') THEN
readData_reg(7 DOWNTO 1) <= readData_reg(6 DOWNTO 0);
readData_reg(0) <= sda;
END IF;
IF (phase3 = '1') THEN
inner_state <= second;
END IF;
WHEN second =>
IF (phase0 = '1') THEN
sda_buf <= sda;
END IF;
IF (phase1 = '1') THEN
readData_reg(7 DOWNTO 1) <= readData_reg(6 DOWNTO 0);
readData_reg(0) <= sda;
END IF;
IF (phase3 = '1') THEN
inner_state <= third;
END IF;
WHEN third =>
IF (phase0 = '1') THEN
sda_buf <= sda;
END IF;
IF (phase1 = '1') THEN
readData_reg(7 DOWNTO 1) <= readData_reg(6 DOWNTO 0);
readData_reg(0) <= sda;
END IF;
IF (phase3 = '1') THEN
inner_state <= fourth;
END IF;
WHEN fourth =>
IF (phase0 = '1') THEN
sda_buf <= sda;
END IF;
IF (phase1 = '1') THEN
readData_reg(7 DOWNTO 1) <= readData_reg(6 DOWNTO 0);
readData_reg(0) <= sda;
END IF;
IF (phase3 = '1') THEN
inner_state <= fifth;
END IF;
WHEN fifth =>
IF (phase0 = '1') THEN
sda_buf <= sda;
END IF;
IF (phase1 = '1') THEN
readData_reg(7 DOWNTO 1) <= readData_reg(6 DOWNTO 0);
readData_reg(0) <= sda;
END IF;
IF (phase3 = '1') THEN
inner_state <= sixth;
END IF;
WHEN sixth =>
IF (phase0 = '1') THEN
sda_buf <= sda;
END IF;
IF (phase1 = '1') THEN
readData_reg(7 DOWNTO 1) <= readData_reg(6 DOWNTO 0);
readData_reg(0) <= sda;
END IF;
IF (phase3 = '1') THEN
inner_state <= seventh;
END IF;
WHEN seventh =>
IF (phase0 = '1') THEN
sda_buf <= sda;
END IF;
IF (phase1 = '1') THEN
readData_reg(7 DOWNTO 1) <= readData_reg(6 DOWNTO 0);
readData_reg(0) <= sda;
END IF;
IF (phase3 = '1') THEN
inner_state <= eighth;
END IF;
WHEN eighth =>
IF (phase0 = '1') THEN
sda_buf <= sda;
END IF;
IF (phase1 = '1') THEN
readData_reg(7 DOWNTO 1) <= readData_reg(6 DOWNTO 0);
readData_reg(0) <= sda;
END IF;
IF (phase3 = '1') THEN
inner_state <= ack;
END IF;
WHEN ack =>
IF (phase3 = '1') THEN
link <= '1';
sda_buf <= '0';
inner_state <= stop;
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;
WHEN OTHERS =>
NULL;
END CASE;
WHEN OTHERS =>
NULL;
END CASE;
END IF;
END PROCESS;
---///////////////////////////数码管显示部分/////////////
PROCESS(clk,rst)
BEGIN
IF (NOT rst = '1') THEN
cnt_scan <= "000000000000";
en_xhdl3 <= "10";
ELSIF(clk'event and clk='1')THEN
cnt_scan <= cnt_scan + "000000000001";
IF (cnt_scan = "111111111111") THEN
en_xhdl3 <= NOT en_xhdl3;
END IF;
END IF;
END PROCESS;
PROCESS(writeData_reg,readData_reg,en_xhdl3)
BEGIN
CASE en_xhdl3 IS
WHEN "10" =>
seg_data_buf <= writeData_reg;
WHEN "01" =>
seg_data_buf <= readData_reg;
WHEN OTHERS =>
seg_data_buf <= "00000000";
END CASE;
END PROCESS;
PROCESS(seg_data_buf)
BEGIN
CASE seg_data_buf IS
WHEN "00000000" =>
seg_data_xhdl4 <= "00000011";
WHEN "00000001" =>
seg_data_xhdl4 <= "10011111";
WHEN "00000010" =>
seg_data_xhdl4 <= "00100101";
WHEN "00000011" =>
seg_data_xhdl4 <= "00001101";
WHEN "00000100" =>
seg_data_xhdl4 <= "10011001";
WHEN "00000101" =>
seg_data_xhdl4 <= "01001001";
WHEN "00000110" =>
seg_data_xhdl4 <= "01000001";
WHEN "00000111" =>
seg_data_xhdl4 <= "00011111";
WHEN "00001000" =>
seg_data_xhdl4 <= "00000001";
WHEN "00001001" =>
seg_data_xhdl4 <= "00011001";
WHEN "00001010" =>
seg_data_xhdl4 <= "00010001";
WHEN "00001011" =>
seg_data_xhdl4 <= "11000001";
WHEN "00001100" =>
seg_data_xhdl4 <= "01100011";
WHEN "00001101" =>
seg_data_xhdl4 <= "10000101";
WHEN "00001110" =>
seg_data_xhdl4 <= "01100001";
WHEN "00001111" =>
seg_data_xhdl4 <= "01110001";
WHEN OTHERS =>
seg_data_xhdl4 <= "11111111";
END CASE;
END PROCESS;
END translated;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -