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

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

?? i2c.tdf

?? AV視頻信號輸入后
?? TDF
字號:
TITLE "I2C Controller"; 

PARAMETERS
(
  DIVISOR = 25
);

%
Version 3.0, January 29th, 1998. Copyright Rune Baeverrud, 1996-1998.
You may use or distribute this function freely, provided you do not remove
this copyright notice. If you have questions or comments, feel free to
contact me by email at r@acte.no, World Wide WEB: http://www.acte.no/freecore

This code will generate two different versions of the I2C controller:

- If you set CONSTANT SIMULATION = 1, then compile for target simulation.
- If you set CONSTANT SIMULATION = 0, then compile for target physical device.

The reason for this? Read the online documentation for an explaination
of the difficulty of simulating bidirectional IO ports.

In addition, you will have to enable the correct block in the ports list manually,
as Max+Plus II cannot do conditional compile in the ports list section. Have a look 
at the end of the ports list, and make sure the correct block is enabled and the
other one is commented out. The default is target physical device, so unless you
want to simulate the I2C controller you should never have to worry about it!

NOTE: The I2C module uses the external div_by_n module, which has to be
      version 2.0 or later. Make sure you use the latest version of 
      the FreeCore Library!
%

CONSTANT SIMULATION = 0;    -- 1 = Compile for simulation, 
                            -- 0 = Compile for physical device
INCLUDE "div_by_n";

SUBDESIGN I2C
(
  -- System timing
  SysClk     : INPUT;       -- System clock
  clk_en     : INPUT = VCC; -- Clock Enable input

  -- System reset
  /reset     : INPUT = VCC; -- Reset I2C Controller

  -- Inputs are sampled on the first system clock after Execute goes high
  Din[7..0]  : INPUT;  -- Data to send on I2C port
  Ack_tx     : INPUT;  -- Ack bit to transmit on received data

  Cmd_stop   : INPUT;  -- Generate stop condition
  Cmd_start  : INPUT;  -- Generate start condition and send Din[]
  Cmd_send   : INPUT;  -- Send Din[]
  Cmd_receive: INPUT;  -- Receive data byte on I2C port

  -- Inputs are sampled on the first system clock after Execute goes high
  Execute    : INPUT;  -- Execute command
  
  -- Outputs
  Dout[7..0] : OUTPUT; -- Current value of transfer shift register
  Ack_rx     : OUTPUT; -- Last data acknowledge received
  Status     : OUTPUT; -- I2C bus has been claimed by the (this) master
  DValid     : OUTPUT; -- Data valid at Dout[]
  DEnable    : OUTPUT; -- Data valid at Dout[] 1 system clock period
  Busy       : OUTPUT; -- Busy

  
% -- This block is used when target is simulation
    SDA_IN   : INPUT;  -- SDA_in input, normally '1' (pull-up resistor)
    SCL_IN   : INPUT;  -- SCL_in input, normally '1' (pull-up resistor)
    SDA_OUT  : OUTPUT; -- This is the "desired" SDA output value from the controller itself
    SCL_OUT  : OUTPUT; -- This is the "desired" SCL output value from the controller itself
    SDA      : OUTPUT; -- Combined value ((SDA_IN) AND (SDA_OUT)), "actual" SDA level
    SCL      : OUTPUT; -- Combined value ((SCL_IN) AND (SCL_OUT)), "actual" SCL level
    BaudOut  : OUTPUT; -- Shows the "baudclock" from the div_by_n module
    sclr     : OUTPUT; -- Shows the sclr signal to the div_by_n module
%
  -- This block is used when target is physical device
    SDA      : BIDIR;  -- I2C Bus SDA port with external pull-up
    SCL      : BIDIR;  -- I2C Bus SCL port with external pull-up
--%
)

