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. WPF编程学习——动画

    前言 使用动画,是增强用户体验的一种有效的手段.合理的动画,可以让应用程序的界面看起来更加自然.真实.流畅.舒适,更有效地向用户展现信息,用户也更容易接受.同时也增加了软件使用的乐趣,提高用户粘度.( ...

  2. WordPress Think Responsive Themes ‘upload_settings_image.php’任意文件上传漏洞

    漏洞名称: WordPress Think Responsive Themes ‘upload_settings_image.php’任意文件上传漏洞 CNNVD编号: CNNVD-201311-06 ...

  3. [HDU 1254] 推箱子

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  4. css滑动门制作圆角按钮

    之前做项目的时候,基本都是将圆角背景图切成三块,故而每次用的标签都超级多,a标签中总是包含三个span,然后里面还得放按钮,导航冗余标签极多. 事实上是之前理解的滑动门的精髓不够到位. 现在有两种方式 ...

  5. [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.2.2

    Show that the following statements are equivalent: (1). $A$ is positive. (2). $A=B^*B$ for some $B$. ...

  6. Linux上构建一个RADIUS服务器详解

    作为一名网络管理员,您需要为您所需管理的每个网络设备存放用于管理的用户信息.但是网络设备通常只支持有限的用户管理功能.学习如何使用Linux上的一个外部RADIUS服务器来验证用户,具体来说是通过一个 ...

  7. HDU 1881

    思路:一开始以为rating相同的点就直接比较rp然后建图,后来想想不对,因为这样发现不了冲突.后来一想对于rating相同的点可以不用排序,因为对于这些点,他们的rp必然不相同,也就是说在这些点的内 ...

  8. [liu yanling]测试小结

    编写测试用例,业务了解是基础,结合业务编写测试用例,重要的逻辑一定要覆盖

  9. 【原】spark-submit提交应用程序的内部流程

    我们经常通过spark-submit来提交spark应用程序,那么让我们一起看一下这里面到底发生了什么吧. 知识点: 1.CLI命令行界面启动Spark应用程序 Unix有两种方式:1)spark-s ...

  10. S3C2440触摸屏驱动实例开发讲解

    出处:http://www.embeddedlinux.org.cn/html/yingjianqudong/ 一.开发环境 主  机:VMWare--Fedora 9 开发板:Mini2440--6 ...