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

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

?? i2c_master_bit_ctrl.vhd

?? i2c IP核 i2c.master i2c.mater.v
?? VHD
字號:
---------------------------------------------------------------------
----                                                             ----
----  WISHBONE revB2 compl. I2C Master Core; bit-controller      ----
----                                                             ----
----                                                             ----
----  Author: Richard Herveille                                  ----
----          richard@asics.ws                                   ----
----          www.asics.ws                                       ----
----                                                             ----
----  Downloaded from: http://www.opencores.org/projects/i2c/    ----
----                                                             ----
---------------------------------------------------------------------
----                                                             ----
---- Copyright (C) 2000 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_master_bit_ctrl.vhd,v 1.1 2004/09/23 07:22:48 acroslan Exp $
--
--  $Date: 2004/09/23 07:22:48 $
--  $Revision: 1.1 $
--  $Author: acroslan $
--  $Locker:  $
--  $State: Exp $
--
-- Change History:
--               $Log: i2c_master_bit_ctrl.vhd,v $
--               Revision 1.1  2004/09/23 07:22:48  acroslan
--               I2C checked in
--
--               Revision 1.3  2002/10/30 18:09:53  rherveille
--               Fixed some reported minor start/stop generation timing issuess.
--
--               Revision 1.2  2002/06/15 07:37:04  rherveille
--               Fixed a small timing bug in the bit controller.\nAdded verilog simulation environment.
--
--               Revision 1.1  2001/11/05 12:02:33  rherveille
--               Split i2c_master_core.vhd into separate files for each entity; same layout as verilog version.
--               Code updated, is now up-to-date to doc. rev.0.4.
--               Added headers.
--


--
-------------------------------------
-- Bit controller section
------------------------------------
--
-- Translate simple commands into SCL/SDA transitions
-- Each command has 5 states, A/B/C/D/idle
--
-- start:	SCL	~~~~~~~~~~\____
--	SDA	~~~~~~~~\______
--		 x | A | B | C | D | i
--
-- repstart	SCL	____/~~~~\___
--	SDA	__/~~~\______
--		 x | A | B | C | D | i
--
-- stop	SCL	____/~~~~~~~~
--	SDA	==\____/~~~~~
--		 x | A | B | C | D | i
--
--- write	SCL	____/~~~~\____
--	SDA	==X=========X=
--		 x | A | B | C | D | i
--
--- read	SCL	____/~~~~\____
--	SDA	XXXX=====XXXX
--		 x | A | B | C | D | i
--

-- Timing:      Normal mode     Fast mode
-----------------------------------------------------------------
-- Fscl         100KHz          400KHz
-- Th_scl       4.0us           0.6us   High period of SCL
-- Tl_scl       4.7us           1.3us   Low period of SCL
-- Tsu:sta      4.7us           0.6us   setup time for a repeated start condition
-- Tsu:sto      4.0us           0.6us   setup time for a stop conditon
-- Tbuf         4.7us           1.3us   Bus free time between a stop and start condition
--

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;

entity i2c_master_bit_ctrl is
	generic(
		Tcq : time := 1 ns
	);
	port (
		clk    : in std_logic;
		rst    : in std_logic;
		nReset : in std_logic;
		ena    : in std_logic;				-- core enable signal

		clk_cnt : in unsigned(15 downto 0);		-- clock prescale value

		cmd     : in std_logic_vector(3 downto 0);
		cmd_ack : out std_logic;
		busy    : out std_logic;

		din  : in std_logic;
		dout : out std_logic;

		-- i2c lines
		scl_i   : in std_logic;  -- i2c clock line input
		scl_o   : out std_logic; -- i2c clock line output
		scl_oen : out std_logic; -- i2c clock line output enable, active low
		sda_i   : in std_logic;  -- i2c data line input
		sda_o   : out std_logic; -- i2c data line output
		sda_oen : out std_logic  -- i2c data line output enable, active low
	);
end entity i2c_master_bit_ctrl;

