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

Subversion Repositories Aquarius

[/] [Aquarius/] [trunk/] [verilog/] [top.v] - Rev 2

Go to most recent revision | Compare with Previous | Blame | View Log

//======================================================
// Aquarius Project
//    SuperH-2 ISA Compatible RISC CPU
//------------------------------------------------------
// Module      : Top Layer (A Simple MCU)
//------------------------------------------------------
// File        : top.v
// Library     : none
// Description : Top Layer for Aquarius.
//               It is a simple MCU Chip.
// Simulator   : Icarus Verilog (Cygwin)
// Synthesizer : Xilinx XST (Windows XP)
// Author      : Thorn Aitch
//------------------------------------------------------
// Revision Number : 1
// Date of Change  : 15th April 2002
// Creator         : Thorn Aitch
// Description     : Initial Design				  
//------------------------------------------------------
// Revision Number : 2
// Date of Change  : 30th April 2003
// Modifier        : Thorn Aitch
// Description     : Release Version 1.0
//======================================================
// Copyright (C) 2002-2003, Thorn Aitch
//
// Designs can be altered while keeping list of
// modifications "the same as in GNU" No money can
// be earned by selling the designs themselves, but
// anyone can get money by selling the implementation
// of the design, such as ICs based on some cores, 
// boards based on some schematics or Layouts, and
// even GUI interfaces to text mode drivers.
// "The same as GPL SW" Any update to the design
// should be documented and returned to the design. 
// Any derivative work based on the IP should be free
// under OpenIP License. Derivative work means any
// update, change or improvement on the design. 
// Any work based on the design can be either made
// free under OpenIP license or protected by any other
// license. Work based on the design means any work uses
// the OpenIP Licensed core as a building black without
// changing anything on it with any other blocks to
// produce larger design.  There is NO WARRANTY on the
// functionality or performance of the design on the
// real hardware implementation.
// On the other hand, the SuperH-2 ISA (Instruction Set
// Architecture) executed by Aquarius is rigidly
// the property of Renesas Corp. Then you have all 
// responsibility to judge if there are not any 
// infringements to Renesas's rights regarding your 
// Aquarius adoption into your design. 
// By adopting Aquarius, the user assumes all 
// responsibility for its use.
// This project may cause any damages around you, for 
// example, loss of properties, data, money, profits,
// life, or business etc. By adopting this source, 
// the user assumes all responsibility for its use.
//======================================================
 
`include "timescale.v"
`include "defines.v"
 
//******************************
// Top Module
//******************************
module top(
      CLK_SRC, RST_n,
      LCDRS, LCDRW, LCDE,
	  LCDDBO, LCDDBI,
	  KEYYO, KEYXI,
      RXD, TXD, CTS, RTS
    );
 
    input  CLK_SRC; // non stop clock
    input  RST_n;
    output LCDRS;
    output LCDRW;
    output LCDE;
    output [7:0] LCDDBO;
    input  [7:0] LCDDBI;
    output [4:0] KEYYO;
    input  [4:0] KEYXI;
    input  RXD;
    output TXD;
    input  CTS;
    output RTS;
 
