找回密码
 注册
关于网站域名变更的通知
查看: 1197|回复: 1
打印 上一主题 下一主题

I2C Verilog的实现(一)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-8-14 15:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
TestBench 程序
6 z. ]5 Q& a7 C+ t% H; c' R
& Y1 A5 Y6 t: O1 ^! p* F
  • `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
  • 5 E/ w4 W: v/ ?1 @
  0 ^, \: g# `6 |* n
, u- E! L/ }/ ]: `; S+ S
I2C程序' [" O, q9 M% y: Q3 z

2 h3 H7 o" w$ g8 O
  • `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
    5 D2 k* V4 O, F( c0 t( ?
- _2 ^% ^: z8 e' @

; p* f- A5 L( |. p5 ~3 v# V9 ~& U7 M# e. D$ |2 |
) }! z8 q$ m; S# d9 N

; U9 i$ H7 ]# ]; e4 L" q; j: k, Y( Y% h
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-13 00:13 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表