OpenCores
URL https://opencores.org/ocsvn/aemb/aemb/trunk

Subversion Repositories aemb

[/] [aemb/] [branches/] [AEMB2_712/] [rtl/] [verilog/] [aeMB_ctrl.v] - Diff between revs 51 and 53

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 51 Rev 53
Line 1... Line 1...
// $Id: aeMB_ctrl.v,v 1.4 2007-11-08 17:48:14 sybreon Exp $
// $Id: aeMB_ctrl.v,v 1.5 2007-11-09 20:51:52 sybreon Exp $
//
//
// AEMB CONTROL UNIT
// AEMB CONTROL UNIT
// 
// 
// Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
// Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
//  
//  
Line 18... Line 18...
// License along with this library; if not, write to the Free Software
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA
// USA
//
//
// $Log: not supported by cvs2svn $
// $Log: not supported by cvs2svn $
 
// Revision 1.4  2007/11/08 17:48:14  sybreon
 
// Fixed data WISHBONE arbitration problem (reported by J Lee).
 
//
// Revision 1.3  2007/11/08 14:17:47  sybreon
// Revision 1.3  2007/11/08 14:17:47  sybreon
// Parameterised optional components.
// Parameterised optional components.
//
//
// Revision 1.2  2007/11/02 19:20:58  sybreon
// Revision 1.2  2007/11/02 19:20:58  sybreon
// Added better (beta) interrupt support.
// Added better (beta) interrupt support.
Line 33... Line 36...
// Code compatible with -O0/1/2/3/s generated code.
// Code compatible with -O0/1/2/3/s generated code.
//
//
 
 
module aeMB_ctrl (/*AUTOARG*/
module aeMB_ctrl (/*AUTOARG*/
   // Outputs
   // Outputs
   rMXDST, rMXSRC, rMXTGT, rMXALT, rMXALU, rRW, rDWBSTB, dwb_stb_o,
   rMXDST, rMXSRC, rMXTGT, rMXALT, rMXALU, rRW, rDWBSTB, rFSLSTB,
   dwb_wre_o,
   dwb_stb_o, dwb_wre_o, fsl_stb_o, fsl_wre_o,
   // Inputs
   // Inputs
   rXCE, rDLY, rIMM, rALT, rOPC, rRD, rRA, rRB, rPC, rBRA, rMSR_IE,
   rXCE, rDLY, rIMM, rALT, rOPC, rRD, rRA, rRB, rPC, rBRA, rMSR_IE,
   dwb_ack_i, iwb_ack_i, gclk, grst, gena
   dwb_ack_i, iwb_ack_i, fsl_ack_i, gclk, grst, gena
   );
   );
   // INTERNAL   
   // INTERNAL   
   //output [31:2] rPCLNK;
   //output [31:2] rPCLNK;
   output [1:0]  rMXDST;
   output [1:0]  rMXDST;
   output [1:0]  rMXSRC, rMXTGT, rMXALT;
   output [1:0]  rMXSRC, rMXTGT, rMXALT;
   output [2:0]  rMXALU;
   output [2:0]  rMXALU;
   output [4:0]  rRW;
   output [4:0]  rRW;
   output        rDWBSTB;
   output        rDWBSTB;
 
   output        rFSLSTB;
 
 
   input [1:0]    rXCE;
   input [1:0]    rXCE;
   input         rDLY;
   input         rDLY;
   input [15:0]  rIMM;
   input [15:0]  rIMM;
   input [10:0]  rALT;
   input [10:0]  rALT;
   input [5:0]    rOPC;
   input [5:0]    rOPC;
Line 64... Line 69...
   input         dwb_ack_i;
   input         dwb_ack_i;
 
 
   // INST WISHBONE
   // INST WISHBONE
   input         iwb_ack_i;
   input         iwb_ack_i;
 
 
 
   // FSL WISHBONE
 
   output        fsl_stb_o;
 
   output        fsl_wre_o;
 
   input         fsl_ack_i;
 
 
   // SYSTEM
   // SYSTEM
   input         gclk, grst, gena;
   input         gclk, grst, gena;
 
 
   // --- DECODE INSTRUCTIONS
   // --- DECODE INSTRUCTIONS
   // TODO: Simplify
   // TODO: Simplify
