Initial commit for fpga-shells
This commit is contained in:
244
src/main/scala/ip/xilinx/Xilinx.scala
Normal file
244
src/main/scala/ip/xilinx/Xilinx.scala
Normal file
@ -0,0 +1,244 @@
|
||||
// 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)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user