VHDL编写IIC程序
更新时间:2023-10-24 19:52:01 阅读量: 综合文库 文档下载
如题所示,本文是使用VHDL语言编写的IIC 总线的24C02的读写例程,程序加了中文注释便于想我一样的初学者理解,写使用的写一个字节,读使用的随机读,具体参考24c02的手册
library IEEE;
use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all;
entity iic_com is port( clk: in STD_LOGIC; rst_n: in STD_LOGIC; sw1_en: in STD_LOGIC; --读使能 sw2_en: in STD_LOGIC; --写使能 scl: out STD_LOGIC; sda: inout STD_LOGIC; dis_data: out STD_LOGIC_VECTOR (7 downto 0) );
end entity iic_com;
architecture iic_communication of iic_com is signal sw_state: STD_LOGIC; signal cnt_delay: STD_LOGIC_VECTOR (8 downto 0); signal scl_pos: STD_LOGIC; signal scl_hig: STD_LOGIC; signal scl_neg: STD_LOGIC; signal scl_low: STD_LOGIC; signal db_r: STD_LOGIC_VECTOR (7 downto 0); signal read_data: STD_LOGIC_VECTOR (7 downto 0); signal sda_r: STD_LOGIC; signal sda_in: STD_LOGIC; signal sda_link: STD_LOGIC; signal num: STD_LOGIC_VECTOR (3 downto 0); constant DEVICE_READ: STD_LOGIC_VECTOR (7 downto 0) := \器件地址读 constant DEVICE_WRITE: STD_LOGIC_VECTOR (7 downto 0) := \器件地址写 constant WRITE_DATA: STD_LOGIC_VECTOR (7 downto 0) := \写入的数据 constant BYTE_ADDR: STD_LOGIC_VECTOR (7 downto 0) := \写入的地址 type state (IDLE,START1,ADD1,ACK1,ADD2,ACK2,START2,ADD3,ACK3,DATA,ACK4,STOP1,STOP2); signal cstate: state; signal temp_sw1,temp_sw2:Std_LOGIC; begin
---------------------- process(clk,rst_n)
is begin if (rst_n = '0') then sw_state <= '0'; elsif (clk'event AND clk = '1') then if(sw1_en = '1') then sw_state <= '0'; elsif (sw2_en = '1') then sw_state <= '1'; end if; end if; end process; ---------------------- process(clk,rst_n) begin if (rst_n = '0') then cnt_delay <= '0' & x\ elsif (clk'event AND clk = '1') then if(cnt_delay = 10#499#) then cnt_delay <= '0' & x\ else cnt_delay <= cnt_delay+'1'; end if; end if; end process;
scl_pos <= '1' when (cnt_delay = 10#499#) else '0'; scl_hig <= '1' when (cnt_delay = 10#124#) else
'0'; scl_neg <= '1' when (cnt_delay = 10#249#) else '0'; scl_low <= '1' when (cnt_delay = 10#374#) else '0'; process(clk,rst_n) begin if (rst_n = '0') then scl <= '0'; elsif (clk'event AND clk = '1') then if(scl_pos = '1') then scl <= '1'; elsif(scl_neg = '1') then scl <= '0'; end if; end if;
end process;
--相当于500分频,得到100K时钟 --IIC时钟上升沿 --IIC时钟高电平
--IIC时钟下降沿
--IIC时钟低电平
---------------------- process(clk,rst_n) begin if (rst_n = '0') then cstate <= IDLE; sda_r <= '1'; sda_link <= '0'; num <= x\ read_data <= x\ elsif (clk'event AND clk = '1') then case cstate is when IDLE => sda_link <= '1'; sda_r <= '1';
if (sw1_en/=temp_sw1)or(sw2_en/=temp_sw2) then --当sw1_en 和sw2_en 变化一次,只读或写一次,避免多次读写 temp_sw1<=sw1_en;temp_sw2<=sw2_en; if ((sw1_en = '1') OR (sw2_en = '1')) then db_r <= DEVICE_WRITE; cstate <= START1; else cstate <= IDLE; end if; else cstate <= IDLE; end if; when START1 => if (scl_hig = '1') then --起始位 sda_link <= '1';--数据线由sda_r控制 sda_r <= '0'; cstate <= ADD1; num <= x\ else cstate <= START1; end if; when ADD1 => --器件地址&'0' if (scl_low = '1') then if (num = x\ num <= x\ sda_r <= '1'; sda_link <= '0';--数据线设为高阻态,允许输入 cstate <= ACK1; else
cstate <= ADD1; num <= num+'1'; case num is
的地址
when x\ when x\ when x\ when x\ when x\ when x\ when x\ when x\ when others => NULL; end case; end if; else cstate <= ADD1; end if;
when ACK1 =>
--应答
if (scl_neg = '1') then cstate <= ADD2; db_r <= BYTE_ADDR; else cstate <= ACK1;
end if; when ADD2 =>
--要写入数据或读取数据
if (scl_low = '1') then if (num = x\ num <= x\
sda_r <= '1'; sda_link <= '0';--数据线设为高阻态,允许输入 cstate <= ACK2; else sda_link <= '1';--数据线由sda_r控制 num <= num+'1'; cstate <= ADD2; case num is when x\ when x\ when x\ when x\ when x\
when x\
when x\ when x\ when others => NULL; end case; end if; else cstate <= ADD2; end if;
--应答
when ACK2 => if (scl_neg = '1') then
if (sw_state = '0') then --如果写入数据 cstate <= DATA; db_r <= WRITE_DATA;
--如果读取数据
elsif (sw_state = '1') then db_r <= DEVICE_READ; cstate <= START2; end if; else cstate <= ACK2; end if;
when START2 => --起始位 if (scl_low = '1') then sda_link <= '1'; sda_r <= '1'; cstate <= START2; elsif (scl_hig = '1') then sda_r <= '0'; cstate <= ADD3; else cstate <= START2; end if; when ADD3 => --器件地址&'1' if (scl_low ='1') then if (num = x\ num <= x\ sda_r <= '1'; sda_link <= '0'; cstate <= ACK3; l11<='0'; else num <= num+'1'; cstate <= ADD3; case num is when x\
正在阅读:
VHDL编写IIC程序10-24
表面活性剂期末复习-考试内容04-11
用友软件操作指南(1)07-27
建筑物理声学报告 - 图文05-03
柬埔寨攻略08-11
中国物料输送机行业市场前景分析预测年度报告(目录) - 图文07-07
2017届杨浦区初三年级三模语文试卷(2017.05)01-07
在全市政协办公室主任会议上的讲话:上下深入开展“不忘初心、牢记使命”主题教育03-18
数学小组心得体会01-20
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 编写
- 程序
- VHDL
- IIC
- 17.1脚手架工程说明及计算规则
- 市商务局党组织建设年 四大工程实施方案
- 江苏开放大学 现代管理理论与实务第二次
- 《国务院关于严格规范城乡建设用地增减挂钩试点切实做好农村土地整治工作的通知》(国发〔2010〕47号)解读
- 数字电路考试复习题
- 人教版英语必修1各单元必刷题对应练习(word版有答案)
- 开工停工复工管理工作程序
- 图书馆安全事件应急预案-苏州市职业大学图书馆
- 青年文明号二十周年交流活动展示观后感
- 原料药装药教程及副作用处理合集 - 图文
- 组合数学引论课后答案(部分)
- 《木兰诗》教学设计
- 改革住房制度 造福全军官兵
- 项目编码规定
- 重庆某工厂道路及管网工程施工方案 - secret
- 学生成绩管理系统设计报告
- 刑法分论案例
- 生活饮用水采样要求
- 《国际经济法学》第06章在线测试
- 000001(6位3号数字,顶格)- 东南大学-信息科学与工 … - 图文