Line 89... Line 99...
 
 
   wire          fLOD = ({rOPC[5:4],rOPC[2]} == 3'o6);
   wire          fLOD = ({rOPC[5:4],rOPC[2]} == 3'o6);
   wire          fSTR = ({rOPC[5:4],rOPC[2]} == 3'o7);
   wire          fSTR = ({rOPC[5:4],rOPC[2]} == 3'o7);
   wire          fLDST = (&rOPC[5:4]);
   wire          fLDST = (&rOPC[5:4]);
 
 
 
   wire          fPUT = (rOPC == 6'o33) & rRB[4];
 
   wire          fGET = (rOPC == 6'o33) & !rRB[4];
 
 
   // --- OPERAND SELECTOR ---------------------------------
   // --- OPERAND SELECTOR ---------------------------------
 
 
   wire          fRDWE = |rRW;
   wire          fRDWE = |rRW;
   wire          fAFWD_M = (rRW == rRA) & (rMXDST == 2'o2) & fRDWE;
   wire          fAFWD_M = (rRW == rRA) & (rMXDST == 2'o2) & fRDWE;
Line 128... Line 140...
                (fDIV) ? 3'o6 :
                (fDIV) ? 3'o6 :
                3'o0;
                3'o0;
   end
   end
 
 
 
 
   // --- RAM CONTROL ---------------------------------------
 
 
 
   reg           rDWBSTB, xDWBSTB;
 
   reg           rDWBWRE, xDWBWRE;
 
 
 
   assign        dwb_stb_o = rDWBSTB;
 
   assign        dwb_wre_o = rDWBWRE;
 
 
 
   // --- DELAY SLOT REGISTERS ------------------------------
   // --- DELAY SLOT REGISTERS ------------------------------
 
 
   reg [31:2]    rPCLNK, xPCLNK;
   reg [31:2]    rPCLNK, xPCLNK;
   reg [1:0]      rMXDST, xMXDST;
   reg [1:0]      rMXDST, xMXDST;
   reg [4:0]      rRW, xRW;
   reg [4:0]      rRW, xRW;
 
 
   wire          fSKIP = (rBRA & !rDLY);
   wire          fSKIP = (rBRA & !rDLY);
   wire          fDACK = !(rDWBSTB ^ dwb_ack_i);
 
 
 
   always @(/*AUTOSENSE*/fLOD or fSKIP or fSTR or iwb_ack_i or rXCE)
   always @(/*AUTOSENSE*/fBCC or fBRU or fGET or fLOD or fRTD or fSKIP
     if (fSKIP | |rXCE) begin
            or fSTR or rRD or rXCE)
        /*AUTORESET*/
 
        // Beginning of autoreset for uninitialized flops
 
        xDWBSTB <= 1'h0;
 
        xDWBWRE <= 1'h0;
 
        // End of automatics
 
     end else begin
 
        xDWBSTB <= (fLOD | fSTR) & iwb_ack_i;
 
        xDWBWRE <= fSTR & iwb_ack_i;
 
     end
 
 
 
   always @(/*AUTOSENSE*/fBCC or fBRU or fLOD or fRTD or fSKIP or fSTR
 
            or rRD or rXCE)
 
     if (fSKIP) begin
     if (fSKIP) begin
        /*AUTORESET*/
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
        // Beginning of autoreset for uninitialized flops
        xMXDST <= 2'h0;
        xMXDST <= 2'h0;
        xRW <= 5'h0;
        xRW <= 5'h0;
        // End of automatics
        // End of automatics
     end else begin
     end else begin
        case (rXCE)
        case (rXCE)
          2'o2: xMXDST <= 2'o1;
          2'o2: xMXDST <= 2'o1;
          default: xMXDST <= (fSTR | fRTD | fBCC) ? 2'o3 :
          default: xMXDST <= (fSTR | fRTD | fBCC) ? 2'o3 :
                             (fLOD) ? 2'o2 :
                             (fLOD | fGET) ? 2'o2 :
                             (fBRU) ? 2'o1 :
                             (fBRU) ? 2'o1 :
                             2'o0;
                             2'o0;
        endcase
        endcase
 
 
        case (rXCE)
        case (rXCE)
Line 182... Line 173...
        endcase
        endcase
 
 
     end // else: !if(fSKIP)
     end // else: !if(fSKIP)
 
 
 
 
   // --- PIPELINE CONTROL DELAY ----------------------------
   // --- DATA WISHBONE ----------------------------------
 
 
   always @(posedge gclk)
   wire          fDACK = !(rDWBSTB ^ dwb_ack_i);
     if (grst) begin
 
 
   reg           rDWBSTB, xDWBSTB;
 
   reg           rDWBWRE, xDWBWRE;
 
 
 
   assign        dwb_stb_o = rDWBSTB;
 
   assign        dwb_wre_o = rDWBWRE;
 
 
 
 
 
   always @(/*AUTOSENSE*/fLOD or fSKIP or fSTR or iwb_ack_i or rXCE)
 
     if (fSKIP | |rXCE) begin
        /*AUTORESET*/
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
        // Beginning of autoreset for uninitialized flops
        rMXDST <= 2'h0;
        xDWBSTB <= 1'h0;
        rRW <= 5'h0;
        xDWBWRE <= 1'h0;
        // End of automatics
        // End of automatics
     end else if (gena) begin
     end else begin
        //rPCLNK <= #1 xPCLNK;
        xDWBSTB <= (fLOD | fSTR) & iwb_ack_i;
        rMXDST <= #1 xMXDST;
        xDWBWRE <= fSTR & iwb_ack_i;
        rRW <= #1 xRW;
 
     end
     end
 
 
   always @(posedge gclk)
   always @(posedge gclk)
     if (grst) begin
     if (grst) begin
        /*AUTORESET*/
        /*AUTORESET*/
Line 210... Line 209...
        rDWBSTB <= #1 xDWBSTB;
        rDWBSTB <= #1 xDWBSTB;
        rDWBWRE <= #1 xDWBWRE;
        rDWBWRE <= #1 xDWBWRE;
     end
     end
 
 
 
 
 
   // --- FSL WISHBONE -----------------------------------
 
 
 
   wire          fFACK = !(rFSLSTB ^ fsl_ack_i);
 
 
 
   reg           rFSLSTB, xFSLSTB;
 
   reg           rFSLWRE, xFSLWRE;
 
 
 
   assign        fsl_stb_o = rFSLSTB;
 
   assign        fsl_wre_o = rFSLWRE;
 
 
 
   always @(/*AUTOSENSE*/fGET or fPUT or fSKIP or iwb_ack_i or rXCE)
 
     if (fSKIP | |rXCE) begin
 
        /*AUTORESET*/
 
        // Beginning of autoreset for uninitialized flops
 
        xFSLSTB <= 1'h0;
 
        xFSLWRE <= 1'h0;
 
        // End of automatics
 
     end else begin
 
        xFSLSTB <= (fPUT | fGET) & iwb_ack_i;
 
        xFSLWRE <= fPUT & iwb_ack_i;
 
     end
 
 
 
   always @(posedge gclk)
 
     if (grst) begin
 
        /*AUTORESET*/
 
        // Beginning of autoreset for uninitialized flops
 
        rFSLSTB <= 1'h0;
 
        rFSLWRE <= 1'h0;
 
        // End of automatics
 
     end else if (fFACK) begin
 
        rFSLSTB <= #1 xFSLSTB;
 
        rFSLWRE <= #1 xFSLWRE;
 
     end
 
 
 
   // --- PIPELINE CONTROL DELAY ----------------------------
 
 
 
   always @(posedge gclk)
 
     if (grst) begin
 
        /*AUTORESET*/
 
        // Beginning of autoreset for uninitialized flops
 
        rMXDST <= 2'h0;
 
        rRW <= 5'h0;
 
        // End of automatics
 
     end else if (gena) begin
 
        //rPCLNK <= #1 xPCLNK;
 
        rMXDST <= #1 xMXDST;
 
        rRW <= #1 xRW;
 
     end
 
 
 
 
endmodule // aeMB_ctrl
endmodule // aeMB_ctrl
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.