1. <span style="font-size:14px;">`timescale 1ns / 1ps
  2. module test(
  3. sda
  4. );
  5. reg scl;
  6. inout sda;
  7. reg sda_out;
  8. wire    sda_in;
  9. reg [7:0]   data;
  10. reg start_flag, stop_flag;
  11. assign sda = sda_out ? 1'bz : 1'b0;
  12. assign sda_in = sda;
  13. pullup( sda );
  14. I2CTEST testmine(.SDA(sda), .SCL(scl));
  15. initial
  16. begin
  17. scl = 0;
  18. sda_out = 0;
  19. data = 8'h27;
  20. start_flag = 0;
  21. #160000;
  22. start ( );
  23. end
  24. always
  25. begin
  26. #50000 scl = ~scl;
  27. end
  28. always @ (posedge start_flag)
  29. begin
  30. repeat (8)
  31. begin
  32. wait ( scl == 0 );
  33. #20000;
  34. sda_out = data[7];
  35. #40000;
  36. data = data << 1;
  37. end
  38. wait (~ scl);
  39. #20000;
  40. sda_out = 1;
  41. #160000;
  42. stop ( );
  43. end
  44. always @ ( posedge stop_flag)
  45. begin
  46. //     sda_out = 0;
  47. //     #50000;
  48. sda_out = 1;
  49. end
  50. task start;
  51. begin
  52. wait (scl == 0);
  53. #20000;
  54. sda_out = 1;
  55. wait ( scl == 1 );
  56. #20000;
  57. sda_out = 0;
  58. start_flag = 1;
  59. end
  60. endtask
  61. task stop;
  62. begin
  63. wait ( scl == 0 );
  64. #20000;
  65. sda_out = 0;
  66. wait ( scl ==1 );
  67. #20000;
  68. sda_out = 1;
  69. stop_flag = 1;
  70. end
  71. endtask
  72. endmodule</span>

I2C程序

    1. <span style="font-family:Arial;">`timescale 1ns / 1ps
    2. module I2CTEST(
    3. SDA, SCL
    4. );
    5. input SCL;
    6. inout SDA;
    7. // The 7-bits address that we want for our I2C slave
    8. parameter I2C_ADR = 7'h13;
    9. //---------------------------------------------
    10. //start,stop condition judgement
    11. //---------------------------------------------
    12. wire start, stop;
    13. reg sda1, sda2;
    14. reg sda11;
    15. always @ ( posedge SCL )
    16. sda1 <= SDA;
    17. always @ ( negedge SCL )
    18. sda2 <= SDA;
    19. always @ ( negedge SCL )
    20. sda11 <= sda1;
    21. assign start = sda11 & (!sda2);
    22. assign stop = sda2 & ( !sda11 );
    23. //----------------------------------------------
    24. //count setting
    25. //----------------------------------------------
    26. reg [3:0]  bitcont;
    27. wire bit_ack = bitcont[3];
    28. always @ ( posedge SCL or posedge start)
    29. begin
    30. if ( start )
    31. bitcont <=  4'h6;
    32. else
    33. begin
    34. if (bit_ack)
    35. bitcont <= 4'h6;
    36. else
    37. bitcont <= bitcont -4'h1;
    38. end
    39. end
    40. //-------------------------------------
    41. //get sda using posedge scl
    42. //-------------------------------------
    43. reg sdar;
    44. always @ ( posedge SCL ) sdar <= SDA;
    45. //----------------------------------------
    46. //address match
    47. //----------------------------------------
    48. reg addr_match, op_read;
    49. always @ ( negedge SCL or posedge start )
    50. begin
    51. if ( start )
    52. begin
    53. addr_match <= 1'h1;
    54. op_read <= 1'h0;
    55. end
    56. else
    57. begin
    58. if( (bitcont == 6) & (sdar != I2C_ADR[6])) addr_match <= 1'h0;
    59. if( (bitcont == 5) & (sdar != I2C_ADR[5])) addr_match <= 1'h0;
    60. if( (bitcont == 4) & (sdar != I2C_ADR[4])) addr_match <= 1'h0;
    61. if( (bitcont == 3) & (sdar != I2C_ADR[3])) addr_match <= 1'h0;
    62. if( (bitcont == 2) & (sdar != I2C_ADR[2])) addr_match <= 1'h0;
    63. if( (bitcont == 1) & (sdar != I2C_ADR[1])) addr_match <= 1'h0;
    64. if( (bitcont == 0) & (sdar != I2C_ADR[0])) addr_match <= 1'h0;
    65. if( bitcont == 0 ) op_read <= sdar;
    66. end
    67. end
    68. //-----------------------------------------------------------------------
    69. //send ack
    70. //-----------------------------------------------------------------------
    71. reg ack_assert;
    72. always @ ( negedge SCL )
    73. begin
    74. if ( bit_ack & addr_match & op_read )
    75. ack_assert <= 1'h1;
    76. else
    77. ack_assert <= 1'h0;
    78. end
    79. //-------------------------------------------------------------------------
    80. //control SDA line
    81. //-------------------------------------------------------------------------
    82. assign SDA = ack_assert ? 1'h0 : 1'hz;
    83. pullup ( SDA );
    84. endmodule

