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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? i2c_slave_model.v

?? FPGA實(shí)現(xiàn)模擬I2C協(xié)議的過程
?? 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


?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
777色狠狠一区二区三区| 中文字幕欧美区| 久久久精品国产99久久精品芒果| 国产精品欧美精品| 奇米精品一区二区三区四区| 91欧美激情一区二区三区成人| 日韩欧美三级在线| 亚洲天堂网中文字| 国产一区二区视频在线| 欧美日韩一区二区三区免费看| 国产精品欧美久久久久无广告| 麻豆精品一区二区三区| 欧美日韩精品一区二区三区四区 | 捆绑变态av一区二区三区| 成人动漫一区二区| 久久综合国产精品| 男女视频一区二区| 欧美久久高跟鞋激| 午夜a成v人精品| 欧美专区在线观看一区| 成人欧美一区二区三区视频网页| 激情小说欧美图片| 欧美一区二区三区在线视频| 亚洲成人自拍偷拍| 91成人免费在线视频| 亚洲美女屁股眼交3| a亚洲天堂av| 中文字幕日韩精品一区| 波多野洁衣一区| 国产人妖乱国产精品人妖| 国产精品综合在线视频| www日韩大片| 激情小说亚洲一区| 久久九九全国免费| 福利电影一区二区| 国产日韩精品一区二区三区在线| 国产精品一区二区在线播放 | 国产精品一线二线三线精华| 欧美一区二区免费观在线| 婷婷综合另类小说色区| 91精品在线免费观看| 日韩中文字幕区一区有砖一区| 欧美三级在线视频| 天使萌一区二区三区免费观看| 91麻豆精品国产91久久久久| 免费黄网站欧美| 久久精品视频一区| 国产成人av网站| 中文字幕亚洲电影| 91成人免费在线视频| 日本亚洲电影天堂| 久久久九九九九| av亚洲精华国产精华精| 亚洲国产美国国产综合一区二区| 91精品啪在线观看国产60岁| 国模无码大尺度一区二区三区| 中文字幕精品一区| 日本韩国欧美一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久久99精品免费观看| 91浏览器打开| 日本成人在线一区| 国产精品你懂的| 在线电影国产精品| 国产成人精品1024| 亚洲一区二区3| 久久久久久久久97黄色工厂| 91免费国产在线| 麻豆国产欧美日韩综合精品二区| 欧美国产在线观看| 欧美精品一二三区| 北岛玲一区二区三区四区| 亚洲午夜免费电影| 国产丝袜欧美中文另类| 欧美日韩视频在线一区二区| 精品亚洲porn| 亚洲成人激情自拍| 国产精品麻豆久久久| 7777精品伊人久久久大香线蕉超级流畅| 麻豆freexxxx性91精品| 亚洲欧美国产毛片在线| 久久精品亚洲国产奇米99| 欧美亚洲综合另类| 成人一级片网址| 日韩制服丝袜av| ...av二区三区久久精品| 日韩欧美亚洲国产另类| 日本伦理一区二区| 国产成人自拍网| 日韩和的一区二区| 亚洲欧美韩国综合色| 欧美激情一区二区三区在线| 日韩欧美一级精品久久| 欧美日韩一区二区三区四区 | av一区二区久久| 国产在线一区观看| 日日摸夜夜添夜夜添精品视频 | 日韩精品福利网| 亚洲欧美日韩国产一区二区三区| 久久久99精品免费观看| 精品少妇一区二区三区在线播放 | 日韩福利视频导航| 亚洲综合视频网| 国产精品卡一卡二| 久久久亚洲国产美女国产盗摄 | 欧美视频完全免费看| 91一区二区在线观看| 丁香五精品蜜臀久久久久99网站| 麻豆国产精品官网| 久久精品国产久精国产爱| 日日噜噜夜夜狠狠视频欧美人| 亚洲在线视频免费观看| 亚洲综合一区二区三区| 亚洲人123区| 亚洲精品成人天堂一二三| 亚洲免费观看视频| 一区二区在线观看免费视频播放 | 色狠狠色狠狠综合| 97久久久精品综合88久久| av电影在线不卡| 色妞www精品视频| 欧美在线观看一区二区| 欧美精品第1页| 91麻豆精品国产91久久久久久久久| 欧美一区二区三区四区五区| 日韩手机在线导航| 欧美v国产在线一区二区三区| wwwwww.欧美系列| 国产欧美日韩麻豆91| 亚洲欧洲日韩一区二区三区| 亚洲乱码国产乱码精品精的特点 | 日韩一区二区在线看| 欧美va天堂va视频va在线| 久久久久久久久99精品| 亚洲欧美综合在线精品| 一区二区三区日韩精品| 午夜欧美2019年伦理| 激情欧美一区二区三区在线观看| 国产成人在线观看| 91小视频免费看| 在线91免费看| 国产日韩欧美麻豆| 一区二区激情视频| 久久av老司机精品网站导航| 国产99久久久精品| 欧美午夜一区二区三区| 精品不卡在线视频| 亚洲免费观看高清在线观看| 蜜臀99久久精品久久久久久软件| 粉嫩av一区二区三区| 欧美性受xxxx黑人xyx| 精品日韩99亚洲| 亚洲色图丝袜美腿| 黄网站免费久久| 91丨九色丨尤物| 91精品国产综合久久久久久久| 久久色.com| 亚洲国产色一区| 国产99久久久精品| 欧美高清视频一二三区| 国产精品少妇自拍| 日韩av中文在线观看| 不卡一区二区中文字幕| 日韩小视频在线观看专区| 自拍偷拍亚洲欧美日韩| 精品一区二区三区蜜桃| 在线一区二区三区四区五区| 2021中文字幕一区亚洲| 亚洲成年人网站在线观看| 国产成人日日夜夜| 日韩精品一区二区三区在线观看 | 日韩高清电影一区| 99精品国产一区二区三区不卡| 日韩免费电影网站| 一区av在线播放| 成人sese在线| 久久综合视频网| 免费三级欧美电影| 欧美日韩精品一区二区三区蜜桃| 国产精品入口麻豆九色| 国产曰批免费观看久久久| 5月丁香婷婷综合| 亚洲午夜三级在线| 日本韩国欧美一区| 亚洲婷婷综合色高清在线| 粉嫩av亚洲一区二区图片| 亚洲精品在线电影| 激情综合网天天干| 日韩午夜激情免费电影| 日本成人中文字幕| 88在线观看91蜜桃国自产| 亚洲成av人片在www色猫咪| 色哟哟国产精品免费观看| 最近日韩中文字幕| www.色综合.com| 中文字幕五月欧美| 色综合中文字幕国产| 亚洲国产裸拍裸体视频在线观看乱了| 国产成人在线网站| 国产精品婷婷午夜在线观看|