⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eth_miim.v

📁 此文档为采用FPGA实现的以太网MAC层
💻 V
📖 第 1 页 / 共 2 页
字号:
    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;    endend// 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    endend // 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    endend // 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    endend // Generation of the Operation signalsassign WriteDataOp  = WCtrlDataStart_q1 & ~WCtrlDataStart_q2;    assign ReadStatusOp = RStatStart_q1     & ~RStatStart_q2;assign ScanStatusOp = SyncStatMdcEn     & ~InProgress & ~InProgress_q1 & ~InProgress_q2;assign StartOp      = WriteDataOp | ReadStatusOp | ScanStatusOp;// Busyassign Busy = WCtrlData | WCtrlDataStart | RStat | 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    endend// 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    endend// Operation ends when the Bit Counter reaches 63assign 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 registerassign LatchByte1_d2 = InProgress & ~WriteOp & BitCounter == 7'h37;assign LatchByte0_d2 = InProgress & ~WriteOp & BitCounter == 7'h3F;// Connecting the Clock Generator Moduleeth_clockgen clkgen(.Clk(Clk), .Reset(Reset), .Divider(Divider[7:0]), .MdcEn(MdcEn), .MdcEn_n(MdcEn_n), .Mdc(Mdc)                    );// Connecting the Shift Register Moduleeth_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 Moduleeth_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 + -