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

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

?? i2c.tdf

?? 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麻豆精品国产91| 国产精品久久毛片| 99这里只有久久精品视频| 国产精品久久久久久久久快鸭| 粉嫩高潮美女一区二区三区| 国产精品国产三级国产专播品爱网| 国产.欧美.日韩| 亚洲视频图片小说| 欧美在线三级电影| 久久99精品国产麻豆婷婷洗澡| 久久一日本道色综合| 岛国一区二区在线观看| 一区二区三区在线视频播放| 欧美女孩性生活视频| 国精品**一区二区三区在线蜜桃| 91精品在线观看入口| 国产一区二区三区国产| 欧美性大战久久久久久久蜜臀| 欧美一区二区三区免费大片| 国产精品原创巨作av| 91麻豆国产精品久久| 国产精品久久久久久亚洲伦| 免费看精品久久片| 成人精品亚洲人成在线| 69av一区二区三区| 亚洲日本在线a| 国产精品一级片| 欧美日韩国产小视频在线观看| 国产女人18水真多18精品一级做 | 国产综合久久久久影院| 91欧美一区二区| 国产精品毛片久久久久久| 午夜国产精品一区| 色婷婷狠狠综合| 国产女主播一区| 国产91高潮流白浆在线麻豆| 欧美一区二区三区视频免费| 亚洲国产精品欧美一二99| 成人动漫视频在线| 欧美国产一区二区| 成人黄色一级视频| 国产偷国产偷精品高清尤物| 蜜桃在线一区二区三区| 日韩午夜精品电影| 蜜桃av噜噜一区| 日韩精品一区二区三区视频| 美脚の诱脚舐め脚责91| 91精品国产欧美一区二区成人| 香蕉久久夜色精品国产使用方法| 欧美综合欧美视频| 日韩不卡一二三区| 久久日一线二线三线suv| 成人午夜电影小说| 偷拍亚洲欧洲综合| 日韩视频在线永久播放| 日韩在线一区二区| 久久看人人爽人人| 色视频欧美一区二区三区| 亚洲精品久久久久久国产精华液| 日本精品一区二区三区高清| 亚洲18影院在线观看| 精品免费视频一区二区| 成人av网址在线观看| 午夜国产精品一区| 欧美激情一区二区三区在线| 在线观看免费视频综合| 国产一区二区三区观看| 一个色综合网站| 国产丝袜欧美中文另类| 精品视频123区在线观看| 国产伦理精品不卡| 亚洲国产aⅴ天堂久久| 欧美电视剧免费全集观看| 欧美日韩在线电影| www.爱久久.com| 国产91丝袜在线播放| 精品在线播放免费| 日韩av在线发布| 亚洲制服丝袜一区| 亚洲麻豆国产自偷在线| 国产日产欧美一区二区三区| 欧美一区二区在线不卡| 在线观看91av| 欧美日本视频在线| 欧美精品久久99久久在免费线| www.欧美日韩| 99久久综合精品| 成人开心网精品视频| 成人小视频免费观看| 丰满亚洲少妇av| 99热精品一区二区| 99国产麻豆精品| 色婷婷久久综合| 欧美伊人久久久久久久久影院| 欧美无乱码久久久免费午夜一区| 成人午夜电影小说| 欧美日韩成人一区| 欧美老女人第四色| 欧美精品一区二区三区蜜桃视频| 欧美r级电影在线观看| 国产精品久久久久久一区二区三区 | 91精品一区二区三区在线观看| 欧美在线免费观看亚洲| 日韩网站在线看片你懂的| 亚洲欧美怡红院| 日韩激情av在线| 成人毛片视频在线观看| 欧美日韩国产另类一区| 欧美mv日韩mv国产网站app| 亚洲免费三区一区二区| 欧美a级一区二区| www.亚洲在线| 欧美一区二区三区公司| 18欧美乱大交hd1984| 日韩电影一区二区三区四区| 91小视频免费看| 日韩精品一区二区三区视频| 亚洲综合久久久| 成人国产视频在线观看| 2020日本不卡一区二区视频| 自拍av一区二区三区| 国产一区二区三区免费播放| 在线成人免费视频| 亚洲欧美激情视频在线观看一区二区三区| 免费久久99精品国产| 欧美午夜理伦三级在线观看| 国产精品久久一卡二卡| 久久国产欧美日韩精品| 欧美高清激情brazzers| 亚洲国产综合色| 欧美日韩中文另类| 午夜国产精品一区| 欧美一区二区福利在线| 麻豆极品一区二区三区| 久久久久久久网| 国产麻豆精品视频| 国产色产综合色产在线视频| 国产a视频精品免费观看| 国产日韩欧美麻豆| 97精品久久久久中文字幕 | 中文字幕日韩一区| 一本大道av一区二区在线播放| 亚洲欧美精品午睡沙发| 欧美日韩国产欧美日美国产精品| 舔着乳尖日韩一区| 亚洲精品一线二线三线| 成人精品视频一区二区三区尤物| 亚洲美女在线国产| 久久久久久麻豆| 欧美在线不卡一区| 国产一区中文字幕| 亚洲国产毛片aaaaa无费看| 日韩欧美高清dvd碟片| av中文字幕亚洲| 美女网站视频久久| 亚洲欧美怡红院| 2024国产精品| 精品欧美一区二区在线观看| 97久久超碰精品国产| 日本aⅴ精品一区二区三区 | 国产欧美一区二区三区网站| 在线观看日韩国产| 成人av在线影院| 国产一区二区美女| 麻豆成人av在线| 亚洲裸体xxx| 中文字幕亚洲在| 国产精品九色蝌蚪自拍| 久久精品亚洲精品国产欧美| 91精品久久久久久久99蜜桃| 91黄视频在线| 欧美性感一类影片在线播放| 91丝袜呻吟高潮美腿白嫩在线观看| 国产一区二区三区黄视频| 国产精品系列在线观看| 国产成人av一区二区三区在线| 日韩和欧美的一区| 捆绑变态av一区二区三区| 久久99精品久久久| 国产精品主播直播| 99精品桃花视频在线观看| 成人avav影音| 在线影视一区二区三区| 欧美日韩你懂的| 精品国一区二区三区| 久久久精品天堂| 亚洲人成在线播放网站岛国| 婷婷六月综合亚洲| 波多野洁衣一区| 欧美经典三级视频一区二区三区| 午夜欧美一区二区三区在线播放| 粉嫩蜜臀av国产精品网站| 日韩欧美精品在线| 蜜臀久久99精品久久久久久9| 色偷偷一区二区三区| 中文字幕亚洲成人| 成人免费视频视频|