architecture structural of i2c_master_bit_ctrl is
	constant I2C_CMD_NOP    : std_logic_vector(3 downto 0) := "0000";
	constant I2C_CMD_START  : std_logic_vector(3 downto 0) := "0001";
	constant I2C_CMD_STOP   : std_logic_vector(3 downto 0) := "0010";
	constant I2C_CMD_READ   : std_logic_vector(3 downto 0) := "0100";
	constant I2C_CMD_WRITE  : std_logic_vector(3 downto 0) := "1000";

	type states is (idle, start_a, start_b, start_c, start_d, start_e, 
	                stop_a, stop_b, stop_c, stop_d, rd_a, rd_b, rd_c, rd_d, wr_a, wr_b, wr_c, wr_d);
	signal c_state : states;

	signal iscl_oen, isda_oen : std_logic;          -- internal I2C lines
	signal sSCL, sSDA         : std_logic;          -- synchronized SCL and SDA inputs
	signal dscl_oen           : std_logic;          -- delayed scl_oen signals

	signal clk_en, slave_wait :std_logic;           -- clock generation signals
--	signal cnt : unsigned(15 downto 0) := clk_cnt;  -- clock divider counter (simulation)
	signal cnt : unsigned(15 downto 0);             -- clock divider counter (synthesis)