//------------------
// Internal Signals
//------------------
    wire   CLK;           // internal system clock, which stops during sleep
    reg    RST;           // 2nd sync reset
    reg    RST1;          // 1st sync reset 
    wire   CYC;           // external bus cycle to be kept
    wire   STB;           // external bus strobe
    reg    ACK;           // external device acknowledge
    wire   [31:0] ADR;    // external address
    reg    [31:0] DATI;   // external data read bus
    wire   [31:0] DATO;   // external data write bus
    wire   WE;            // external write/read
    wire   [3:0] SEL;     // external data valid position
    reg    IF_WIDTH;      // IF_WIDTH : external fetch space width
 
    reg    CEMEM, CEPIO, CEUART, CESYS;  // chip enable of each device
    wire   [31:0] DATMEM;  // direct memory output
    wire   [31:0] DATPIO;  // direct pio output
    wire   [31:0] DATUART; // direct uart output 
    wire   [31:0] DATSYS ; // direct sys output
    wire   [31:0] PI;  // port input
    wire   [31:0] PO;  // port output
 
    wire   RXD, TXD, CTS, RTS; //uart signals
 
    wire   [2:0] EVENT_REQ;   // Hardware Exception Event Request
    wire   EVENT_ACK;         // Hardware Exception Event Acknowledge
    wire   [11:0] EVENT_INFO; // Hardware Exception Event Information
 
    wire   SLP;       // SLEEP output
 
    assign LCDRS     = PO[8];
    assign LCDRW     = PO[9];
    assign LCDE      = PO[10];
    assign LCDDBO    = PO[7:0];
    assign PI[ 7: 0] = LCDDBI;
    assign KEYYO     = PO[20:16];
    assign PI[20:16] = KEYXI; 
    assign PI[31:21] = 11'b00000000000;
    assign PI[15: 8] =  8'b00000000;
 
//********
// Modules
//********
    cpu CPU(
        // system signal
        .CLK(CLK), .RST(RST),
        // WISHBONE external bus signal
        .CYC_O(CYC), .STB_O(STB), .ACK_I(ACK),
        .ADR_O(ADR), .DAT_I(DATI), .DAT_O(DATO),
        .WE_O(WE), .SEL_O(SEL),
        .TAG0_I(IF_WIDTH),
        // Exception
        .EVENT_REQ_I(EVENT_REQ),
        .EVENT_ACK_O(EVENT_ACK), 
        .EVENT_INFO_I(EVENT_INFO),
        //SLEEP
        .SLP_O(SLP)
    );
 
    memory MEMORY(
        .CLK(CLK), .CE(CEMEM), .WE(WE), .SEL(SEL),
        .ADR(ADR[13:0]), .DATI(DATO), .DATO(DATMEM)
    );
 
    pio PIO(
        .CLK(CLK), .RST(RST), 
        .CE(CEPIO), .WE(WE), .SEL(SEL), 
        .DATI(DATO), .DATO(DATPIO),
        .PI(PI), .PO(PO)
    );
 
    uart UART(
        .CLK(CLK), .RST(RST), 
        .CE(CEUART), .WE(WE), .SEL(SEL), 
        .DATI(DATO), .DATO(DATUART),
        .RXD(RXD), .TXD(TXD), .CTS(CTS), .RTS(RTS)
    );
 
    sys SYS(
        .CLK_SRC(CLK_SRC), .CLK(CLK), .SLP(SLP), .WAKEUP(~KEYXI[4]), .RST(RST), 
        .CE(CESYS), .WE(WE), .SEL(SEL), .ACK(ACK), 
        .DATI(DATO), .DATO(DATSYS),
        .EVENT_REQ(EVENT_REQ),
        .EVENT_ACK(EVENT_ACK),
        .EVENT_INFO(EVENT_INFO), 
        .STB(STB), .ADR(ADR)
    );
 
