亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? i2c_slave_model.v.bak

?? 用VHDL寫的I2C源程序
?? BAK
字號:
/////////////////////////////////////////////////////////////////////
////                                                             ////
////  WISHBONE rev.B2 compliant synthesizable I2C Slave model    ////
////                                                             ////
////                                                             ////
////  Authors: Richard Herveille (richard@asics.ws) www.asics.ws ////
////           John Sheahan (jrsheahan@optushome.com.au)         ////
////                                                             ////
////  Downloaded from: http://www.opencores.org/projects/i2c/    ////
////                                                             ////
/////////////////////////////////////////////////////////////////////
////                                                             ////
//// Copyright (C) 2001,2002 Richard Herveille                   ////
////                         richard@asics.ws                    ////
////                                                             ////
//// This source file may be used and distributed without        ////
//// restriction provided that this copyright statement is not   ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer.////
////                                                             ////
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
////                                                             ////
/////////////////////////////////////////////////////////////////////

//  CVS Log
//
//  $Id: i2c_slave_model.v,v 1.3 2002/10/30 18:11:06 rherveille Exp $
//
//  $Date: 2002/10/30 18:11:06 $
//  $Revision: 1.3 $
//  $Author: rherveille $
//  $Locker:  $
//  $State: Exp $
//
// Change History:
//               $Log: i2c_slave_model.v,v $
//               Revision 1.3  2002/10/30 18:11:06  rherveille
//               Added timing tests to i2c_model.
//               Updated testbench.
//
//               Revision 1.2  2002/03/17 10:26:38  rherveille
//               Fixed some race conditions in the i2c-slave model.
//               Added debug information.
//               Added headers.
//

