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

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

?? i2c.tdf

?? 一些vhdl源代碼 一些vhdl代碼
?? 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蜜桃精品| 国产在线国偷精品产拍免费yy| 丝袜国产日韩另类美女| 麻豆91小视频| 国产精品亚洲一区二区三区在线| 久久精品国产色蜜蜜麻豆| 国产毛片精品视频| 色综合天天做天天爱| 4438成人网| 欧美精品一区二区久久久| 国产精品久久久久久久第一福利| 亚洲欧美国产三级| 狠狠色2019综合网| 不卡av免费在线观看| 欧美在线不卡一区| 中文字幕的久久| 亚洲三级在线免费观看| 久久久蜜桃精品| 在线免费视频一区二区| 2欧美一区二区三区在线观看视频| 2020国产精品| 麻豆精品视频在线观看视频| 9i在线看片成人免费| 日韩欧美激情四射| 香蕉乱码成人久久天堂爱免费| 国产在线麻豆精品观看| 91精品视频网| 日本美女一区二区三区视频| 91蝌蚪porny| 中文字幕一区日韩精品欧美| 国产.精品.日韩.另类.中文.在线.播放| 欧美日韩午夜在线视频| 亚洲男人的天堂av| 欧美午夜在线一二页| 一区二区三区在线免费观看| 日本乱码高清不卡字幕| 一区二区三区在线不卡| 3atv在线一区二区三区| 日韩精品一区第一页| www亚洲一区| 99精品欧美一区二区三区综合在线| 国产日韩av一区| 99久久国产综合精品女不卡| 国产精品久久久久精k8| 欧美网站大全在线观看| 美女一区二区视频| 亚洲欧美国产77777| 日韩一区二区在线观看视频播放| 韩国视频一区二区| 日韩一区欧美一区| 精品国产髙清在线看国产毛片| 国产福利一区二区三区视频| 综合色天天鬼久久鬼色| 日韩精品专区在线影院重磅| 97精品视频在线观看自产线路二| 亚洲1区2区3区4区| 亚洲免费看黄网站| 国产精品护士白丝一区av| 日韩视频一区二区三区在线播放| 一本色道久久综合亚洲91| 国产精品99久| 国产呦精品一区二区三区网站| 亚洲综合自拍偷拍| 国产精品网曝门| 国产精品婷婷午夜在线观看| 欧美大片在线观看一区二区| 欧美亚洲高清一区| 99视频国产精品| 97se亚洲国产综合自在线 | 成人国产精品免费网站| 亚洲一级二级在线| 日韩国产高清在线| 久久不见久久见免费视频7| 青青青爽久久午夜综合久久午夜| 午夜视频在线观看一区二区| 亚洲卡通动漫在线| 免费黄网站欧美| 国产高清成人在线| 色老汉一区二区三区| 欧美日韩一级片在线观看| 91精品国产一区二区| 国产欧美一区二区精品性| 一区视频在线播放| 首页国产丝袜综合| 国产成人精品一区二区三区四区| 国产一区二区三区日韩| 97国产一区二区| 日韩一级大片在线| 亚洲精品视频在线看| 蜜臀av性久久久久av蜜臀妖精| 成人av先锋影音| 欧美大片国产精品| 午夜精品久久久久久久久久久| 国内精品久久久久影院薰衣草| 色婷婷亚洲婷婷| 2欧美一区二区三区在线观看视频| 亚洲精品一二三四区| 国产精品资源在线| 欧美电影免费观看高清完整版在线 | 久久精品夜色噜噜亚洲aⅴ| 亚洲制服欧美中文字幕中文字幕| 激情欧美日韩一区二区| 欧美日韩电影在线| 图片区小说区国产精品视频| 成人99免费视频| 亚洲少妇30p| 在线亚洲人成电影网站色www| 欧美高清一级片在线观看| 狠狠色狠狠色综合系列| 日韩欧美精品在线视频| 日本免费新一区视频| 日韩欧美另类在线| 激情文学综合插| 久久久不卡网国产精品一区| 久久国产精品72免费观看| 久久一二三国产| 91丨九色丨黑人外教| 亚洲一区二区三区四区在线观看| 91在线国内视频| 日韩精品电影一区亚洲| 日韩欧美一区二区在线视频| 精品在线亚洲视频| 亚洲视频一区二区在线观看| 91国模大尺度私拍在线视频| 日日欢夜夜爽一区| 国产精品少妇自拍| 日韩一区二区免费视频| 99精品视频一区二区三区| 五月综合激情网| 日韩美女久久久| 久久一区二区三区国产精品| 在线日韩国产精品| 国产一区二区三区香蕉| 日韩精品一二三四| 中文字幕中文字幕一区二区| 日韩一区二区三| 日本精品一区二区三区四区的功能| 日韩av高清在线观看| 夜色激情一区二区| 自拍av一区二区三区| 欧美极品xxx| 国产精品乱码人人做人人爱 | 日本视频中文字幕一区二区三区| 久久久噜噜噜久久中文字幕色伊伊| 91性感美女视频| 91麻豆福利精品推荐| 国产乱子轮精品视频| 久久精品国产亚洲a| 国产精品一区二区果冻传媒| 国产精品77777竹菊影视小说| 久久99国产精品久久99果冻传媒| 日韩成人一级片| 日本在线不卡视频| 国产最新精品精品你懂的| 久草中文综合在线| 国产成人精品免费看| 色综合网站在线| 欧美一区二区三区日韩视频| 91精品国产综合久久久久久久 | 亚洲与欧洲av电影| 日韩极品在线观看| 国产乱码精品一区二区三| 成人午夜电影小说| 91精品国产aⅴ一区二区| 久久这里只有精品首页| 国产精品国产精品国产专区不蜜| 99久久精品费精品国产一区二区| 国产性天天综合网| 成人深夜视频在线观看| 国产高清不卡一区| 激情文学综合网| 欧美性色欧美a在线播放| 久久久久久麻豆| 日韩电影在线看| 一本大道av伊人久久综合| 欧美一区二区三区男人的天堂 | 日韩av中文字幕一区二区三区 | 亚洲视频一区二区在线| 蜜臀91精品一区二区三区| 日本伦理一区二区| 中文字幕在线一区二区三区| 国模少妇一区二区三区| 欧美人与z0zoxxxx视频| 亚洲自拍偷拍av| 91免费看`日韩一区二区| 国产精品日韩成人| 风间由美一区二区av101| 精品美女被调教视频大全网站| 亚洲成人自拍偷拍| 日韩欧美在线1卡| 国产风韵犹存在线视精品| 日韩欧美一区在线观看| 国产一区二区精品久久| 精品国产乱码久久久久久久久| 黄网站免费久久| 亚洲美女偷拍久久| 欧美精品乱码久久久久久| 麻豆国产欧美一区二区三区|