//************
// Address MAP
//************
// address           size wait width device
// 00000000-0000FFFF 64K  0    32    MEMORY (shadow every 16KB)
// 00010000-0001FFFF 64K  3    32    MEMORY (shadow every 16KB)
// 00020000-0002FFFF 64K  0    16    MEMORY (shadow every 16KB)
// 00030000-0003FFFF 64K  3    16    MEMORY (shadow every 16KB)
// 00040000-ABCCFFFF ................(shadow MEMORY)
// ABCD0000-ABCD00FF 256  3    32    PIO (shadow every 4B)
// ABCD0100-ABCD01FF 256  3    32    UART(shadow every 4B)
// ABCD0200-ABCD02FF 256  3    32    SYS (shadow every 8B)
// ABCD0300-FFFBFFFF ................(shadow MEMORY)
// FFFC0000-FFFCFFFF 64K  0    32    MEMORY (shadow every 16KB)
// FFFD0000-FFFDFFFF 64K  3    32    MEMORY (shadow every 16KB)
// FFFE0000-FFFEFFFF 64K  0    16    MEMORY (shadow every 16KB)
// FFFF0000-FFFFFFFF 64K  3    16    MEMORY (shadow every 16KB)
//
// <MEMORY>
// ****0000-****1FFF  8K  ROM
// ****2000-****3FFF  8K  RAM
// ****4000-****5FFF  8K  ROM (shadow)
// ****6000-****7FFF  8K  RAM (shadow)
// ****8000-****9FFF  8K  ROM (shadow)
// ****A000-****BFFF  8K  RAM (shadow)
// ****C000-****DFFF  8K  ROM (shadow)
// ****E000-****FFFF  8K  RAM (shadow)
 
    always @(posedge CLK)
    begin
        RST1 <= ~RST_n;
        RST  <= RST1;
    end
 
    always @(DATMEM or DATPIO or DATUART or DATSYS) begin
       DATI <= DATMEM | DATPIO | DATUART | DATSYS; // read data gathering 
    end
 
    always @(STB or ADR) 
    begin
        if (STB == 1'b0)
            {CEMEM,CEPIO,CEUART,CESYS} <= 4'b0000;
        else if (ADR[31:8] == 24'hABCD00)
            {CEMEM,CEPIO,CEUART,CESYS} <= 4'b0100;
        else if (ADR[31:8] == 24'hABCD01)
            {CEMEM,CEPIO,CEUART,CESYS} <= 4'b0010;
        else if (ADR[31:8] == 24'hABCD02)
            {CEMEM,CEPIO,CEUART,CESYS} <= 4'b0001;
        else
            {CEMEM,CEPIO,CEUART,CESYS} <= 4'b1000;
    end
 
//---------------------
// Control Access Cycle
//---------------------
    reg ACK0; // 0 wait device
    reg ACK3; // 3 wait device
 
    always @(ACK0 or ACK3) begin
        ACK <= ACK0 | ACK3;
    end
 
    always @(STB or ADR) begin
        if ((STB == 1'b1) && (ADR[16] == 1'b0))
            ACK0 <= 1'b1;
        else
            ACK0 <= 1'b0;
    end
 
    // S0: ACK3=0
    // S1: ACK3=0
    // S2: ACK3=0
    // S3: ACK3=1
    //
    // S0 -> S0
    // S0 -> S1 if ADR = **8 ~ **F, then wait
    // S2 -> S3
    // S3 -> S0
 
    reg [1:0] ACK3_STATE;
    reg [1:0] ACK3_NEXT_STATE;
    always @(posedge CLK or posedge RST) begin
        if (RST == 1'b1)
            begin
                ACK3_STATE <= 2'b00;
            end
        else 
            begin
                ACK3_STATE <= ACK3_NEXT_STATE;
            end
    end
    always @(ACK3_STATE or STB or ADR) begin
        case (ACK3_STATE)
           2'b00 : if ((STB & ADR[16])  == 1'b1)
                       ACK3_NEXT_STATE <= 2'b01;
                   else
                       ACK3_NEXT_STATE <= 2'b00;
           2'b01 : ACK3_NEXT_STATE <= 2'b10;
           2'b10 : ACK3_NEXT_STATE <= 2'b11;
           2'b11 : ACK3_NEXT_STATE <= 2'b00;
           default : ACK3_NEXT_STATE <= 2'bxx;
        endcase
    end
    always @(ACK3_STATE)
        ACK3 <= ACK3_STATE[1] & ACK3_STATE[0];
 
//-------------------
// Control Data Width
//-------------------
    always @(ADR) begin
        if (ADR[17] == 1'b0)
            IF_WIDTH <= 1'b1;
        else
            IF_WIDTH <= 1'b0;
    end
 
//======================================================
  endmodule
//======================================================

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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