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. Spring的annotation用在set方法上 hibernate的annotation用get方法上

    1.Spring的annotation用在set方法上 2.hibernate的annotation用在get方法上

  2. C#如何获取真实IP地址

    大家获取用户IP地址常用的方法是   C# 代码   复制 string IpAddress = ""; if((HttpContext.Current.Request.Serve ...

  3. 安装 Homebrew

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" ...

  4. Mac OS X 10.10(yosemite)更新后,cocoapods出错, 及cocoapods更新至0.34后, 错误情况整理

    1:Mac升级10.10后,执行pod install出错如下 QTX-Will-mini:NewHishop willbin$ pod install [!] Unable to load a sp ...

  5. c#自定义液晶数字控件

    c#自定义液晶数字控件   项目中经常与硬件打交道,LED显示屏上面的液晶数字很好看,QT中直接就有数码管这个控件,C#中自己来写一个,其实掌握了一种自定义控件的写法,其他的都是浮云,举一反三,最笨的 ...

  6. [NOIP2011]数的划分

    本题地址:http://www.luogu.org/problem/show?pid=1025 题目描述 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序).例如:n=7,k=3,下面三 ...

  7. Java笔记(二十四)……集合工具类Collections&Arrays

    Collections 集合框架的工具类,方法全部为静态 Collections与Collection的区别 Collection是集合框架的一个顶层接口,里面定义了单列集合的共性方法 Collect ...

  8. Windows Azure的故障检测和重试逻辑

    高度可用的应用程序设计的一个关键点,是利用代码中的重试逻辑正常处理临时中断的服务.Microsoft 模式和实践团队开发的暂时性故障处理应用程序块可协助应用程序开发人员完成此过程.“暂时性”一词表示仅 ...

  9. Esper系列(五)Order by、Limit、构建事件流、Updating an Insert Stream

    Order by 与SQL语法类似类似,默认为升序排列; 注意: 如果order by的子句中出现了聚合函数,那么该聚合函数必须出现在select的子句中. 出现在select中的expression ...

  10. Linear Regreesion

       3.似然函数:我是这么理解的,比如说我们知道某个X的概率分布密度函数,但是这个概率分布有未知的参数,但是我想得到这个未知的参数θ,然后我们就通过很多个已知的变量,把这些概率分布密度函数乘起来,这 ...