VARIABLE
  -- Generates the clock enable to which all I2C bus activity is synchronized
  div_by_x : div_by_n
             WITH (DIVISOR = DIVISOR);

  -- System Control 
  Sx: MACHINE WITH STATES (Sx_idle, x1);

  -- Controls the generation of a start condition
  Ss: MACHINE WITH STATES (Ss_idle,s1,s1a,s2,s2a,s2b,s3);

  -- Controls the generation of a stop condition
  Sy: MACHINE WITH STATES (y0,y1,y2,y3);

  -- Controls the data transfer process
  St: MACHINE WITH STATES (t0,t1,t1a,t2,t3,t4,t4a,t5,t6);

  SDA_reg, SCL_reg : DFFE;  -- I2C output registers
  Cmd_reg[3..0]    : DFFE;  -- Command input registers
  Start_condition  : DFFE;  -- Set if the I2C bus has been claimed
  Sh_reg[7..0]     : DFFE;  -- Data transfer shift register
  BitCnt[2..0]     : DFFE;  -- Number of bits transfered
  Ack_rx_reg       : DFFE;  -- Last Ack received or successfully sent
  Valid_data       : DFFE;  -- Valid data exist on Dout[]
  Ack_tx_reg       : DFFE;  -- Ack to send
  Enable_reg       : DFFE;  -- Used with the DEnable signal

  FINISHED         : NODE;  -- Command execution finished - return to idle state
 
  SDA_node_in      : NODE;  -- I2C data in
  SDA_node_out     : NODE;  -- I2C data out
  SDA_tmp          : NODE;  -- I2C data working node	

  SCL_node_in      : NODE;  -- I2C clock in
  SCL_node_out     : NODE;  -- I2C clock out
 
  BaudGen          : NODE;  -- I2C bus activity is synchronized to this signal

