I2C Verilog的实现(一)
- <span style="font-size:14px;">`timescale 1ns / 1ps
- module test(
- sda
- );
- reg scl;
- inout sda;
- reg sda_out;
- wire sda_in;
- reg [7:0] data;
- reg start_flag, stop_flag;
- assign sda = sda_out ? 1'bz : 1'b0;
- assign sda_in = sda;
- pullup( sda );
- I2CTEST testmine(.SDA(sda), .SCL(scl));
- initial
- begin
- scl = 0;
- sda_out = 0;
- data = 8'h27;
- start_flag = 0;
- #160000;
- start ( );
- end
- always
- begin
- #50000 scl = ~scl;
- end
- always @ (posedge start_flag)
- begin
- repeat (8)
- begin
- wait ( scl == 0 );
- #20000;
- sda_out = data[7];
- #40000;
- data = data << 1;
- end
- wait (~ scl);
- #20000;
- sda_out = 1;
- #160000;
- stop ( );
- end
- always @ ( posedge stop_flag)
- begin
- // sda_out = 0;
- // #50000;
- sda_out = 1;
- end
- task start;
- begin
- wait (scl == 0);
- #20000;
- sda_out = 1;
- wait ( scl == 1 );
- #20000;
- sda_out = 0;
- start_flag = 1;
- end
- endtask
- task stop;
- begin
- wait ( scl == 0 );
- #20000;
- sda_out = 0;
- wait ( scl ==1 );
- #20000;
- sda_out = 1;
- stop_flag = 1;
- end
- endtask
- endmodule</span>
I2C程序
- <span style="font-family:Arial;">`timescale 1ns / 1ps
- module I2CTEST(
- SDA, SCL
- );
- input SCL;
- inout SDA;
- // The 7-bits address that we want for our I2C slave
- parameter I2C_ADR = 7'h13;
- //---------------------------------------------
- //start,stop condition judgement
- //---------------------------------------------
- wire start, stop;
- reg sda1, sda2;
- reg sda11;
- always @ ( posedge SCL )
- sda1 <= SDA;
- always @ ( negedge SCL )
- sda2 <= SDA;
- always @ ( negedge SCL )
- sda11 <= sda1;
- assign start = sda11 & (!sda2);
- assign stop = sda2 & ( !sda11 );
- //----------------------------------------------
- //count setting
- //----------------------------------------------
- reg [3:0] bitcont;
- wire bit_ack = bitcont[3];
- always @ ( posedge SCL or posedge start)
- begin
- if ( start )
- bitcont <= 4'h6;
- else
- begin
- if (bit_ack)
- bitcont <= 4'h6;
- else
- bitcont <= bitcont -4'h1;
- end
- end
- //-------------------------------------
- //get sda using posedge scl
- //-------------------------------------
- reg sdar;
- always @ ( posedge SCL ) sdar <= SDA;
- //----------------------------------------
- //address match
- //----------------------------------------
- reg addr_match, op_read;
- always @ ( negedge SCL or posedge start )
- begin
- if ( start )
- begin
- addr_match <= 1'h1;
- op_read <= 1'h0;
- end
- else
- begin
- if( (bitcont == 6) & (sdar != I2C_ADR[6])) addr_match <= 1'h0;
- if( (bitcont == 5) & (sdar != I2C_ADR[5])) addr_match <= 1'h0;
- if( (bitcont == 4) & (sdar != I2C_ADR[4])) addr_match <= 1'h0;
- if( (bitcont == 3) & (sdar != I2C_ADR[3])) addr_match <= 1'h0;
- if( (bitcont == 2) & (sdar != I2C_ADR[2])) addr_match <= 1'h0;
- if( (bitcont == 1) & (sdar != I2C_ADR[1])) addr_match <= 1'h0;
- if( (bitcont == 0) & (sdar != I2C_ADR[0])) addr_match <= 1'h0;
- if( bitcont == 0 ) op_read <= sdar;
- end
- end
- //-----------------------------------------------------------------------
- //send ack
- //-----------------------------------------------------------------------
- reg ack_assert;
- always @ ( negedge SCL )
- begin
- if ( bit_ack & addr_match & op_read )
- ack_assert <= 1'h1;
- else
- ack_assert <= 1'h0;
- end
- //-------------------------------------------------------------------------
- //control SDA line
- //-------------------------------------------------------------------------
- assign SDA = ack_assert ? 1'h0 : 1'hz;
- pullup ( SDA );
- endmodule
I2C Verilog的实现(一)的更多相关文章
- I2C Verilog的实现(二)
1. 起始结束信号的判断 //--------------------------------------------- //start,stop condition judgement //---- ...
- Verilog之i2c合约
说明:i2c乔布斯.有这么多的事情在网上参考. 时刻:2014年5一个月6周二星期 1.问题叙述性说明: 正如图.已知的时钟clk为100k,rst为复位信号.上升沿有效,基于Verilog HDL或 ...
- i2c状态机方法设计-verilog
2010-09-05 21:04:00 verilog语言基础学的差不多了.接着就是看看华为的语言编写规范.状态机设计方法是fpga的重要设计方法.所以我要记上一笔. 只要会FSM方法,用fpga编写 ...
- I2C控制器的Verilog建模之三(完结版)
前言:终于到了测试篇,不过悲剧了一下.按照之前<二>里面的思路,在顶层用一个复用器驱动读写独立模块的I2C总线确实失败.虽然综合过去了,不过警告里已经说明:底层的2个原本是inout三态口 ...
- I2C控制器的Verilog建模之二
前言:接着上一篇的I2C写操作,今天要实现一个I2C的读操作.虽然在ADV7181B配置内部寄存器时没有必要使用到读操作,但是为了进一步确认寄存器是否在I2C写模块下被正确配置,这一步是必不可少的. ...
- I2C控制器的Verilog建模之一
前言:之前申请了ADI公司的一款ADV7181CBSTZ的视频解码芯片,正好原装DE2板子安的是同系列的ADV7181BBSTZ.虽然都是ADV7181的宗出,但是寄存器配置等等还是有些诧异,引脚也不 ...
- verilog中24LC04B iic(i2c)读写通信设计步骤,以及程序常见写法错误。
板子使用的是黑金的是xilinx spartan-6开发板,首先准备一份24LC04B芯片资料,读懂资料后列出关键参数. 如下: 1.空闲状态为SDA和SCL都为高电平 2.开始状态为:保持SCL,S ...
- 学习笔记一:I2C协议学习和Verilog实现
////////////////////////////////////////////////// //clk = 20 MHz ,一个周期50ns //sck = 100 kHz (scl) ,一 ...
- I2C三态门Verilog
http://www.blogbus.com/uyarotxb-logs/206932748.html inout作为输出端口时三态门为选通状态,inout作为输入端口时三态门为高阻态,可通过 ...
随机推荐
- Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces
问题解决:缺少jar包 cglib-2.1.3.jar
- MVC——数据库增删改查(aspx)
MVC: V(View) :视图→就是页面的模板 C(Control): 控制器→客户主要面对的就是控制器, M(Model):模板→在模板里面主要就是写关于数据库的各种增删改查的方法 它们之间的关系 ...
- BZOJ_1007_ [HNOI2008]_水平可见直线_(单调栈+凸包)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1007 给出一些直线,沿着y轴从上往下看,能看到多少条直线. 分析 由于直线相交,会遮挡住一些直 ...
- Discuz! x3.1的插件/utility/convert/index.php代码执行漏洞
漏洞版本: Discuz! x3.1及以下版本 漏洞描述: Discuz! x3.1的插件/utility/convert/index.php存在代码执行漏洞,如果用户在使用完之后不删除,会导致网站容 ...
- 宣布 Azure Backup 支持备份 Windows Server 2008
Giridhar Mosay 云 + Enterprise项目经理 AzureBackup已支持最新的 Windows Server 操作系统,例如 Windows Server 2008R2. ...
- Deep Learning Overview
[Ref: http://en.wikipedia.org/wiki/Deep_learning] Definition: a branch of machine learning based on ...
- apache虚拟主机的设置
方法一: 首先打开apache中conf下的http.conf文件打开虚拟主机的注释:如下去掉第二行前面的#即可 # Virtual hosts# Include conf/extra/httpd-v ...
- LoadRunner调用Java程序—性能测试
为了充分利用LoadRunner的场景控制和分析器,帮助我们更好地控制脚本加载过程,从而展现更直观有效的场景分析图表.本次将重点讨论LoadRunner如何调用Java测试代码,完成压力测试. 通常我 ...
- [九度OJ]1137.浮点数加法
原题链接:http://ac.jobdu.com/problem.php?pid=1137 题目描述: 求2个浮点数相加的和题目中输入输出中出现浮点数都有如下的形式:P1P2...Pi.Q1Q2... ...
- POJ1401 - Factorial
题目大意 N!末尾0的个数 题解 0只能由2*5产生,所以只要求2,5有多少对即可,又因为10!中5的个数少于2,所以只要求因子5有多少个即可,答案即为N/5+N/25+N/125.. 代码: #in ...