begin
	-- synchronize SCL and SDA inputs
	synch_scl_sda: process(clk)
	begin
	    if (clk'event and clk = '1') then
	      sSCL <= scl_i after Tcq;
	      sSDA <= sda_i after Tcq;
	    end if;
	end process synch_SCL_SDA;

	-- delay scl_oen
	process (clk)
	begin
	    if (clk'event and clk = '1') then
	      dscl_oen <= iscl_oen after Tcq;
	    end if;
	end process;

	-- whenever the slave is not ready it can delay the cycle by pulling SCL low
	slave_wait <= dscl_oen and not sSCL;

	-- generate clk enable signal
	gen_clken: process(clk, nReset)
	begin
	    if (nReset = '0') then
	      cnt    <= (others => '0') after Tcq;
	      clk_en <= '1' after Tcq;
	    elsif (clk'event and clk = '1') then
	      if (rst = '1') then
	        cnt    <= (others => '0') after Tcq;
	        clk_en <= '1' after Tcq;
	      else
	        if ( (cnt = 0) or (ena = '0') ) then
	          clk_en <= '1' after Tcq;
	          cnt    <= clk_cnt after Tcq;
	        else
	          if (slave_wait = '0') then
	            cnt <= cnt -1 after Tcq;
	          end if;
	          clk_en <= '0' after Tcq;
	        end if;
	      end if;
	    end if;
	end process gen_clken;


	-- generate bus status controller
	bus_status_ctrl: block
	  signal dSDA : std_logic;
	  signal sta_condition : std_logic;
	  signal sto_condition : std_logic;

	  signal ibusy : std_logic;
	begin
	    -- detect start condition => detect falling edge on SDA while SCL is high
	    -- detect stop condition  => detect rising edge on SDA while SCL is high
	    detect_sta_sto: process(clk)
	    begin
	        if (clk'event and clk = '1') then
	          dSDA <= sSDA; -- generate a delayed version of sSDA

	          sta_condition <= (not sSDA and dSDA) and sSCL;
	          sto_condition <= (sSDA and not dSDA) and sSCL;
	        end if;
	    end process detect_sta_sto;

	    -- generate bus busy signal
	    gen_busy: process(clk, nReset)
	    begin
	        if (nReset = '0') then
	          ibusy <= '0' after Tcq;
	        elsif (clk'event and clk = '1') then
	          if (rst = '1') then
	            ibusy <= '0' after Tcq;
	          else
	            ibusy <= (sta_condition or ibusy) and not sto_condition after Tcq;
	          end if;
	        end if;
	    end process gen_busy;

	    -- assign output
	    busy <= ibusy;
	end block bus_status_ctrl;


	-- generate statemachine
	nxt_state_decoder : process (clk, nReset, c_state, cmd)
	  variable nxt_state : states;
	  variable icmd_ack, store_sda : std_logic;
	begin
	    nxt_state := c_state;

	    icmd_ack := '0'; -- default no acknowledge

	    store_sda := '0';

	    case (c_state) is
	      -- idle
	      when idle =>
	        case cmd is
	          when I2C_CMD_START =>
	            nxt_state := start_a;

	          when I2C_CMD_STOP =>
	            nxt_state := stop_a;

	          when I2C_CMD_WRITE =>
	            nxt_state := wr_a;

	          when I2C_CMD_READ =>
	            nxt_state := rd_a;

	          when others =>  -- NOP command
	            nxt_state := idle;
	        end case;

	      -- start
	      when start_a =>
	        nxt_state := start_b;

	      when start_b =>
	        nxt_state := start_c;

	      when start_c =>
	        nxt_state := start_d;

	      when start_d =>
	        nxt_state := start_e;

	      when start_e =>
	        nxt_state := idle;
	        icmd_ack := '1'; -- command completed

	      -- stop
	      when stop_a =>
	        nxt_state := stop_b;

	      when stop_b =>
	        nxt_state := stop_c;

	      when stop_c =>
	        nxt_state := stop_d;

	      when stop_d =>
	        nxt_state := idle;
	        icmd_ack := '1'; -- command completed

	      -- read
	      when rd_a =>
	        nxt_state := rd_b;

	      when rd_b =>
	        nxt_state := rd_c;

	      when rd_c =>
	        nxt_state := rd_d;
	        store_sda := '1';

	      when rd_d =>
	        nxt_state := idle;
	        icmd_ack := '1'; -- command completed

	      -- write
	      when wr_a =>
	        nxt_state := wr_b;

	      when wr_b =>
	        nxt_state := wr_c;

	      when wr_c =>
	        nxt_state := wr_d;

	      when wr_d =>
	        nxt_state := idle;
	        icmd_ack := '1'; -- command completed

	    end case;

	    -- generate regs
	    if (nReset = '0') then
	      c_state <= idle after Tcq;
	      cmd_ack <= '0' after Tcq;
	      Dout    <= '0' after Tcq;
	    elsif (clk'event and clk = '1') then
	      if (rst = '1') then
	        c_state <= idle after Tcq;
	        cmd_ack <= '0' after Tcq;
	        Dout    <= '0' after Tcq;
	      elsif (clk_en = '1') then
	        c_state <= nxt_state after Tcq;

	        if (store_sda = '1') then
	          dout <= sSDA after Tcq;
	        end if;
	      end if;

	      cmd_ack <= icmd_ack and clk_en;
	    end if;
	end process nxt_state_decoder;

	--
	-- convert states to SCL and SDA signals
	--
	output_decoder: process (clk, nReset, c_state, iscl_oen, isda_oen, din)
	  variable iscl, isda : std_logic;
	begin
	    case (c_state) is
	      -- idle
	      when idle =>
	        iscl := iscl_oen; -- keep SCL in same state
	        isda := isda_oen; -- keep SDA in same state

	      -- start
	      when start_a =>
	        iscl := iscl_oen; -- keep SCL in same state (for repeated start)
	        isda := '1';      -- set SDA high

	      when start_b =>
	        iscl := '1'; -- set SCL high
	        isda := '1'; -- keep SDA high

	      when start_c =>
	        iscl := '1'; -- keep SCL high
	        isda := '0'; -- set SDA low

	      when start_d =>
	        iscl := '1'; -- keep SCL high
	        isda := '0'; -- keep SDA low

	      when start_e =>
	        iscl := '0'; -- set SCL low
	        isda := '0'; -- keep SDA low

	      -- stop
	      when stop_a =>
	        iscl := '0'; -- keep SCL disabled
	        isda := '0'; -- set SDA low

	      when stop_b =>
	         iscl := '1'; -- set SCL high
	         isda := '0'; -- keep SDA low

	      when stop_c =>
	         iscl := '1'; -- keep SCL high
	         isda := '0'; -- keep SDA low

	      when stop_d =>
	        iscl := '1'; -- keep SCL high
	        isda := '1'; -- set SDA high

	      -- write
	      when wr_a =>
	        iscl := '0'; -- keep SCL low
	        isda := din; -- set SDA

	      when wr_b =>
	        iscl := '1'; -- set SCL high
	        isda := din; -- keep SDA

	      when wr_c =>
	        iscl := '1'; -- keep SCL high
	        isda := din; -- keep SDA

	      when wr_d =>
	        iscl := '0'; -- set SCL low
	        isda := din; -- keep SDA

	      -- read
	      when rd_a =>
	        iscl := '0'; -- keep SCL low
	        isda := '1'; -- tri-state SDA

	      when rd_b =>
	        iscl := '1'; -- set SCL high
	        isda := '1'; -- tri-state SDA

	      when rd_c =>
	        iscl := '1'; -- keep SCL high
	        isda := '1'; -- tri-state SDA

	      when rd_d =>
	        iscl := '0'; -- set SCL low
	        isda := '1'; -- tri-state SDA
	    end case;

	    -- generate registers
	    if (nReset = '0') then
	      iscl_oen <= '1' after Tcq;
	      isda_oen <= '1' after Tcq;
	    elsif (clk'event and clk = '1') then
	      if (rst = '1') then
	        iscl_oen <= '1' after Tcq;
	        isda_oen <= '1' after Tcq;
	      elsif (clk_en = '1') then
	        iscl_oen <= iscl after Tcq;
	        isda_oen <= isda after Tcq;
	      end if;
	    end if;
	end process output_decoder;

	-- assign outputs
	scl_o   <= '0';
	scl_oen <= iscl_oen;
	sda_o   <= '0';
	sda_oen <= isda_oen;
end architecture structural;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
岛国精品一区二区| 6080国产精品一区二区| 欧美日韩一区小说| 欧美精品一区二区三区在线播放 | 国产综合色视频| 99久久伊人精品| 精品国产免费一区二区三区香蕉| 亚洲视频一区二区在线| 国产在线播放一区三区四| 日本韩国视频一区二区| 久久精品这里都是精品| 日韩国产一二三区| 97久久超碰精品国产| 久久久精品免费网站| 午夜视频在线观看一区二区| av亚洲产国偷v产偷v自拍| 日韩一区二区三区视频| 亚洲成年人影院| 色综合亚洲欧洲| 中文字幕第一区第二区| 精品一区二区免费在线观看| 91精品国产综合久久福利软件 | 在线播放一区二区三区| 亚洲色图欧美偷拍| proumb性欧美在线观看| 国产女主播视频一区二区| 久久国产婷婷国产香蕉| 337p亚洲精品色噜噜狠狠| 一区二区三国产精华液| av电影在线观看一区| 国产精品视频免费| 国产精品69毛片高清亚洲| 精品国产乱码久久久久久影片| 亚洲chinese男男1069| 欧美色窝79yyyycom| 亚洲午夜视频在线观看| 欧美性xxxxx极品少妇| 亚洲一区二区偷拍精品| 欧美亚洲一区二区在线| 亚洲国产一区二区在线播放| 欧美卡1卡2卡| 麻豆精品国产91久久久久久| 欧美变态凌虐bdsm| 国产美女视频一区| 国产日韩欧美麻豆| 99精品视频在线播放观看| 国产精品成人网| 色素色在线综合| 丝袜美腿亚洲一区| 精品福利一区二区三区免费视频| 国产一区二区久久| 亚洲欧美激情视频在线观看一区二区三区| av激情综合网| 日韩影院免费视频| 欧美电影免费观看高清完整版 | 国产寡妇亲子伦一区二区| 日本一区二区三区在线不卡| gogo大胆日本视频一区| 亚洲图片欧美色图| 日韩欧美高清在线| 成人高清av在线| 午夜视频一区二区| 久久久久久影视| 在线观看一区不卡| 美女被吸乳得到大胸91| 国产精品国产三级国产普通话三级| 色猫猫国产区一区二在线视频| 日韩电影在线一区二区| 国产偷国产偷亚洲高清人白洁| 91亚洲精品乱码久久久久久蜜桃| 亚洲一区在线观看免费| 欧美mv日韩mv国产网站app| 成人性生交大片免费看中文网站| 亚洲国产成人tv| 欧美极品美女视频| 538在线一区二区精品国产| 国产精品99久久久| 亚洲成人免费在线| 亚洲国产经典视频| 日韩视频一区在线观看| 色综合激情五月| 国产成人三级在线观看| 亚洲成人在线网站| 亚洲三级在线观看| 精品国产一区二区三区av性色 | 精品一区二区在线视频| 一区二区三区国产豹纹内裤在线| 精品欧美乱码久久久久久| 91福利在线免费观看| 国产成人鲁色资源国产91色综 | 激情综合色综合久久综合| 精品一区二区三区不卡| 一个色妞综合视频在线观看| 国产日本一区二区| 精品日韩一区二区三区| 欧美另类久久久品| 色综合中文字幕| www.亚洲激情.com| 国内精品写真在线观看| 日韩精品久久理论片| 亚洲激情在线激情| 国产欧美一区二区精品仙草咪| 91精品国产一区二区三区蜜臀| 在线日韩一区二区| 91麻豆精品秘密| 91视视频在线直接观看在线看网页在线看 | 日韩一卡二卡三卡| 欧美日韩不卡一区二区| 色婷婷国产精品| 91久久香蕉国产日韩欧美9色| a级精品国产片在线观看| 高清不卡在线观看av| 国产精品影视在线| 国产精品一区二区无线| 精品一区二区三区免费视频| 久久精品国产第一区二区三区| 婷婷久久综合九色综合绿巨人 | 久久综合999| 精品国产自在久精品国产| 日韩午夜小视频| 欧美草草影院在线视频| 亚洲第一会所有码转帖| 亚洲高清免费观看| 偷拍一区二区三区四区| 丝袜美腿亚洲色图| 日韩电影在线一区二区| 美女视频黄频大全不卡视频在线播放| 日本不卡视频在线| 精品亚洲成a人| 国产成人啪免费观看软件| 成人免费视频国产在线观看| 99久久精品国产导航| 欧洲视频一区二区| 91麻豆精品久久久久蜜臀| 日韩三级视频在线观看| 国产亚洲欧美一级| 亚洲欧美自拍偷拍色图| 亚洲国产综合91精品麻豆| 免费高清在线一区| 国产·精品毛片| 色悠久久久久综合欧美99| 欧美色爱综合网| 精品国产免费视频| 国产精品福利影院| 亚洲午夜视频在线| 国产精品亚洲专一区二区三区 | 久久久久国产精品人| 1024国产精品| 日韩成人一级大片| 国产xxx精品视频大全| 91久久精品一区二区三| 日韩欧美国产麻豆| 综合久久久久久| 午夜精品久久久久久久久| 国产一区二区免费看| 国产精品成人一区二区艾草| 亚洲电影第三页| 丁香桃色午夜亚洲一区二区三区| 日本高清不卡在线观看| 亚洲精品一线二线三线| 一区二区三区四区在线免费观看| 免费在线观看日韩欧美| 91污在线观看| 精品成人私密视频| 亚洲国产成人av网| 成人激情视频网站| 日韩视频一区在线观看| 亚洲激情图片qvod| 国产精品一区久久久久| 欧美日韩国产在线播放网站| 国产欧美一区二区三区沐欲| 日本在线观看不卡视频| 9久草视频在线视频精品| 精品久久人人做人人爱| 夜夜爽夜夜爽精品视频| 国产精品18久久久久| 在线播放日韩导航| 亚洲男女一区二区三区| 粉嫩av一区二区三区粉嫩 | 亚洲免费成人av| 国产美女久久久久| 日韩网站在线看片你懂的| 亚洲午夜精品久久久久久久久| 国产激情偷乱视频一区二区三区| 日韩一区二区三| 亚洲一区二区三区影院| jizzjizzjizz欧美| 国产精品女主播av| 国产白丝精品91爽爽久久 | 日本伊人午夜精品| 在线观看网站黄不卡| 中文字幕视频一区二区三区久| 国产一区欧美日韩| 欧美成人午夜电影| 奇米色一区二区| 91精选在线观看| 免费在线看一区| 日韩亚洲国产中文字幕欧美| 亚洲国产精品久久不卡毛片| 欧洲生活片亚洲生活在线观看|