I2C Verilog的实现(一)
来源:互联网 发布:湖南云计算 编辑:程序博客网 时间:2024/06/01 10:15
TestBench 程序
`timescale 1ns / 1psmodule test(sda);regscl;inout sda;regsda_out;wiresda_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));initialbegin scl = 0;sda_out = 0;data = 8'h27;start_flag = 0;#160000;start ( );endalways 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;endwait (~ scl);#20000;sda_out = 1;#160000;stop ( );end always @ ( posedge stop_flag)begin// sda_out = 0;// #50000; sda_out = 1;end task start; beginwait (scl == 0);#20000;sda_out = 1;wait ( scl == 1 );#20000;sda_out = 0;start_flag = 1;endendtasktask stop;beginwait ( scl == 0 );#20000;sda_out = 0;wait ( scl ==1 );#20000;sda_out = 1;stop_flag = 1;endendtaskendmodule
I2C程序
`timescale 1ns / 1psmodule I2CTEST(SDA, SCL);input SCL;inout SDA;// The 7-bits address that we want for our I2C slaveparameter 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; endend//-------------------------------------//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; endend//-----------------------------------------------------------------------//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的实现(一)
- Verilog的I2C实现
- I2C Verilog的实现(二)
- I2C总线协议的verilog实现
- Verilog实现多地址I2C Slave
- system verilog的杂乱无章(一)
- Verilog的一些坑(一)
- 在FPGA中使用Verilog实现I2C通信
- 基于FPGA的DS18B20控制程序设计及其Verilog实现 (一)
- Verilog之i2c协议
- 使用Beaglebone Black的I2C(一)
- 详解I2C(一)
- 三种同步FIFO的实现方法(verilog实现)
- Verilog、FPGA学习(一)
- Verilog HDL 学习(一)
- verilog学习笔记(一)
- Verilog HDL常用的行为仿真描述语句(一)
- CRC7校验的Verilog实现
- PSOM
- GDAL代码调试
- mysql日志
- python实现的系统实用log类
- Android P2P语音通话实现(思路探讨)
- I2C Verilog的实现(一)
- CANOpen学习指南
- JDBC 基础知识 (一)
- jQuery版本的图片剪切插件
- C++中的virtual “虚”
- C与C++函数指针
- 在存储过程中,用xml作为参数传递
- HDU 1847 Good Luck in CET-4 Everybody!
- tertrtsdfg