I2C Verilog的实现(一)的更多相关文章

  1. I2C Verilog的实现(二)

    1. 起始结束信号的判断 //--------------------------------------------- //start,stop condition judgement //---- ...

  2. Verilog之i2c合约

    说明:i2c乔布斯.有这么多的事情在网上参考. 时刻:2014年5一个月6周二星期 1.问题叙述性说明: 正如图.已知的时钟clk为100k,rst为复位信号.上升沿有效,基于Verilog HDL或 ...

  3. i2c状态机方法设计-verilog

    2010-09-05 21:04:00 verilog语言基础学的差不多了.接着就是看看华为的语言编写规范.状态机设计方法是fpga的重要设计方法.所以我要记上一笔. 只要会FSM方法,用fpga编写 ...

  4. I2C控制器的Verilog建模之三(完结版)

    前言:终于到了测试篇,不过悲剧了一下.按照之前<二>里面的思路,在顶层用一个复用器驱动读写独立模块的I2C总线确实失败.虽然综合过去了,不过警告里已经说明:底层的2个原本是inout三态口 ...

  5. I2C控制器的Verilog建模之二

    前言:接着上一篇的I2C写操作,今天要实现一个I2C的读操作.虽然在ADV7181B配置内部寄存器时没有必要使用到读操作,但是为了进一步确认寄存器是否在I2C写模块下被正确配置,这一步是必不可少的. ...

  6. I2C控制器的Verilog建模之一

    前言:之前申请了ADI公司的一款ADV7181CBSTZ的视频解码芯片,正好原装DE2板子安的是同系列的ADV7181BBSTZ.虽然都是ADV7181的宗出,但是寄存器配置等等还是有些诧异,引脚也不 ...

  7. verilog中24LC04B iic(i2c)读写通信设计步骤,以及程序常见写法错误。

    板子使用的是黑金的是xilinx spartan-6开发板,首先准备一份24LC04B芯片资料,读懂资料后列出关键参数. 如下: 1.空闲状态为SDA和SCL都为高电平 2.开始状态为:保持SCL,S ...

  8. 学习笔记一:I2C协议学习和Verilog实现

    ////////////////////////////////////////////////// //clk = 20 MHz ,一个周期50ns //sck = 100 kHz (scl) ,一 ...

  9. I2C三态门Verilog

    http://www.blogbus.com/uyarotxb-logs/206932748.html     inout作为输出端口时三态门为选通状态,inout作为输入端口时三态门为高阻态,可通过 ...

随机推荐

  1. 转自作者:phylips@bmy

    差分约束系统 2008-11-28 20:53:25|  分类: 算法与acm|举报|字号 订阅     出处:http://duanple.blog.163.com/blog/static/7097 ...

  2. 理解SVG坐标系统和变换: 建立新视窗

    在SVG绘制的任何一个时刻,你可以通过嵌套<svg>或者使用例如<symbol>的元素来建立新的viewport和用户坐标系.在这篇文章中,我们将看一下我们如何这样做,以及这样 ...

  3. 几种流行Webservice框架性能对比

    1      摘要 开发webservice应用程序中离不开框架的支持,当open-open网站列举的就有30多种,这对于开发者如何选择带来一定的疑惑.性能Webservice的关键要素,不同的框架性 ...

  4. Jersey Restful部署到Tomcat注意事项

    新的Jersey版本,支持Servlet 3.x,与Servlet 2.x不一样 实现自定义的Application,使用@ApplicationPath("/")标注 @Appl ...

  5. [MarsZ]程序猿谈大学之工作三年半的程序猿给大学童鞋的一些注释

    我本不是个喜欢写文章的人,更甭提写这种基本没技术含量的文章了.但是今天上班的时候,不经意浏览了下学校的QQ群,突然很想把自己的经验经历分享给还在大学里的同学,希望能让某些对前途职业迷茫的童鞋有所帮助. ...

  6. 【JS】Intermediate1:The DOM

    1.DOM(The Document Object Model) A way to manipulate the structure and style of an HTML page. It rep ...

  7. Java笔记(二十八)……IO流下 IO包中其他常用类以及编码表问题

    PrintWriter打印流 Writer的子类,既可以接收字符流,也可以接收字节流,还可以接收文件名或者文件对象,非常方便 同时,还可以设置自动刷新以及保持原有格式写入各种文本类型的print方法 ...

  8. Java笔记(二十七)……IO流中 File文件对象与Properties类

    File类 用来将文件或目录封装成对象 方便对文件或目录信息进行处理 File对象可以作为参数传递给流进行操作 File类常用方法 创建 booleancreateNewFile():创建新文件,如果 ...

  9. 洛谷P1120 小木棍

    洛谷1120 小木棍 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50.     现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长 ...

  10. Zend Studio 或者Eclipse下安装插件Spket(以Zend为例)

    1. Help>Install New Software... 2. 在Work With:后输入网址 http://www.agpad.com/update,点击Add 3. 输入Name:S ...