BEGIN
  IF SIMULATION GENERATE
    BaudOut = BaudGen;

    SDA_OUT = !SDA_reg; 
    SCL_OUT = !SCL_reg;

    SDA_node_in = SDA_IN AND !SDA_reg;
    SCL_node_in = SCL_IN AND !SCL_reg;
 
    SDA = SDA_node_in; -- This is how SDA will behave in bidir operation
    SCL = SCL_node_in; -- This is how SCL will behave in bidir operation
  ELSE GENERATE
    SDA = OPNDRN(!SDA_reg); -- Difficult to simulate
    SCL = OPNDRN(!SCL_reg); -- Difficult to simulate

    SDA_node_in = SDA;
    SCL_node_in = SCL;
  END GENERATE;

  -- Asynchronous system reset
  Sx.reset             = NOT /reset;
  Ss.reset             = NOT /reset;
  Sy.reset             = NOT /reset;
  St.reset             = NOT /reset;
  SDA_reg.clrn         = /reset;
  SCL_reg.clrn         = /reset;
  Cmd_reg[3..0].clrn   = /reset;
  Start_condition.clrn = /reset;
  Sh_reg[7..0].clrn    = /reset; 
  BitCnt[2..0].clrn    = /reset;
  Ack_rx_reg.clrn      = /reset;
  Valid_data.clrn      = /reset;
  Ack_tx_reg.clrn      = /reset;
  Enable_reg.clrn      = /reset;

  -- Generation of the I2C synchronization clock enable signal
  div_by_x.cnt_en = clk_en;
  IF ((SCL_reg == GND) AND (SCL_node_in == GND)) OR (/reset == GND) THEN
    div_by_x.sclr = VCC;
    IF SIMULATION GENERATE
      sclr = VCC;
    END GENERATE;
  END IF;
  BaudGen = div_by_x.Every_N;

  -- I2C output register
  SDA_reg = !SDA_node_out;
  SCL_reg = !SCL_node_out;

  -- All registers clocked by common system clock
  div_by_x.SysClk     = SysClk;
  SDA_reg.clk         = SysClk;
  SCL_reg.clk         = SysClk;
  Cmd_reg[].clk       = SysClk;
  Start_condition.clk = SysClk;
  BitCnt[].clk        = SysClk;
  Sh_reg[].clk        = SysClk;
  Valid_data.clk      = SysClk;
  Ack_rx_reg.clk      = SysClk;
  Ack_tx_reg.clk      = SysClk;
  Enable_reg.clk      = SysClk;

  -- Output signals reflect current values of internal registers
  Dout[]              = Sh_reg[];
  Ack_rx              = Ack_rx_reg;
  Status              = Start_condition;
  DValid              = Valid_data;
  DEnable             = Enable_reg;

  -- Make sure each command is executed only once
  -- Execute has to go to GND after instruction execution
  -- before next command can be accepted
  Sx.clk = SysClk;
  Busy = !Sx_idle;
  CASE Sx IS
    WHEN Sx_idle =>
      IF Execute THEN
        Valid_data = GND;
        Valid_data.ena = VCC;
        Sh_reg[] = Din[];
        Sh_reg[].ena = VCC;
        Ack_tx_reg = Ack_tx;
        Ack_tx_reg.ena = VCC;
        Cmd_reg0 = Cmd_stop;
        Cmd_reg1 = Cmd_start;
        Cmd_reg2 = Cmd_send;
        Cmd_reg3 = Cmd_receive;
        Cmd_reg[].ena = VCC;
        Sx = x1;
      ELSE
        Sx = Sx_idle;
      END IF;
    WHEN x1 =>
      IF Cmd_reg[] != 0 OR Execute THEN
        Sx = x1;
      ELSE
        Sx = Sx_idle;
      END IF;
  END CASE;
 
  -- signals to the Sx state machine that instruction has finished execution
  IF FINISHED THEN
    Cmd_reg[] = 0;
    Cmd_reg[].ena = BaudGen;
  END IF;

  -- This state machine controls the generation of start condition
  Ss.clk = SysClk;
  Ss.ena = BaudGen;
  CASE Ss IS
    WHEN Ss_idle =>
      IF Cmd_reg1 THEN
        Start_condition = VCC;
        Start_condition.ena = BaudGen;
        SDA_reg.ena = BaudGen;
        IF Start_condition THEN
          -- Repeated start condition
          SDA_node_out = VCC;
          Ss = s2;
        ELSE
          SDA_node_out = GND;
          Ss = s1;
        END IF;
      ELSE
        Ss = Ss_idle;
      END IF;
    WHEN s1 =>
      Ss = S1a;
    WHEN s1a =>
	  SCL_node_out = GND;
	  SCL_reg.ena = BaudGen;
	  Cmd_reg[] = 4;
	  Cmd_reg[].ena = BaudGen;
	  Ss = Ss_idle;
    WHEN s2 =>
      SCL_node_out = VCC;
      SCL_reg.ena = BaudGen;
      Ss = s2a;
    WHEN s2a =>
      Ss = s3;
    WHEN s3 =>
      SDA_node_out = GND;
      SDA_reg.ena = BaudGen;
      Ss = S1;
  END CASE;
    
  -- This state machine controls the generation of stop condition
  Sy.clk = SysClk;
  Sy.ena = BaudGen;
  CASE Sy IS
    WHEN y0 =>
      IF Cmd_reg0 THEN
        SCL_node_out = VCC;
        SCL_reg.ena = BaudGen;
        Sy = y1;
      ELSE
        Sy = y0;
      END IF;
    WHEN y1 =>
      Sy = y2;
    WHEN y2 =>
      SDA_node_out = VCC;
      SDA_reg.ena = BaudGen;
      Sy = y3;
    WHEN y3 =>
      FINISHED = VCC;
      Start_condition = GND;
      Start_condition.ena = BaudGen;
      Sy = y0;
  END CASE;

  -- If reading from the I2C bus then output only 1's.
  IF Cmd_reg2 THEN
    SDA_tmp = Sh_reg7;
  ELSE
    SDA_tmp = VCC;
  END IF;

 -- This state machine controls transfers one byte to/from the I2C port
  St.clk = SysClk;
  St.ena = BaudGen;
  CASE St IS
    WHEN t0 =>
      IF Cmd_reg2 OR Cmd_reg3 THEN
        -- Data bit starts here
        SDA_node_out = SDA_tmp;
        SDA_reg.ena = BaudGen;
        St = t1;
      ELSE
        St = t0;
      END IF;
    WHEN t1 =>
      SCL_node_out = VCC;
      SCL_reg.ena = BaudGen;
      St = t1a;
    WHEN t1a =>
      St = t2;
    WHEN t2 =>
      Sh_reg[0] = SDA_node_in;
      Sh_reg[7..1] = Sh_reg[6..0];
      Sh_reg[].ena = BaudGen;
      SCL_node_out = GND;
      SCL_reg.ena = BaudGen;
      IF BitCnt[] == 7 THEN
        St = t3;
      ELSE
        St = t0;
      END IF;
    WHEN t3 =>
      -- Ack bit starts here
      IF Cmd_reg2 THEN
        SDA_node_out = VCC;
      ELSE
        SDA_node_out = Ack_tx_reg;
      END IF;
      SDA_reg.ena = BaudGen;
      St = t4;
    WHEN t4 =>
      SCL_node_out = VCC;
      SCL_reg.ena = BaudGen;
      St = t4a;
    WHEN t4a =>
      St = t5;
    WHEN t5 =>
      Valid_data = VCC;
      Valid_data.ena = BaudGen;
      Enable_reg = BaudGen;
      Ack_rx_reg = SDA_node_in;
      Ack_rx_reg.ena = BaudGen;
      SCL_node_out = GND;
      SCL_reg.ena = BaudGen;
      St = t6;
    WHEN t6 =>
      SDA_node_out = GND;
      SDA_reg.ena = BaudGen;
      FINISHED = VCC;
      St = t0;     
  END CASE;
  
  BitCnt[] = BitCnt[] + 1;
  IF t2 THEN BitCnt[].ena = BaudGen; END IF;