`include "timescale.v"

module i2c_slave_model (scl, sda);

	//
	// parameters
	//
	parameter I2C_ADR = 7'b001_0000;

	//
	// input && outpus
	//
	input scl;
	inout sda;

	//
	// Variable declaration
	//
	wire debug = 1'b1;

	reg [7:0] mem [3:0]; // initiate memory
	reg [7:0] mem_adr;   // memory address
	reg [7:0] mem_do;    // memory data output

	reg sta, d_sta;
	reg sto, d_sto;

	reg [7:0] sr;        // 8bit shift register
	reg       rw;        // read/write direction

	wire      my_adr;    // my address called ??
	wire      i2c_reset; // i2c-statemachine reset
	reg [2:0] bit_cnt;   // 3bit downcounter
	wire      acc_done;  // 8bits transfered
	reg       ld;        // load downcounter

	reg       sda_o;     // sda-drive level
	wire      sda_dly;   // delayed version of sda

	// statemachine declaration
	parameter idle        = 3'b000;
	parameter slave_ack   = 3'b001;
	parameter get_mem_adr = 3'b010;
	parameter gma_ack     = 3'b011;
	parameter data        = 3'b100;
	parameter data_ack    = 3'b101;

	reg [2:0] state; // synopsys enum_state

	//
	// module body
	//

	initial
	begin
	   sda_o = 1'b1;
	   state = idle;
	end

	// generate shift register
	always @(posedge scl)
	  sr <= #1 {sr[6:0],sda};

	//detect my_address
	assign my_adr = (sr[7:1] == I2C_ADR);
	// FIXME: This should not be a generic assign, but rather
	// qualified on address transfer phase and probably reset by stop

	//generate bit-counter
	always @(posedge scl)
	  if(ld)
	    bit_cnt <= #1 3'b111;
	  else
	    bit_cnt <= #1 bit_cnt - 3'h1;

	//generate access done signal
	assign acc_done = !(|bit_cnt);

	// generate delayed version of sda
	// this model assumes a hold time for sda after the falling edge of scl.
	// According to the Phillips i2c spec, there s/b a 0 ns hold time for sda
	// with regards to scl. If the data changes coincident with the clock, the
	// acknowledge is missed
	// Fix by Michael Sosnoski
	assign #1 sda_dly = sda;


	//detect start condition
	always @(negedge sda)
	  if(scl)
	    begin
	        sta <= #1 1'b1;

	        if(debug)
	          $display("DEBUG i2c_slave; start condition detected at %t", $time);
	    end
	  else
	    sta <= #1 1'b0;

	always @(posedge scl)
	  d_sta <= #1 sta;

	// detect stop condition
	always @(posedge sda)
	  if(scl)
	    begin
	       sto <= #1 1'b1;

	       if(debug)
	         $display("DEBUG i2c_slave; stop condition detected at %t", $time);
	    end
	  else
	    sto <= #1 1'b0;

	//generate i2c_reset signal
	assign i2c_reset = sta || sto;

	// generate statemachine
	always @(negedge scl or posedge sto)
	  if (sto || (sta && !d_sta) )
	    begin
	        state <= #1 idle; // reset statemachine

	        sda_o <= #1 1'b1;
	        ld    <= #1 1'b1;
	    end
	  else
	    begin
	        // initial settings
	        sda_o <= #1 1'b1;
	        ld    <= #1 1'b0;

	        case(state) // synopsys full_case parallel_case
	            idle: // idle state
	              if (acc_done && my_adr)
	                begin
	                    state <= #1 slave_ack;
	                    rw <= #1 sr[0];
	                    sda_o <= #1 1'b0; // generate i2c_ack

	                    #2;
	                    if(debug && rw)
	                      $display("DEBUG i2c_slave; command byte received (read) at %t", $time);
	                    if(debug && !rw)
	                      $display("DEBUG i2c_slave; command byte received (write) at %t", $time);

	                    if(rw)
	                      begin
	                          mem_do <= #1 mem[mem_adr];

	                          if(debug)
	                            begin
	                                #2 $display("DEBUG i2c_slave; data block read %x from address %x (1)", mem_do, mem_adr);
	                                #2 $display("DEBUG i2c_slave; memcheck [0]=%x, [1]=%x, [2]=%x", mem[4'h0], mem[4'h1], mem[4'h2]);
	                            end
	                      end
	                end

	            slave_ack:
	              begin
	                  if(rw)
	                    begin
	                        state <= #1 data;
	                        sda_o <= #1 mem_do[7];
	                    end
	                  else
	                    state <= #1 get_mem_adr;

	                  ld    <= #1 1'b1;
	              end

	            get_mem_adr: // wait for memory address
	              if(acc_done)
	                begin
	                    state <= #1 gma_ack;
	                    mem_adr <= #1 sr; // store memory address
	                    sda_o <= #1 !(sr <= 15); // generate i2c_ack, for valid address

	                    if(debug)
	                      #1 $display("DEBUG i2c_slave; address received. adr=%x, ack=%b", sr, sda_o);
	                end

	            gma_ack:
	              begin
	                  state <= #1 data;
	                  ld    <= #1 1'b1;
	              end

	            data: // receive or drive data
	              begin
	                  if(rw)
	                    sda_o <= #1 mem_do[7];

	                  if(acc_done)
	                    begin
	                        state <= #1 data_ack;
	                        mem_adr <= #2 mem_adr + 8'h1;
	                        sda_o <= #1 (rw && (mem_adr <= 15) ); // send ack on write, receive ack on read

	                        if(rw)
	                          begin
	                              #3 mem_do <= mem[mem_adr];

	                              if(debug)
	                                #5 $display("DEBUG i2c_slave; data block read %x from address %x (2)", mem_do, mem_adr);
	                          end

	                        if(!rw)
	                          begin
	                              mem[ mem_adr[3:0] ] <= #1 sr; // store data in memory

	                              if(debug)
	                                #2 $display("DEBUG i2c_slave; data block write %x to address %x", sr, mem_adr);
	                          end
	                    end
	              end

	            data_ack:
	              begin
	                  ld <= #1 1'b1;

	                  if(rw)
	                    if(sda) // read operation && master send NACK
	                      begin
	                          state <= #1 idle;
	                          sda_o <= #1 1'b1;
	                      end
	                    else
	                      begin
	                          state <= #1 data;
	                          sda_o <= #1 mem_do[7];
	                      end
	                  else
	                    begin
	                        state <= #1 data;
	                        sda_o <= #1 1'b1;
	                    end
	              end

	        endcase
	    end

	// read data from memory
	always @(posedge scl)
	  if(!acc_done && rw)
	    mem_do <= #1 {mem_do[6:0], 1'b1}; // insert 1'b1 for host ack generation

	// generate tri-states
	assign sda = sda_o ? 1'bz : 1'b0;


	//
	// Timing checks
	//

	wire tst_sto = sto;
	wire tst_sta = sta;
	wire tst_scl = scl;

	specify
	  specparam normal_scl_low  = 4700,
	            normal_scl_high = 4000,
	            normal_tsu_sta  = 4700,
	            normal_tsu_sto  = 4000,
	            normal_sta_sto  = 4700,

	            fast_scl_low  = 1300,
	            fast_scl_high =  600,
	            fast_tsu_sta  = 1300,
	            fast_tsu_sto  =  600,
	            fast_sta_sto  = 1300;

	  $width(negedge scl, normal_scl_low);  // scl high time
	  $width(posedge scl, normal_scl_high); // scl low time

	  $setup(negedge sda &&& scl, negedge scl, normal_tsu_sta); // start condition
	  $setup(posedge scl, posedge sda &&& scl, normal_tsu_sto); // stop condition

	  $setup(posedge tst_sta, posedge tst_scl, normal_sta_sto); // stop to start time
	endspecify

endmodule


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
男女视频一区二区| 日韩一级成人av| 日韩视频中午一区| 中文字幕色av一区二区三区| 蜜桃久久av一区| 欧美视频一区二区| 国产精品国产a级| 国产成人免费在线观看| 日韩美女视频在线| 欧美色图在线观看| 亚洲天天做日日做天天谢日日欢| 久久精品视频在线看| 免费看欧美女人艹b| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 日韩欧美电影在线| 亚洲香肠在线观看| 色又黄又爽网站www久久| 欧美三区免费完整视频在线观看| 欧美三级日韩三级| 亚洲视频图片小说| 99免费精品在线观看| 国产亚洲一区二区三区四区| 最近日韩中文字幕| 成人av影院在线| 国产精品天干天干在观线| 国产精品一二三在| 欧美午夜宅男影院| 亚洲一区在线播放| 欧美色大人视频| 日韩av一区二| 欧美sm极限捆绑bd| 韩国毛片一区二区三区| 99久久综合99久久综合网站| 中文一区二区在线观看| 日韩精品一级二级 | 在线视频一区二区免费| 亚洲精品国产品国语在线app| 日韩电影在线观看一区| 欧美一区二区三区日韩视频| 美女视频网站黄色亚洲| 久久久久久久久久电影| 亚洲一级二级三级| 91精品欧美福利在线观看| 国产精品午夜免费| 在线国产亚洲欧美| 丝瓜av网站精品一区二区| 精品欧美黑人一区二区三区| 国产麻豆成人精品| 亚洲欧洲精品一区二区三区不卡| 麻豆精品新av中文字幕| 色琪琪一区二区三区亚洲区| 性做久久久久久免费观看| 日韩欧美国产精品一区| 成人一级片网址| 亚欧色一区w666天堂| 久久久久久99精品| 91精品1区2区| 亚洲精品水蜜桃| 欧美肥妇free| 国产精品亚洲一区二区三区在线 | 国产剧情在线观看一区二区| 国产欧美日产一区| 欧美视频一区二区三区在线观看| 中文字幕一区二区三区在线观看 | 久久99国产精品免费网站| 欧美日韩视频在线观看一区二区三区 | 国产成人在线电影| 夜夜精品视频一区二区| 色综合久久久久综合99| 琪琪久久久久日韩精品| 亚洲日本va午夜在线电影| 911精品国产一区二区在线| 成人综合激情网| 亚洲成人激情综合网| 国产日韩精品一区二区三区| 国产麻豆9l精品三级站| 亚洲高清一区二区三区| 国产精品青草综合久久久久99| 国产sm精品调教视频网站| 一区二区三区蜜桃| 国产精品无码永久免费888| 7777精品伊人久久久大香线蕉完整版 | 在线精品视频免费观看| 国产精品夜夜嗨| 奇米精品一区二区三区四区 | 久88久久88久久久| 亚洲自拍偷拍网站| 国产精品国产精品国产专区不片| 成人免费毛片片v| 日韩理论在线观看| 久久久天堂av| 91影院在线免费观看| 国产麻豆一精品一av一免费| 轻轻草成人在线| 偷拍与自拍一区| 亚洲成人精品一区二区| 一区二区成人在线| 欧美一级二级在线观看| 欧美色成人综合| 欧洲精品在线观看| 久久99国产精品成人| 视频在线观看91| 亚洲综合免费观看高清完整版在线 | 国产精品欧美极品| 欧美激情中文不卡| 欧美在线免费观看亚洲| 美日韩一区二区| 欧美国产精品一区二区三区| 精品国产百合女同互慰| 日韩欧美精品在线| 精品久久国产老人久久综合| 欧美va天堂va视频va在线| 精品国产91乱码一区二区三区 | 亚洲曰韩产成在线| 亚洲精品乱码久久久久久| 一区二区三区在线看| ㊣最新国产の精品bt伙计久久| 欧美日韩国产成人在线91| 欧美精品久久一区| 日韩色在线观看| 91国偷自产一区二区开放时间 | 欧美视频一区二区三区在线观看| 蜜芽一区二区三区| 韩国成人在线视频| 国产99精品国产| 99这里只有精品| 欧美亚洲国产怡红院影院| 欧美性猛交xxxx黑人交| 91精品久久久久久蜜臀| 91香蕉视频黄| 欧美日韩三级一区二区| 欧美一级搡bbbb搡bbbb| 国产欧美1区2区3区| 亚洲日本一区二区三区| 日韩制服丝袜先锋影音| 国产最新精品精品你懂的| 成人国产精品视频| 欧美日韩国产123区| 精品久久久久久亚洲综合网| 中文字幕佐山爱一区二区免费| 精品国产免费久久| 亚洲欧洲美洲综合色网| 国产色91在线| 亚洲免费观看高清完整版在线观看| 久久婷婷久久一区二区三区| 国产精品女主播av| 久久综合九色综合欧美就去吻| 777xxx欧美| 国产精品久久久久久久久免费桃花 | 制服.丝袜.亚洲.中文.综合 | 国产成人精品午夜视频免费| 日韩专区在线视频| 国产99一区视频免费| 精品视频在线免费观看| 久久噜噜亚洲综合| 亚洲h动漫在线| jlzzjlzz欧美大全| 精品成人私密视频| 亚洲高清一区二区三区| 不卡一区二区三区四区| av激情成人网| 精品国产成人系列| 日韩黄色免费电影| 色哟哟国产精品免费观看| 久久免费视频色| 国产精品久久久久毛片软件| 国产精品国产三级国产aⅴ入口| 国产精品国产三级国产三级人妇| 中文字幕一区二区在线观看| 日本不卡中文字幕| 精品视频免费在线| 亚洲色图色小说| 国产精品一区在线观看乱码| 欧美一级高清片| 亚洲3atv精品一区二区三区| 91小视频免费观看| 中国av一区二区三区| 国产精品亚洲成人| 精品粉嫩超白一线天av| 国产精品三级av| 国产麻豆成人精品| 欧美sm极限捆绑bd| 免费在线观看成人| 欧美三日本三级三级在线播放| 日韩一级欧美一级| 亚洲第四色夜色| 欧美日韩一区二区三区视频| 亚洲乱码日产精品bd| 99久久777色| 亚洲猫色日本管| 91丝袜美女网| 欧美一级在线观看| 午夜精品影院在线观看| 欧美日韩国产小视频| 久久久久久亚洲综合| 国产一区二区免费在线| 久久综合av免费| 国产精品一级二级三级| 久久久久久夜精品精品免费| 国产美女av一区二区三区|