/* * Jazz library for PamDC: Pamette design library. * Patrice Bertin <Patrice.Bertin@cma.ensmp.fr> * CMA-Paris, Ecole des Mines de Paris */ package jazz.circuit.pam; import jazz.circuit.*; import jazz.circuit.pam.PamDC.*; /****************************************************************************** * * PCI-Pamette standard library * *****************************************************************************/ /* * Generic Pamette LCA template. */ public device UsrLCA extends Chip { // Standard readback module (mandatory). public static stdReadback(): (); // Standard clock inputs. public static getClkUsr(): Net; public static getClkSys(): Net; // Utility functions to configure and place I/O pins public static inputPin(pin: int): Net; public static outputPin(net: Net, pin: int): (); public static ioPin(net: Net, disable: Net, pin: int): Net; // Plug in the standard readback macro @ stdReadback(); } // Default chip specification for Pamette LCAs part@UsrLCA() = "XC4000E"; pkg@UsrLCA() = "PQ208"; speedGrade@UsrLCA() = 3; /* * Subclassable templates for the 4 individual LCAs. */ public device UsrLCA0 extends UsrLCA { // Pinout definition public static pads: UsrLCA0Pads = new UsrLCA0Pads(); } public device UsrLCA1 extends UsrLCA { // Pinout definition public static pads: UsrLCA1Pads = new UsrLCA1Pads(); } public device UsrLCA2 extends UsrLCA { // Pinout definition public static pads: UsrLCA2Pads = new UsrLCA2Pads(); } public device UsrLCA3 extends UsrLCA { // Pinout definition public static pads: UsrLCA3Pads = new UsrLCA3Pads(); } /* * Asynchronous PCI interface. * Usable in LCA0 and LCA1. */ public device AsyncPCI { public input toPCI: Net[16]; public output fromPCI: Net[16]; // Implementation for (i < 16) { fromPCI[i] = UsrLCA.inputPin(UsrLCA0Pads.ebus[i]); @ UsrLCA.outputPin(toPCI[i], UsrLCA0Pads.ebus[i + 16]); } } /* * SRAM bank interface. * Usable in LCA0 and LCA1. */ public device SRamBank { public input addr: Net[15]; public input wrData: Net[16]; public input _bank: Net[2]; public input _write: Net[2]; public input lcaDisable: Net; public input ramDisable: Net; public output rdData: Net[16]; // Implementation for (i < 15) { @ UsrLCA.outputPin(addr[i], SRamPads.addr[i]); } for (i < 16) { rdData[i] = UsrLCA.ioPin(wrData[i], lcaDisable, SRamPads.data[i]); } for (i < 2) { @ UsrLCA.outputPin(_write[i], SRamPads._write[i]); @ UsrLCA.outputPin(_bank[i], SRamPads._bank[i]); } @ UsrLCA.outputPin(ramDisable, SRamPads._oe); } /****************************************************************************** * * Implementation * *****************************************************************************/ UsrLCA.stdReadback() = () { md0 = new Md0Pad().o; rdbk_data = new Rdbk(trig = md0).data; @ new Md1Pad(i = rdbk_data, t = Net.constant(0)); } UsrLCA.getClkUsr() = clk { clkin = inputPin(UsrLcaPads.clkusr); clk = +clkin; @ globalBuffer(clk, BUFG); } UsrLCA.getClkSys() = clk { clkin = inputPin(UsrLcaPads.clksys); clk = +clkin; @ globalBuffer(clk, BUFG); } UsrLCA.inputPin(pin) = net { net = new InputPad().o; @ assignIOB(net, pin); } UsrLCA.outputPin(net, pin) = () { @ new OutputPad(i = net); @ assignIOB(net, pin); } UsrLCA.ioPin(o, disable, pin) = i { i = new Bus(n = 1, in = [o], disable = [disable]).out; @ assignIOB(i, pin); }