END;
  

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
奇米四色…亚洲| 久久精品这里都是精品| 日韩精品一区二区在线| 国产欧美一区二区三区沐欲| 综合色中文字幕| 石原莉奈一区二区三区在线观看| 精品午夜久久福利影院| 99精品视频中文字幕| 欧美日韩高清一区二区| 久久婷婷色综合| 亚洲在线免费播放| 国产麻豆成人精品| 欧美三级三级三级| 国产亚洲精品免费| 亚洲国产精品久久人人爱| 国产一区二区三区观看| 91黄视频在线观看| 国产清纯在线一区二区www| 亚洲国产欧美另类丝袜| 国产99久久精品| 91精品蜜臀在线一区尤物| 日本一区二区电影| 麻豆国产精品视频| 色婷婷av一区二区三区之一色屋| 337p日本欧洲亚洲大胆精品| 一区二区三区av电影 | 欧美三区免费完整视频在线观看| 日韩欧美久久一区| 亚洲一级二级三级| 成年人国产精品| 日韩精品一区二区三区swag | 亚洲国产成人自拍| 日本美女一区二区| 91久久久免费一区二区| 国产精品欧美经典| 捆绑调教美女网站视频一区| 欧美色综合网站| 国产精品久久久久影视| 国产一区二区视频在线| 7878成人国产在线观看| 亚洲综合图片区| 99久久久免费精品国产一区二区| 欧美精品一区二区三区蜜臀| 亚洲成人av电影| 91理论电影在线观看| 中文字幕精品一区二区精品绿巨人| 免费观看一级特黄欧美大片| 欧美最新大片在线看| 国产精品国产三级国产有无不卡| 欧美理论在线播放| 日韩码欧中文字| 国产suv精品一区二区6| 精品久久99ma| 蜜臀精品一区二区三区在线观看| 欧美亚洲图片小说| 亚洲一区二区在线免费看| 99re这里都是精品| 国产精品久久久久毛片软件| 国产乱码精品一品二品| 久久综合999| 国产精品一区二区三区四区| 日韩精品综合一本久道在线视频| 天堂一区二区在线| 在线成人av网站| 亚洲一级电影视频| 欧美日韩精品是欧美日韩精品| 亚洲综合另类小说| 欧美色国产精品| 午夜免费久久看| 欧美精品久久天天躁| 亚洲 欧美综合在线网络| 欧美午夜一区二区三区免费大片| 亚洲日本一区二区| 欧美亚洲一区二区三区四区| 亚洲一区二区三区美女| 欧美网站一区二区| 日韩黄色小视频| 欧美一区二区三区人| 狠狠狠色丁香婷婷综合激情| 精品久久久久久无| 国产成人亚洲综合a∨婷婷图片| 国产亚洲va综合人人澡精品| 国产激情一区二区三区| 中文字幕日韩精品一区| 91丨九色丨蝌蚪富婆spa| 亚洲乱码日产精品bd| 欧美日韩激情一区二区三区| 婷婷开心激情综合| 精品国一区二区三区| 国产成人福利片| 亚洲色图在线看| 777午夜精品免费视频| 久久爱另类一区二区小说| 欧美国产日韩a欧美在线观看| voyeur盗摄精品| 一区二区三区在线视频免费| 91精品国产综合久久久久久漫画| 久久电影国产免费久久电影| 日本一二三四高清不卡| 日本韩国欧美在线| 欧美aa在线视频| 国产日韩三级在线| 91精品福利视频| 激情综合色播五月| 国产精品高潮呻吟久久| 欧美日韩www| 国产精品一二三四区| 1024国产精品| 亚洲欧洲av另类| 欧美美女一区二区三区| 久久97超碰色| 亚洲欧美激情在线| 日韩免费视频一区二区| 99久久精品国产麻豆演员表| 无码av免费一区二区三区试看| 精品国产伦理网| 91视频免费看| 免费在线观看一区| 中文字幕在线观看一区二区| 欧美一区二区三区免费在线看| 国产九色sp调教91| 亚洲午夜久久久久| 久久日韩粉嫩一区二区三区| 在线一区二区视频| 国产精品中文字幕日韩精品 | 欧美少妇一区二区| 国产精品1区2区| 亚洲成av人片在线观看| 久久久精品免费免费| 欧美日韩国产欧美日美国产精品| 成人一区二区三区在线观看| 视频一区二区三区入口| 国产精品久久二区二区| 日韩欧美另类在线| 欧美在线免费播放| 岛国精品一区二区| 免费观看91视频大全| 一区二区三区在线观看欧美| 久久精品视频在线看| 欧美一区二区在线不卡| 91精品福利视频| 成人av资源站| 久久精品国产在热久久| 亚洲电影欧美电影有声小说| 国产欧美精品国产国产专区| 91精品国产美女浴室洗澡无遮挡| 97久久超碰精品国产| 韩国中文字幕2020精品| 日韩成人av影视| 亚洲国产人成综合网站| 中文字幕日本乱码精品影院| 久久久777精品电影网影网| 欧美一级午夜免费电影| 在线免费观看日韩欧美| av不卡免费在线观看| 国产激情视频一区二区在线观看 | 国产日韩欧美电影| 日韩亚洲欧美一区二区三区| 欧美日韩国产美女| 欧美激情一区二区三区在线| 日韩精品在线一区二区| 337p亚洲精品色噜噜| 在线观看日产精品| 日本福利一区二区| 99re8在线精品视频免费播放| 国产成人激情av| 国产91在线看| 国产91丝袜在线观看| 国产精品18久久久久久久久 | 国产精品久久久久久久久快鸭 | 丁香五精品蜜臀久久久久99网站| 国产自产高清不卡| 韩国毛片一区二区三区| 国产做a爰片久久毛片| 久久99蜜桃精品| 精品一区二区在线视频| 久久99久久久久| 久久国产欧美日韩精品| 美女视频网站黄色亚洲| 久久国产精品一区二区| 日本不卡123| 久久精品99国产精品日本| 狠狠色丁香久久婷婷综| 狠狠久久亚洲欧美| 粉嫩aⅴ一区二区三区四区五区| 国产精品一区二区x88av| 国产激情一区二区三区四区| 粉嫩高潮美女一区二区三区| 不卡的电影网站| 99精品视频在线免费观看| 在线观看日韩国产| 欧美日本一区二区在线观看| 91精选在线观看| 欧美大片在线观看| 久久久不卡网国产精品一区| 日本一区免费视频| 亚洲天堂a在线| 亚洲一级二级三级在线免费观看| 婷婷丁香激情综合| 黄色日韩三级电影|