1
0
Fork 0
fpga-shells/src/main/scala/ip/xilinx/Xilinx.scala

245 lines
7.0 KiB
Scala

// See LICENSE for license details.
package sifive.fpgashells.ip.xilinx
import Chisel._
import chisel3.core.{Input, Output, attach}
import chisel3.experimental.{Analog}
import sifive.blocks.devices.pinctrl.{BasePin}
//========================================================================
// This file contains common devices used by our Xilinx FPGA flows and some
// BlackBox modules used in the Xilinx FPGA flows
//========================================================================
//-------------------------------------------------------------------------
// IBUFDS
//-------------------------------------------------------------------------
//IP : xilinx unisim IBUFDS. SelectIO Differential Signaling Input
// Buffer unparameterized
class IBUFDS extends BlackBox {
val io = new Bundle {
val O = Bool(OUTPUT)
val I = Bool(INPUT)
val IB = Bool(INPUT)
}
}
//-------------------------------------------------------------------------
// IBUFG
//-------------------------------------------------------------------------
/** IBUFG -- Clock Input Buffer */
class IBUFG extends BlackBox {
val io = new Bundle {
val O = Output(Clock())
val I = Input(Clock())
}
}
object IBUFG {
def apply (pin: Clock): Clock = {
val pad = Module (new IBUFG())
pad.io.I := pin
pad.io.O
}
}
//-------------------------------------------------------------------------
// IOBUF
//-------------------------------------------------------------------------
/** IOBUF -- Bidirectional IO Buffer. */
class IOBUF extends BlackBox {
val io = new Bundle {
val O = Output(Bool())
val IO = Analog(1.W)
val I = Input(Bool())
val T = Input(Bool())
}
}
object IOBUF {
def apply (pin: Analog, ctrl: BasePin): Bool = {
val pad = Module(new IOBUF())
pad.io.I := ctrl.o.oval
pad.io.T := ~ctrl.o.oe
ctrl.i.ival := pad.io.O & ctrl.o.ie
attach(pad.io.IO, pin)
pad.io.O & ctrl.o.ie
}
// Creates an output IOBUF
def apply (pin: Analog, in: Bool): Unit = {
val pad = Module(new IOBUF())
pad.io.I := in
pad.io.T := false.B
attach(pad.io.IO, pin)
}
// Creates an input IOBUF
def apply (pin: Analog): Bool = {
val pad = Module(new IOBUF())
pad.io.I := false.B
pad.io.T := true.B
attach(pad.io.IO, pin)
pad.io.O
}
}
//-------------------------------------------------------------------------
// PULLUP
//-------------------------------------------------------------------------
/** PULLUP : can be applied to Input to add a Pullup. */
class PULLUP extends BlackBox {
val io = new Bundle {
val O = Analog(1.W)
}
}
object PULLUP {
def apply (pin: Analog): Unit = {
val pullup = Module(new PULLUP())
attach(pullup.io.O, pin)
}
}
//-------------------------------------------------------------------------
// mmcm
//-------------------------------------------------------------------------
/** mmcm: This is generated by the Xilinx IP Generation Scripts */
class mmcm extends BlackBox {
val io = new Bundle {
val clk_in1 = Input(Clock())
val clk_out1 = Output(Clock())
val clk_out2 = Output(Clock())
val clk_out3 = Output(Clock())
val resetn = Input(Bool())
val locked = Output(Bool())
}
}
//-------------------------------------------------------------------------
// reset_sys
//-------------------------------------------------------------------------
/** reset_sys: This is generated by the Xilinx IP Generation Scripts */
class reset_sys extends BlackBox {
val io = new Bundle {
val slowest_sync_clk = Input(Clock())
val ext_reset_in = Input(Bool())
val aux_reset_in = Input(Bool())
val mb_debug_sys_rst = Input(Bool())
val dcm_locked = Input(Bool())
val mb_reset = Output(Bool())
val bus_struct_reset = Output(Bool())
val peripheral_reset = Output(Bool())
val interconnect_aresetn = Output(Bool())
val peripheral_aresetn = Output(Bool())
}
}
//-------------------------------------------------------------------------
// reset_mig
//-------------------------------------------------------------------------
/** reset_mig: This is generated by the Xilinx IP Generation Scripts */
class reset_mig extends BlackBox {
val io = new Bundle {
val slowest_sync_clk = Input(Clock())
val ext_reset_in = Input(Bool())
val aux_reset_in = Input(Bool())
val mb_debug_sys_rst = Input(Bool())
val dcm_locked = Input(Bool())
val mb_reset = Output(Bool())
val bus_struct_reset = Output(Bool())
val peripheral_reset = Output(Bool())
val interconnect_aresetn = Output(Bool())
val peripheral_aresetn = Output(Bool())
}
}
//-------------------------------------------------------------------------
// PowerOnResetFPGAOnly
//-------------------------------------------------------------------------
/** PowerOnResetFPGAOnly -- this generates a power_on_reset signal using
* initial blocks. It is synthesizable on FPGA flows only.
*/
// This is a FPGA-Only construct, which uses
// 'initial' constructions
class PowerOnResetFPGAOnly extends BlackBox {
val io = new Bundle {
val clock = Input(Clock())
val power_on_reset = Output(Bool())
}
}
object PowerOnResetFPGAOnly {
def apply (clk: Clock): Bool = {
val por = Module(new PowerOnResetFPGAOnly())
por.io.clock := clk
por.io.power_on_reset
}
}
//-------------------------------------------------------------------------
// vc707clk_wiz_sync
//-------------------------------------------------------------------------
//IP : xilinx mmcm with "NO_BUFFER" input clock
class vc707clk_wiz_sync extends BlackBox {
val io = new Bundle {
val clk_in1 = Bool(INPUT)
val clk_out1 = Clock(OUTPUT)
val clk_out2 = Clock(OUTPUT)
val clk_out3 = Clock(OUTPUT)
val clk_out4 = Clock(OUTPUT)
val clk_out5 = Clock(OUTPUT)
val clk_out6 = Clock(OUTPUT)
val clk_out7 = Clock(OUTPUT)
val reset = Bool(INPUT)
val locked = Bool(OUTPUT)
}
}
//-------------------------------------------------------------------------
// vc707reset
//-------------------------------------------------------------------------
class vc707reset() extends BlackBox
{
val io = new Bundle{
val areset = Bool(INPUT)
val clock1 = Clock(INPUT)
val reset1 = Bool(OUTPUT)
val clock2 = Clock(INPUT)
val reset2 = Bool(OUTPUT)
val clock3 = Clock(INPUT)
val reset3 = Bool(OUTPUT)
val clock4 = Clock(INPUT)
val reset4 = Bool(OUTPUT)
}
}
//-------------------------------------------------------------------------
// sdio_spi_bridge
//-------------------------------------------------------------------------
class sdio_spi_bridge() extends BlackBox
{
val io = new Bundle{
val clk = Clock(INPUT)
val reset = Bool(INPUT)
val sd_cmd = Analog(1.W)
val sd_dat = Analog(4.W)
val spi_sck = Bool(INPUT)
val spi_cs = Bool(INPUT)
val spi_dq_o = Bits(INPUT,4)
val spi_dq_i = Bits(OUTPUT,4)
}
}