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

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

?? i2c_slave_model.v

?? 一般網(wǎng)站上都有i2c master模塊的代碼,但很少有slave的代碼,這里就是slave的代碼,非常有用.
?? V
字號:
`timescale 1ns/10ps
module i2c_slave_model(sda_en,sda_in,sda_out,scl,reset,chip_address,chip_outdata,chip_inputdata,cpu_cs,cpu_we);
input scl;

input sda_in;
output sda_out;
output sda_en;
input reset;

//-----added today----------
output [7:0] chip_address;
output [7:0] chip_outdata;
input  [7:0] chip_inputdata;
output cpu_cs;
output cpu_we;
reg cpu_cs;
//--------------define the port address-------------------------
parameter I2C_ADR = 7'b0010_000;
//--------------the test memory space---------------------------
reg [7:0] mem [255:0]; 
reg [7:0] mem_adr;   
//--------------general register declearation------------------
reg ld;
reg [2:0] bit_cnt;
reg data_out;
reg write_enable;
assign sda_out=data_out;

parameter idle        = 3'b000;//---------------------0
parameter slave_ack   = 3'b001;//---------------------1
parameter get_mem_adr = 3'b010;//---------------------2
parameter gma_ack     = 3'b011;//---------------------3
parameter data        = 3'b100;//---------------------4
parameter data_ack    = 3'b101;//---------------------5

reg [2:0] state; 
reg [2:0] start_rw;
reg rw;
reg [7:0] mem_do;
reg  sda_o;
wire debug = 1'b1;

//--------------detect the start condition----------------------
reg start;
wire start_reset_n;
assign start_reset_n=reset & (scl | sda_in);
always @(negedge sda_in or negedge start_reset_n)
begin
  if(~start_reset_n)
    start<= 1'b0;
  else
    if(scl)
    start<= 1'b1; 
    else
    start<= 1'b0;
end
//---------------detect the stop condition-----------------------
reg stop;
wire stop_reset_n;
assign stop_reset_n=reset &(scl | sda_in);
always @(posedge sda_in or negedge stop_reset_n)
begin
if(~stop_reset_n)
  stop<=1'b0;
else
  begin
  if(scl)
  stop<=1'b1;
  else
  stop<=1'b0;
  end
end
//--------------shift the receive data bus------------------------
reg [7:0] src;
always @(negedge scl)
begin
  if(start==1'b1) begin
  src <= 8'b0;
  end
  else begin
  src <= {src[6:0],sda_in};
  end
end
//--------------------------------------------------------------------
//--------------------------------------------------------------------
//--------------------------------------------------------------------
reg [3:0] count;
always @(posedge scl or posedge start)
begin
if(start)
  count <= 4'b0000;
else
  begin
  if (count==4'd9)
    count <= count;
  else
    count <= count + 1'b1;
  end
end

//---------------judge if the address is my own--------------------
wire my_adr;
assign my_adr = (src[6:0] == I2C_ADR);
//------------------generate done signal--------------------------
wire acc_done;
assign acc_done = !(|bit_cnt);
//-----------generate the muti_reset signal----------------------- 
wire reverse_reset;
assign reverse_reset=~reset;
wire combine;
assign combine = start | stop | reverse_reset;
//-----------the state machine------------------------------------

always @ (negedge scl or posedge combine)
begin
if(combine)
  begin
  sda_o <= 1'b1;
  state <=  idle; // reset statemachine
  ld    <=  1'b1;
  bit_cnt<= 3'b111;
  cpu_cs <= 1'b1;
  end
else	
  begin
 //  ld    <=  1'b0;
//   sda_o <=  1'b1;
   case (state)
   idle: 
         begin
   	     bit_cnt <=  bit_cnt - 3'b1;
		     if(acc_done && my_adr && count==4'd8) begin
		      state <=  slave_ack;
	         sda_o <=  1'b0; // generate i2c_ack
		      data_out <= 1'b0;
			//if(rw)
	        //mem_do <=  mem[mem_adr];
		     end
   	   end
   slave_ack: 
         begin     
	       bit_cnt <= 3'b111; 
           
		    if(rw) begin
	        state <=  data;
	        sda_o <=  1'b0;
	        cpu_cs<=  1'b0;
			  data_out <= mem_do[7];//**//**//**//**//**//**
			  //mem_do <=  mem[mem_adr];=========================================
		     end
	       
			else
	         begin
				state <=  get_mem_adr;
		      ld    <=  1'b1;
	     		sda_o <= 1'b1;
				cpu_cs<=1'b1;
				end
		  end
    get_mem_adr: // wait for memory address
	     begin
		    bit_cnt <=  bit_cnt - 3'b1;
		    if(acc_done)
	         begin
	         state <=  gma_ack;
	         data_out <= 1'b0;   
	         sda_o <=  1'b0; // generate i2c_ack, for valid address
		      cpu_cs<= 1'b1;
				end
    	  end
    gma_ack:
	     begin
	       bit_cnt <= 3'b111;
		    ld    <=  1'b1;
	       mem_adr <=  src; // store memory address
		    state <=  data;
		    sda_o <= 1'b1;
		    cpu_cs<=1'b1;
		  end
    	data: // receive or drive data
	     begin
	       bit_cnt <=  bit_cnt - 3'b1;
		    if(rw)
	         begin
		        sda_o <= 1'b0;
		        data_out <= mem_do[7];//**//**//**//**//**//**

				  if(acc_done) begin
		         mem_adr <=  mem_adr + 8'h1;
		    	   sda_o<=1'b1;
				   cpu_cs <=1'b1;
				   state <= data_ack;
				  end
		        else
				  cpu_cs <= 1'b0;
				end
		  else
		    begin
		  	 if(acc_done)
	          begin
	            state <= data_ack;   
	            //write_enable<=1'b1;
	            sda_o <=  1'b0; // send ack on write, receive ack on read
			      cpu_cs<=1'b1;
				 end
          end
		  
	      end
	  data_ack:
	        begin
	          ld <=  1'b1;
               bit_cnt <= 3'b111;
			if(rw)
	             begin
			    	  
			       if(sda_in) // read operation && master send NACK
	               begin
	                 state <=  idle;
	                 sda_o <=  1'b1;
	                 cpu_cs<= 1'b0;
						end
	             else
	                begin
	                  state <=  data;
	                  sda_o <=  1'b0;
	                	data_out <= mem_do[7];//**//**//**//**//**//**
							//data_out<=1'b0;////////////////////////////////////////////
						   cpu_cs<=1'b0;
						 end
	             end 
			 else
	              begin
	            cpu_cs<=1'b1;    
			      mem_adr <=  mem_adr + 8'h1; 
				   mem[mem_adr] <= src; 
				   state <=  data;
	            sda_o <=  1'b1;
	              end
	         end            
			    
			    
    endcase
  end 
end


//--------------------------------------------------------------------
always @(negedge scl or posedge combine)
begin
if(combine)
  write_enable<=1'b0;
else 
  begin
    if(state==data && acc_done && ~rw)  
      write_enable <= 1'b1;
    else
      write_enable <= 1'b0;
  end
end



always @(posedge scl or negedge reset)
begin
 if(~reset)
 mem_do <= 8'b0;
 else begin
  if(~rw)
   mem_do <= chip_inputdata;//------------------------------5:00
  else
    begin
	   if(state==data_ack || state==slave_ack)
		  mem_do <=chip_inputdata;//--------------------------5:00
		else 
		  mem_do <= {mem_do[6:0], 1'b1};
    end
  end
end

 
assign sda_en=sda_o;
assign chip_address=mem_adr;
assign chip_outdata=src[7:0];
//////////////////////////////////////////////////////////////////////////
always @(posedge scl)
begin
if(count==4'd8)
 rw <=  src[0];
else
 rw <= rw;
end
//////////////////////////////////////////////////////////////////////////
/*
always @(posedge scl)
begin
if(~rw && state==data_ack)
  write_enable <= 1'b1;
else
  write_enable <= 1'b0;
end
*/
assign cpu_we=write_enable;


endmodule

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产69精品一区二区亚洲孕妇| 精品国产伦一区二区三区观看体验 | 国产.精品.日韩.另类.中文.在线.播放 | 17c精品麻豆一区二区免费| 久久精品人人爽人人爽| 2023国产精品| 2023国产精华国产精品| 日韩免费高清电影| 日韩一级大片在线| 欧美一区二区三区四区五区| 欧美女孩性生活视频| 欧美福利一区二区| 欧美精品123区| 欧美大白屁股肥臀xxxxxx| 欧美一区二区在线观看| 日韩一区二区三区在线观看| 欧美日韩国产小视频在线观看| 欧美性受极品xxxx喷水| 宅男噜噜噜66一区二区66| 欧美一级艳片视频免费观看| 欧美精品 日韩| 欧美大肚乱孕交hd孕妇| 久久精品夜夜夜夜久久| 国产精品理论片在线观看| 亚洲日本在线观看| 亚洲猫色日本管| 亚洲成人1区2区| 五月天欧美精品| 国产主播一区二区| aaa欧美大片| 精品视频在线免费观看| 91精品一区二区三区久久久久久 | 日韩欧美国产1| 欧美成人高清电影在线| 久久精品男人的天堂| 国产精品乱子久久久久| 亚洲综合无码一区二区| 日本成人在线一区| 国产一区二区91| 成人免费视频一区二区| 色欲综合视频天天天| 在线综合+亚洲+欧美中文字幕| 久久久综合九色合综国产精品| 国产精品伦一区二区三级视频| 亚洲成人激情综合网| 精品一区二区三区免费视频| 成人高清av在线| 欧美日韩亚洲另类| 久久久天堂av| 亚洲激情图片qvod| av男人天堂一区| 欧美午夜一区二区三区| 亚洲精品一区二区在线观看| 亚洲视频免费观看| 美女看a上一区| 97se亚洲国产综合自在线观| 欧美日本精品一区二区三区| 欧美—级在线免费片| 性做久久久久久免费观看欧美| 国产成人综合视频| 欧美理论片在线| 国产精品国产三级国产三级人妇| 亚洲第一狼人社区| caoporn国产精品| 欧美一级二级三级乱码| 亚洲欧美日韩久久精品| 美国精品在线观看| 欧美在线一二三四区| 国产日韩欧美高清| 日韩国产欧美在线视频| 99久久er热在这里只有精品66| 欧美电视剧在线观看完整版| 亚洲国产精品精华液网站| 成人高清免费在线播放| 亚洲精品在线观看网站| 午夜成人在线视频| 99精品国产热久久91蜜凸| 26uuu亚洲| 天天综合网 天天综合色| 91免费观看视频| 国产日韩欧美高清在线| 精品亚洲成a人在线观看| 欧美三级午夜理伦三级中视频| 国产精品成人午夜| 国产精品一二三四| 日韩免费视频一区二区| 亚洲成人7777| 91电影在线观看| 中文字幕一区日韩精品欧美| 国产一区二区精品久久91| 日韩欧美国产高清| 男人的j进女人的j一区| 欧美久久高跟鞋激| 亚洲成人免费在线| 色婷婷精品久久二区二区蜜臀av| 中文字幕永久在线不卡| 国产盗摄精品一区二区三区在线 | 日韩一区二区三区四区| 五月天久久比比资源色| 欧美人与z0zoxxxx视频| 亚洲影院免费观看| 在线视频你懂得一区| 亚洲色图一区二区三区| jiyouzz国产精品久久| 国产精品你懂的| 福利一区二区在线观看| 中文字幕欧美激情| 国产91丝袜在线播放0| 国产天堂亚洲国产碰碰| 国产宾馆实践打屁股91| 国产亚洲欧美在线| 风间由美一区二区三区在线观看| 中文字幕精品在线不卡| 国产成人午夜精品影院观看视频| 国产亚洲一区字幕| 成人av在线电影| 中文字幕二三区不卡| jiyouzz国产精品久久| 亚洲视频小说图片| 91麻豆高清视频| 亚洲高清中文字幕| 日韩一二三四区| 韩国精品一区二区| 欧美激情中文字幕一区二区| 99视频一区二区| 一区二区三区在线视频观看58 | 国产精品久久毛片a| 色婷婷综合久色| 午夜不卡av免费| 欧美不卡123| 懂色中文一区二区在线播放| 综合久久久久综合| 欧美日韩在线不卡| 麻豆极品一区二区三区| 久久亚洲精精品中文字幕早川悠里| 国产精品综合久久| 亚洲日本在线视频观看| 欧美国产综合一区二区| 91蜜桃在线免费视频| 日韩精品中午字幕| 国产精品久久久久久久久动漫 | 久久99国产乱子伦精品免费| 国产午夜精品一区二区| 91色视频在线| 日韩在线观看一区二区| 久久久av毛片精品| 日本韩国欧美一区| 精品一区二区三区视频在线观看| 国产精品乱人伦中文| 欧美日韩免费视频| 国产精品一区二区久久精品爱涩| 一区二区三区av电影| 精品国产亚洲一区二区三区在线观看| www.久久精品| 老汉av免费一区二区三区| 国产精品每日更新| 日韩视频在线一区二区| 99久久婷婷国产| 蜜桃91丨九色丨蝌蚪91桃色| 成人免费在线观看入口| 日韩欧美在线影院| 91久久精品一区二区三| 激情久久久久久久久久久久久久久久| 亚洲欧美综合另类在线卡通| 欧美大片一区二区| 欧美视频在线一区二区三区| 国产成人精品免费视频网站| 日日噜噜夜夜狠狠视频欧美人| 国产精品久久久久久久裸模| 91精品国产免费久久综合| av不卡一区二区三区| 狠狠狠色丁香婷婷综合久久五月| 亚洲成人免费影院| 日韩美女视频19| 久久亚洲欧美国产精品乐播| 91精品黄色片免费大全| 色婷婷久久综合| av中文字幕亚洲| 国产精品一级黄| 美女网站一区二区| 亚洲一区二区三区激情| 国产精品色眯眯| 亚洲精品在线观看网站| 欧美在线观看一二区| 成人黄色在线网站| 国产电影一区在线| 久草中文综合在线| 婷婷开心激情综合| 一区二区三区加勒比av| 国产精品久久久久永久免费观看 | 亚洲欧洲精品一区二区精品久久久| 日韩精品中文字幕一区| 欧美嫩在线观看| 欧洲国内综合视频| 在线亚洲免费视频| 色综合久久久久综合体桃花网| 国产成人精品免费网站| 国产一区二区精品在线观看| 精品一二三四区| 精品一区二区三区在线观看|