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

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

?? i2c_slave_model.v

?? FPGA數字電子系統設計與開發實例導航光盤內附源碼
?? V
字號:


`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一区二区三区免费野_久草精品视频
中文字幕不卡三区| 日本一区免费视频| 欧美午夜在线一二页| a级高清视频欧美日韩| 福利电影一区二区三区| 波多野结衣在线aⅴ中文字幕不卡| 国产精品亚洲视频| 成人免费福利片| 色婷婷av一区二区三区大白胸| av毛片久久久久**hd| 色域天天综合网| 欧美日韩一二三| 精品1区2区在线观看| 亚洲国产精品99久久久久久久久| 国产精品毛片高清在线完整版| 国产精品高潮久久久久无| 夜夜精品视频一区二区| 亚洲福利国产精品| 免费在线观看一区| 国产成人高清视频| 在线观看亚洲精品视频| 欧美一区日韩一区| 国产日韩在线不卡| 亚洲成人动漫av| 国产乱子伦视频一区二区三区| 成人av电影免费观看| 欧美高清激情brazzers| 久久午夜羞羞影院免费观看| 亚洲欧美一区二区三区国产精品 | xf在线a精品一区二区视频网站| 欧美videos中文字幕| 国产精品国产a级| 日本在线不卡一区| 成人精品亚洲人成在线| 欧美高清激情brazzers| 国产日韩精品一区二区浪潮av | 欧美精品vⅰdeose4hd| 精品国产乱码久久| 亚洲一区二区三区视频在线播放| 麻豆精品久久精品色综合| 91麻豆免费视频| 久久综合久色欧美综合狠狠| 亚洲国产精品一区二区www在线| 国产麻豆欧美日韩一区| 欧美福利视频一区| 亚洲视频免费在线观看| 国产精品自拍一区| 日韩你懂的在线观看| 五月婷婷激情综合| 99久久er热在这里只有精品66| 欧美一区二区三区电影| 亚洲妇女屁股眼交7| 91丨九色丨国产丨porny| 欧美国产精品v| 久草中文综合在线| 日韩一区二区在线观看视频播放| 亚洲成人自拍网| 欧美色区777第一页| 亚洲视频一区在线| 波多野结衣视频一区| 久久精品视频一区二区| 老司机精品视频在线| 欧美精品精品一区| 亚洲高清视频在线| 欧美系列在线观看| 一区二区三区四区国产精品| www..com久久爱| 国产精品每日更新在线播放网址 | 青草国产精品久久久久久| 欧美日韩一区 二区 三区 久久精品| 亚洲丝袜精品丝袜在线| 一本在线高清不卡dvd| 成人免费一区二区三区在线观看| 丁香另类激情小说| 中文字幕日本乱码精品影院| av中文字幕亚洲| 伊人开心综合网| 在线观看www91| 亚洲aⅴ怡春院| 欧美一卡二卡三卡| 久久99在线观看| 久久精品日韩一区二区三区| 国产成人精品免费| 亚洲视频狠狠干| 欧美日韩激情一区二区三区| 日韩av一区二| 国产欧美日韩精品在线| 91欧美一区二区| 视频一区二区三区入口| 精品奇米国产一区二区三区| 国产福利一区二区| 亚洲女爱视频在线| 欧美色图12p| 精品一区二区在线视频| 欧美激情自拍偷拍| 日本精品免费观看高清观看| 亚洲午夜久久久久久久久久久| 91精品婷婷国产综合久久竹菊| 国产一区二区三区免费播放| 国产精品久久国产精麻豆99网站| 欧美性色欧美a在线播放| 日本美女一区二区三区视频| 久久久久久夜精品精品免费| 99久久精品情趣| 五月天激情综合| 日本一区二区三区四区在线视频| 欧美在线你懂得| 国产一区二区福利视频| 亚洲一区二区三区在线播放 | 国产精品538一区二区在线| 国产精品青草综合久久久久99| 在线观看亚洲一区| 国内精品久久久久影院色| 国产精品久久久久久久久久免费看| 欧美日韩在线三级| 国产成人免费高清| 日产精品久久久久久久性色| 中文字幕一区在线观看视频| 91精品黄色片免费大全| 91在线视频18| 激情六月婷婷久久| 午夜精品久久久久久久久久久 | 欧美在线观看视频一区二区三区| 国产精品影视在线观看| 午夜精品久久久久久久99水蜜桃| 久久久www成人免费毛片麻豆| 在线亚洲免费视频| 成人免费va视频| 精品一区二区三区视频| 亚洲第一电影网| 亚洲精选视频在线| 国产亚洲va综合人人澡精品 | 中日韩av电影| 欧美成人一区二区三区在线观看| 欧美色手机在线观看| 99精品视频在线免费观看| 国产伦精品一区二区三区免费 | 激情都市一区二区| 亚洲高清在线视频| 亚洲一区自拍偷拍| 一卡二卡欧美日韩| 亚洲美女在线一区| 国产女主播视频一区二区| 日韩欧美在线网站| 91麻豆精品国产自产在线| 欧美中文字幕一二三区视频| 91在线视频播放地址| 99久久精品99国产精品| 99视频一区二区| aa级大片欧美| 91同城在线观看| 日本韩国欧美在线| 在线观看亚洲精品| 欧美久久久久中文字幕| 欧美人狂配大交3d怪物一区| 欧美精品乱码久久久久久按摩| 欧美日本在线看| 在线不卡的av| 欧美大片在线观看一区二区| 欧美白人最猛性xxxxx69交| 日韩欧美aaaaaa| 国产亚洲自拍一区| 中文字幕日韩av资源站| 一区二区三区免费观看| 亚洲123区在线观看| 日本 国产 欧美色综合| 国产一区二区h| 99久久久国产精品| 欧美日韩免费电影| 精品国产一区二区三区久久久蜜月| 精品精品国产高清a毛片牛牛| 精品欧美一区二区在线观看 | 欧美怡红院视频| 91精品久久久久久久91蜜桃 | 97久久精品人人做人人爽| 99re这里只有精品视频首页| 欧美蜜桃一区二区三区| 精品黑人一区二区三区久久| 国产精品伦理在线| 一区二区三区.www| 麻豆91在线看| 色综合久久综合网| 欧美一区二区精美| 日韩一区有码在线| 日本三级亚洲精品| 99久久精品免费| 91精品欧美综合在线观看最新| 久久精品网站免费观看| 亚洲综合色丁香婷婷六月图片| 美国十次综合导航| 色先锋资源久久综合| 欧美成人女星排名| 亚洲一区av在线| 国产成人免费高清| 7777精品伊人久久久大香线蕉完整版 | 国产人久久人人人人爽| 亚洲黄色小说网站| 粉嫩av一区二区三区在线播放 | 国产精品伊人色| 欧美酷刑日本凌虐凌虐|