📄 iic_app.vhd
字号:
--/*****************************************************************************-- * 源文件: iic_app.vhd-- * 模块: iic_controller驱动模块-- * 版权:-- * Copyright(C) 北京联华众科科技有限公司-- * www.lianhua-zhongke.com.cn-- * 版本: Version 1.0-- * -- * 功能说明:-- * 产生IIC读写模块(iic_controller)的控制和数据信号,驱动IIC读写模块-- * 完成IIC设备的读写操作。-- * -- * 参数说明:-- * 输出-- * rd - 读操作指令有效-- * wr - 写操作指令有效-- * dev_addr - IIC设备地址-- * mem_addr - 存储单元地址-- * disp - 准备写入或已经读出的数据显示在七段数码管上-- *-- * 输入-- * write_read - 读写有效信号,0表示写操作,1表示读操作,由开发板上-- * 的拨码开关产生该信号-- * wr_data - 写入操作时待写入数据,由开发板上的 4位拨码开关产生-- * stop - 当前操作结束-- * clock - 工作时钟,可以用复位按钮模拟-- * reset - 复位信号,低电平有效-- *-- * 双向-- * data - 读操作的数据输入,写操作的数据输出-- *-- * 参数-- * device_addr - 设备地址-- * memory_addr - 存储单元地址-- *-- * 变更记录: -- * 2006.01.28, 新建-- *-- *****************************************************************************/LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;ENTITY iic_app IS GENERIC ( device_addr : STD_LOGIC_VECTOR(7 downto 0):= "10100000"; memory_addr : STD_LOGIC_VECTOR(7 downto 0):= "00000000" ); PORT ( rd : BUFFER STD_LOGIC; wr : BUFFER STD_LOGIC; dev_addr : OUT STD_LOGIC_VECTOR(7 downto 0); mem_addr : OUT STD_LOGIC_VECTOR(7 downto 0); data : INOUT STD_LOGIC_VECTOR(7 downto 0); disp : OUT STD_LOGIC_VECTOR(3 downto 0); stop : IN STD_LOGIC; write_read : IN STD_LOGIC;--0-write, 1-read wr_data : IN STD_LOGIC_VECTOR(3 downto 0);--待写入器件的数据,范围为0~F clock : IN STD_LOGIC; reset : IN STD_LOGIC );END iic_app;ARCHITECTURE iic_app_architecture OF iic_app IS SIGNAL data_write : STD_LOGIC; SIGNAL data_out : STD_LOGIC_VECTOR(7 downto 0); SIGNAL data_out_tmp : STD_LOGIC_VECTOR(7 downto 0);BEGIN data_out_tmp <= data_out WHEN (data_write) = '1' ELSE "ZZZZZZZZ"; data <= data_out_tmp; PROCESS(clock, reset)--主状态机 VARIABLE currentState : INTEGER RANGE 0 TO 7 := 0; VARIABLE data_buffer : STD_LOGIC_VECTOR(7 downto 0); BEGIN if (reset = '0') then disp <= "0000"; currentState := 0; wr <= '0'; rd <= '0'; data_write <= '1'; data_out <= "00000000"; elsif (clock='1' AND clock'EVENT) then if (write_read = '0') then disp <= wr_data; else disp <= data(3 downto 0); end if; if (currentState = 0) then--实现 init 的功能,对变量初始化 data_buffer(3 downto 0) := wr_data; dev_addr <= device_addr; if (write_read = '0') then currentState := 1;--写入操作 else currentState := 2;--读取操作 end if; elsif (currentState = 1) then--写操作 wr <= '1'; mem_addr <= memory_addr; data_write <= '1'; data_out <= data_buffer; disp <= data_buffer(3 downto 0); currentState := 3;--退出写状态 elsif (currentState = 2) then--读操作 rd <= '1'; data_write <= '0';--data端口设置为高阻,准备接收数据 mem_addr <= memory_addr;--准备读取的IIC设备内存地址 currentState := 3;--退出读状态 else if (stop = '1') then--读操作 stop 到来时表示读取进行完毕,可以使用读得的数据 if (rd = '1') then disp <= data(3 downto 0); end if; rd <= '0'; wr <= '0'; end if; end if; end if;END PROCESS;END iic_app_architecture;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -