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

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

?? eth_miim.v

?? Verilog HDl代碼
?? V
字號:


`include "timescale.v"


module eth_miim
(
  Clk,
  Reset,
  Divider,
  NoPre,
  CtrlData,
  Rgad,
  Fiad,
  WCtrlData,
  RStat,
  ScanStat,
  Mdi,
  Mdo,
  MdoEn,
  Mdc,
  Busy,
  Prsd,
  LinkFail,
  Nvalid,
  WCtrlDataStart,
  RStatStart,
  UpdateMIIRX_DATAReg
);



input         Clk;                // Host Clock
input         Reset;              // General Reset
input   [7:0] Divider;            // Divider for the host clock
input  [15:0] CtrlData;           // Control Data (to be written to the PHY reg.)
input   [4:0] Rgad;               // Register Address (within the PHY)
input   [4:0] Fiad;               // PHY Address
input         NoPre;              // No Preamble (no 32-bit preamble)
input         WCtrlData;          // Write Control Data operation
input         RStat;              // Read Status operation
input         ScanStat;           // Scan Status operation
input         Mdi;                // MII Management Data In

output        Mdc;                // MII Management Data Clock
output        Mdo;                // MII Management Data Output
output        MdoEn;              // MII Management Data Output Enable
output        Busy;               // Busy Signal
output        LinkFail;           // Link Integrity Signal
output        Nvalid;             // Invalid Status (qualifier for the valid scan result)

output [15:0] Prsd;               // Read Status Data (data read from the PHY)

output        WCtrlDataStart;     // This signals resets the WCTRLDATA bit in the MIIM Command register
output        RStatStart;         // This signal resets the RSTAT BIT in the MIIM Command register
output        UpdateMIIRX_DATAReg;// Updates MII RX_DATA register with read data

parameter Tp = 1;


reg           Nvalid;
reg           EndBusy_d;          // Pre-end Busy signal
reg           EndBusy;            // End Busy signal (stops the operation in progress)

reg           WCtrlData_q1;       // Write Control Data operation delayed 1 Clk cycle
reg           WCtrlData_q2;       // Write Control Data operation delayed 2 Clk cycles
reg           WCtrlData_q3;       // Write Control Data operation delayed 3 Clk cycles
reg           WCtrlDataStart;     // Start Write Control Data Command (positive edge detected)
reg           WCtrlDataStart_q;
reg           WCtrlDataStart_q1;  // Start Write Control Data Command delayed 1 Mdc cycle
reg           WCtrlDataStart_q2;  // Start Write Control Data Command delayed 2 Mdc cycles

reg           RStat_q1;           // Read Status operation delayed 1 Clk cycle
reg           RStat_q2;           // Read Status operation delayed 2 Clk cycles
reg           RStat_q3;           // Read Status operation delayed 3 Clk cycles
reg           RStatStart;         // Start Read Status Command (positive edge detected)
reg           RStatStart_q1;      // Start Read Status Command delayed 1 Mdc cycle
reg           RStatStart_q2;      // Start Read Status Command delayed 2 Mdc cycles

reg           ScanStat_q1;        // Scan Status operation delayed 1 cycle
reg           ScanStat_q2;        // Scan Status operation delayed 2 cycles
reg           SyncStatMdcEn;      // Scan Status operation delayed at least cycles and synchronized to MdcEn

wire          WriteDataOp;        // Write Data Operation (positive edge detected)
wire          ReadStatusOp;       // Read Status Operation (positive edge detected)
wire          ScanStatusOp;       // Scan Status Operation (positive edge detected)
wire          StartOp;            // Start Operation (start of any of the preceding operations)
wire          EndOp;              // End of Operation

reg           InProgress;         // Operation in progress
reg           InProgress_q1;      // Operation in progress delayed 1 Mdc cycle
reg           InProgress_q2;      // Operation in progress delayed 2 Mdc cycles
reg           InProgress_q3;      // Operation in progress delayed 3 Mdc cycles

reg           WriteOp;            // Write Operation Latch (When asserted, write operation is in progress)
reg     [6:0] BitCounter;         // Bit Counter


wire          MdcFrame;           // Frame window for limiting the Mdc
wire    [3:0] ByteSelect;         // Byte Select defines which byte (preamble, data, operation, etc.) is loaded and shifted through the shift register.
wire          MdcEn;              // MII Management Data Clock Enable signal is asserted for one Clk period before Mdc rises.
wire          ShiftedBit;         // This bit is output of the shift register and is connected to the Mdo signal


wire          LatchByte1_d2;
wire          LatchByte0_d2;
reg           LatchByte1_d;
reg           LatchByte0_d;
reg     [1:0] LatchByte;          // Latch Byte selects which part of Read Status Data is updated from the shift register

reg           UpdateMIIRX_DATAReg;// Updates MII RX_DATA register with read data





// Generation of the EndBusy signal. It is used for ending the MII Management operation.
always @ (posedge Clk or posedge Reset)
begin
  if(Reset)
    begin
      EndBusy_d <= #Tp 1'b0;
      EndBusy <= #Tp 1'b0;
    end
  else
    begin
      EndBusy_d <= #Tp ~InProgress_q2 & InProgress_q3;
      EndBusy   <= #Tp EndBusy_d;
    end
end


// Update MII RX_DATA register
always @ (posedge Clk or posedge Reset)
begin
  if(Reset)
    UpdateMIIRX_DATAReg <= #Tp 0;
  else
  if(EndBusy & ~WCtrlDataStart_q)
    UpdateMIIRX_DATAReg <= #Tp 1;
  else
    UpdateMIIRX_DATAReg <= #Tp 0;    
end



// Generation of the delayed signals used for positive edge triggering.
always @ (posedge Clk or posedge Reset)
begin
  if(Reset)
    begin
      WCtrlData_q1 <= #Tp 1'b0;
      WCtrlData_q2 <= #Tp 1'b0;
      WCtrlData_q3 <= #Tp 1'b0;
      
      RStat_q1 <= #Tp 1'b0;
      RStat_q2 <= #Tp 1'b0;
      RStat_q3 <= #Tp 1'b0;

      ScanStat_q1  <= #Tp 1'b0;
      ScanStat_q2  <= #Tp 1'b0;
      SyncStatMdcEn <= #Tp 1'b0;
    end
  else
    begin
      WCtrlData_q1 <= #Tp WCtrlData;
      WCtrlData_q2 <= #Tp WCtrlData_q1;
      WCtrlData_q3 <= #Tp WCtrlData_q2;

      RStat_q1 <= #Tp RStat;
      RStat_q2 <= #Tp RStat_q1;
      RStat_q3 <= #Tp RStat_q2;

      ScanStat_q1  <= #Tp ScanStat;
      ScanStat_q2  <= #Tp ScanStat_q1;
      if(MdcEn)
        SyncStatMdcEn  <= #Tp ScanStat_q2;
    end
end


// Generation of the Start Commands (Write Control Data or Read Status)
always @ (posedge Clk or posedge Reset)
begin
  if(Reset)
    begin
      WCtrlDataStart <= #Tp 1'b0;
      WCtrlDataStart_q <= #Tp 1'b0;
      RStatStart <= #Tp 1'b0;
    end
  else
    begin
      if(EndBusy)
        begin
          WCtrlDataStart <= #Tp 1'b0;
          RStatStart <= #Tp 1'b0;
        end
      else
        begin
          if(WCtrlData_q2 & ~WCtrlData_q3)
            WCtrlDataStart <= #Tp 1'b1;
          if(RStat_q2 & ~RStat_q3)
            RStatStart <= #Tp 1'b1;
          WCtrlDataStart_q <= #Tp WCtrlDataStart;
        end
    end
end 


// Generation of the Nvalid signal (indicates when the status is invalid)
always @ (posedge Clk or posedge Reset)
begin
  if(Reset)
    Nvalid <= #Tp 1'b0;
  else
    begin
      if(~InProgress_q2 & InProgress_q3)
        begin
          Nvalid <= #Tp 1'b0;
        end
      else
        begin
          if(ScanStat_q2  & ~SyncStatMdcEn)
            Nvalid <= #Tp 1'b1;
        end
    end
end 

// Signals used for the generation of the Operation signals (positive edge)
always @ (posedge Clk or posedge Reset)
begin
  if(Reset)
    begin
      WCtrlDataStart_q1 <= #Tp 1'b0;
      WCtrlDataStart_q2 <= #Tp 1'b0;

      RStatStart_q1 <= #Tp 1'b0;
      RStatStart_q2 <= #Tp 1'b0;

      InProgress_q1 <= #Tp 1'b0;
      InProgress_q2 <= #Tp 1'b0;
      InProgress_q3 <= #Tp 1'b0;

  	  LatchByte0_d <= #Tp 1'b0;
  	  LatchByte1_d <= #Tp 1'b0;

  	  LatchByte <= #Tp 2'b00;
    end
  else
    begin
      if(MdcEn)
        begin
          WCtrlDataStart_q1 <= #Tp WCtrlDataStart;
          WCtrlDataStart_q2 <= #Tp WCtrlDataStart_q1;

          RStatStart_q1 <= #Tp RStatStart;
          RStatStart_q2 <= #Tp RStatStart_q1;

          LatchByte[0] <= #Tp LatchByte0_d;
          LatchByte[1] <= #Tp LatchByte1_d;

          LatchByte0_d <= #Tp LatchByte0_d2;
          LatchByte1_d <= #Tp LatchByte1_d2;

          InProgress_q1 <= #Tp InProgress;
          InProgress_q2 <= #Tp InProgress_q1;
          InProgress_q3 <= #Tp InProgress_q2;
        end
    end
end 


// Generation of the Operation signals
assign WriteDataOp  = WCtrlDataStart_q1 & ~WCtrlDataStart_q2;    
assign ReadStatusOp = RStatStart_q1     & ~RStatStart_q2;
assign ScanStatusOp = SyncStatMdcEn     & ~InProgress & ~InProgress_q1 & ~InProgress_q2;
assign StartOp      = WriteDataOp | ReadStatusOp | ScanStatusOp;

// Busy
assign Busy = WCtrlDataStart | RStatStart | SyncStatMdcEn | EndBusy | InProgress | InProgress_q3 | Nvalid;


// Generation of the InProgress signal (indicates when an operation is in progress)
// Generation of the WriteOp signal (indicates when a write is in progress)
always @ (posedge Clk or posedge Reset)
begin
  if(Reset)
    begin
      InProgress <= #Tp 1'b0;
      WriteOp <= #Tp 1'b0;
    end
  else
    begin
      if(MdcEn)
        begin
          if(StartOp)
            begin
              if(~InProgress)
                WriteOp <= #Tp WriteDataOp;
              InProgress <= #Tp 1'b1;
            end
          else
            begin
              if(EndOp)
                begin
                  InProgress <= #Tp 1'b0;
                  WriteOp <= #Tp 1'b0;
                end
            end
        end
    end
end



// Bit Counter counts from 0 to 63 (from 32 to 63 when NoPre is asserted)
always @ (posedge Clk or posedge Reset)
begin
  if(Reset)
    BitCounter[6:0] <= #Tp 7'h0;
  else
    begin
      if(MdcEn)
        begin
          if(InProgress)
            begin
              if(NoPre & ( BitCounter == 7'h0 ))
                BitCounter[6:0] <= #Tp 7'h21;
              else
                BitCounter[6:0] <= #Tp BitCounter[6:0] + 1'b1;
            end
          else
            BitCounter[6:0] <= #Tp 7'h0;
        end
    end
end


// Operation ends when the Bit Counter reaches 63
assign EndOp = BitCounter==63;

assign ByteSelect[0] = InProgress & ((NoPre & (BitCounter == 7'h0)) | (~NoPre & (BitCounter == 7'h20)));
assign ByteSelect[1] = InProgress & (BitCounter == 7'h28);
assign ByteSelect[2] = InProgress & WriteOp & (BitCounter == 7'h30);
assign ByteSelect[3] = InProgress & WriteOp & (BitCounter == 7'h38);


// Latch Byte selects which part of Read Status Data is updated from the shift register
assign LatchByte1_d2 = InProgress & ~WriteOp & BitCounter == 7'h37;
assign LatchByte0_d2 = InProgress & ~WriteOp & BitCounter == 7'h3F;


// Connecting the Clock Generator Module
eth_clockgen clkgen(.Clk(Clk), .Reset(Reset), .Divider(Divider[7:0]), .MdcEn(MdcEn), .MdcEn_n(MdcEn_n), .Mdc(Mdc) 
                   );

// Connecting the Shift Register Module
eth_shiftreg shftrg(.Clk(Clk), .Reset(Reset), .MdcEn_n(MdcEn_n), .Mdi(Mdi), .Fiad(Fiad), .Rgad(Rgad), 
                    .CtrlData(CtrlData), .WriteOp(WriteOp), .ByteSelect(ByteSelect), .LatchByte(LatchByte), 
                    .ShiftedBit(ShiftedBit), .Prsd(Prsd), .LinkFail(LinkFail)
                   );

// Connecting the Output Control Module
eth_outputcontrol outctrl(.Clk(Clk), .Reset(Reset), .MdcEn_n(MdcEn_n), .InProgress(InProgress), 
                          .ShiftedBit(ShiftedBit), .BitCounter(BitCounter), .WriteOp(WriteOp), .NoPre(NoPre), 
                          .Mdo(Mdo), .MdoEn(MdoEn)
                         );

endmodule

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩黄色免费电影| 肉肉av福利一精品导航| 欧美日韩视频第一区| 久草这里只有精品视频| 亚洲另类在线一区| 国产亚洲一二三区| 精品污污网站免费看| 成人小视频免费在线观看| 成人欧美一区二区三区在线播放| 一本久久a久久精品亚洲| 麻豆精品一区二区综合av| 亚洲欧美一区二区三区孕妇| 精品88久久久久88久久久| 久久精品人人做人人爽97| 正在播放亚洲一区| 日本韩国欧美一区| 成人av网在线| 国产在线精品一区二区三区不卡| 亚洲成va人在线观看| 日韩理论片网站| 欧美激情一区三区| 26uuu国产电影一区二区| 91麻豆精品国产自产在线| 91色婷婷久久久久合中文| 国产成人精品一区二| 九色porny丨国产精品| 日本中文字幕一区二区有限公司| 亚洲色图欧洲色图| 国产精品久久久久影院亚瑟| 久久先锋资源网| 精品粉嫩aⅴ一区二区三区四区| 欧美二区三区91| 欧美三级视频在线| 精品粉嫩aⅴ一区二区三区四区| 色视频一区二区| 99久久99久久精品国产片果冻| 国产精品一卡二卡| 国产成人免费视频一区| 国产精品自拍av| 国产suv一区二区三区88区| 韩国欧美一区二区| 国产乱码一区二区三区| 国产盗摄女厕一区二区三区| 国产一区二区按摩在线观看| 狠狠色丁香久久婷婷综合_中| 精品一区二区三区免费| 久久99精品国产麻豆不卡| 91福利在线观看| 在线视频一区二区三区| 欧美在线观看一区| 欧美精品乱人伦久久久久久| 正在播放一区二区| 日韩欧美在线影院| 久久一区二区视频| 国产精品美女久久久久aⅴ| 国产精品狼人久久影院观看方式| 亚洲天堂a在线| 亚洲综合激情小说| 91美女在线视频| 色综合久久99| 欧美日韩亚洲另类| 欧美不卡一区二区| 欧美韩日一区二区三区| 亚洲男同性恋视频| 日本sm残虐另类| 国产乱子伦一区二区三区国色天香| 国产精品18久久久久久久久久久久| caoporm超碰国产精品| 在线观看国产日韩| 精品捆绑美女sm三区| 国产精品国产自产拍高清av| 一区二区三区四区视频精品免费 | 欧美高清视频在线高清观看mv色露露十八| 欧美三级乱人伦电影| 欧美成人一区二区三区在线观看| 国产亚洲美州欧州综合国| 亚洲免费色视频| 青青草一区二区三区| 成人性生交大片免费看中文网站| 色94色欧美sute亚洲线路一ni| 911精品产国品一二三产区| 精品少妇一区二区| 日韩毛片高清在线播放| 裸体健美xxxx欧美裸体表演| av不卡在线播放| 日韩一区二区三区视频在线观看| 中文一区在线播放| aaa欧美大片| 欧美一级高清片| 椎名由奈av一区二区三区| 蜜臀av性久久久久蜜臀aⅴ流畅 | 91丨porny丨户外露出| 欧美日韩国产经典色站一区二区三区| 欧美精品一区二区久久婷婷| 亚洲精品久久久蜜桃| 激情小说欧美图片| 欧亚洲嫩模精品一区三区| 国产欧美综合色| 免费成人小视频| 色婷婷国产精品| 国产欧美一区视频| 麻豆精品久久久| 在线影院国内精品| 国产精品美女久久久久aⅴ | 日韩经典中文字幕一区| 成人丝袜高跟foot| 26uuu精品一区二区在线观看| 亚洲午夜在线视频| 成人激情校园春色| 精品久久久久一区| 日韩国产成人精品| 欧美这里有精品| 中文字幕一区二区三中文字幕| 精品在线你懂的| 91精品国产一区二区人妖| 一级特黄大欧美久久久| 99久久国产综合精品麻豆| 久久久精品人体av艺术| 老司机精品视频导航| 在线成人高清不卡| 一片黄亚洲嫩模| 一本色道久久综合狠狠躁的推荐| 欧美国产97人人爽人人喊| 国产在线不卡一区| 精品精品欲导航| 久久成人免费网站| 欧美电影免费观看高清完整版在线| 亚洲午夜精品在线| 欧洲国产伦久久久久久久| 亚洲欧美日韩国产中文在线| 99视频精品在线| 亚洲欧美怡红院| 99麻豆久久久国产精品免费| 国产精品视频观看| 夫妻av一区二区| 国产精品人成在线观看免费| 高清国产午夜精品久久久久久| 久久精品免视看| 粉嫩欧美一区二区三区高清影视| 国产午夜亚洲精品理论片色戒| 国产在线精品国自产拍免费| 久久精品亚洲麻豆av一区二区| 国产美女一区二区三区| 欧美激情一区在线观看| 欧美日韩视频在线观看一区二区三区| 欧美影视一区二区三区| 最新日韩在线视频| eeuss鲁片一区二区三区在线观看| 欧美激情一区二区| 成人高清av在线| 亚洲区小说区图片区qvod| 色综合久久综合网欧美综合网| 一二三区精品视频| 欧美日韩大陆一区二区| 日本视频免费一区| 精品久久久久久久久久久久久久久 | 欧美日韩中文国产| 免费高清不卡av| 久久久久久一级片| 丰满白嫩尤物一区二区| 亚洲色图欧洲色图| 欧美日本视频在线| 激情亚洲综合在线| 亚洲欧美福利一区二区| 欧美伦理影视网| 韩国理伦片一区二区三区在线播放| 久久亚洲精精品中文字幕早川悠里| 成人综合日日夜夜| 亚洲一区精品在线| 欧美变态口味重另类| 成人激情开心网| 亚洲成av人综合在线观看| 精品成人佐山爱一区二区| 北岛玲一区二区三区四区| 亚洲午夜在线观看视频在线| 亚洲精品在线观看网站| 91麻豆123| 紧缚奴在线一区二区三区| ...中文天堂在线一区| 欧美精品一级二级三级| 高清在线成人网| 天堂影院一区二区| 日本一区二区免费在线| 欧美日韩亚洲综合在线| 国产不卡免费视频| 日韩精品一级中文字幕精品视频免费观看| 久久综合久久综合久久| 日本高清不卡aⅴ免费网站| 国模无码大尺度一区二区三区| 亚洲欧美一区二区三区久本道91| 日韩久久久精品| 91黄色免费版| 成人在线视频一区二区| 日本在线不卡一区| 亚洲精品免费在线播放| 久久久久国产精品人| 制服丝袜亚洲色图| 91蜜桃免费观看视频| 国产精品99久久久久久有的能看| 午夜精品久久久久久久久|