Compare commits
	
		
			8 Commits
		
	
	
		
			master
			...
			b2b19cc822
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| b2b19cc822 | |||
| 5db71d11c2 | |||
| f4ae1d469f | |||
| 0b421d5645 | |||
| 8329b232e2 | |||
| 2ff28e6af6 | |||
| 41362a1cb5 | |||
| e9625bf8ee | 
| @@ -94,6 +94,15 @@ object PowerOnResetFPGAOnly { | ||||
|   } | ||||
| } | ||||
|  | ||||
| // ML507 clock generation | ||||
| class ml507_sys_clock extends BlackBox { | ||||
|   val io = new Bundle { | ||||
|     val CLKIN_IN  = Bool(INPUT) | ||||
|     val CLKFX_OUT = Clock(OUTPUT) | ||||
|     val LOCKED_OUT = Bool(OUTPUT) | ||||
|   } | ||||
| } | ||||
|  | ||||
| //------------------------------------------------------------------------- | ||||
| // vc707_sys_clock_mmcm | ||||
| //------------------------------------------------------------------------- | ||||
|   | ||||
							
								
								
									
										207
									
								
								src/main/scala/shell/xilinx/ML507Shell.scala
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										207
									
								
								src/main/scala/shell/xilinx/ML507Shell.scala
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,207 @@ | ||||
| // See LICENSE for license details. | ||||
| package sifive.fpgashells.shell.xilinx.ml507shell | ||||
|  | ||||
| import Chisel._ | ||||
| import chisel3.core.{Input, Output, attach} | ||||
| import chisel3.experimental.{RawModule, Analog, withClockAndReset} | ||||
|  | ||||
| import freechips.rocketchip.config._ | ||||
| import freechips.rocketchip.devices.debug._ | ||||
| import freechips.rocketchip.util.{SyncResetSynchronizerShiftReg, ElaborationArtefacts, HeterogeneousBag} | ||||
|  | ||||
| import sifive.blocks.devices.gpio._ | ||||
| import sifive.blocks.devices.spi._ | ||||
| import sifive.blocks.devices.uart._ | ||||
| import sifive.blocks.devices.chiplink._ | ||||
|  | ||||
| import sifive.fpgashells.ip.xilinx.{IBUFDS, PowerOnResetFPGAOnly, sdio_spi_bridge, ml507_sys_clock , vc707reset} | ||||
|  | ||||
| //------------------------------------------------------------------------- | ||||
| // ML507Shell | ||||
| //------------------------------------------------------------------------- | ||||
|  | ||||
| // TODO: trait HasDDR2 { … } | ||||
|  | ||||
| trait HasDebugJTAG { this: ML507Shell => | ||||
|   // JTAG | ||||
|   val jtag_TCK             = IO(Input(Clock())) | ||||
|   val jtag_TMS             = IO(Input(Bool())) | ||||
|   val jtag_TDI             = IO(Input(Bool())) | ||||
|   val jtag_TDO             = IO(Output(Bool())) | ||||
|  | ||||
|   def connectDebugJTAG(dut: HasPeripheryDebugModuleImp, fmcxm105: Boolean = true): SystemJTAGIO = { | ||||
|     val djtag     = dut.debug.systemjtag.get | ||||
|  | ||||
|     djtag.jtag.TCK := jtag_TCK | ||||
|     djtag.jtag.TMS := jtag_TMS | ||||
|     djtag.jtag.TDI := jtag_TDI | ||||
|     jtag_TDO       := djtag.jtag.TDO.data | ||||
|  | ||||
|     djtag.mfr_id   := p(JtagDTMKey).idcodeManufId.U(11.W) | ||||
|  | ||||
|     djtag.reset    := PowerOnResetFPGAOnly(dut_clock) | ||||
|     dut_ndreset    := dut.debug.ndreset | ||||
|     djtag | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| abstract class ML507Shell(implicit val p: Parameters) extends RawModule { | ||||
|  | ||||
|   //----------------------------------------------------------------------- | ||||
|   // Interface | ||||
|   //----------------------------------------------------------------------- | ||||
|  | ||||
|   // 100Mhz sysclk | ||||
|   val sys_clock_100        = IO(Input(Bool())) | ||||
|  | ||||
|   // active high reset | ||||
|   val reset                = IO(Input(Bool())) | ||||
|  | ||||
|   // LED | ||||
|   val led                  = IO(Vec(8, Output(Bool()))) | ||||
|  | ||||
|   // UART | ||||
|   val uart_tx              = IO(Output(Bool())) | ||||
|   val uart_rx              = IO(Input(Bool())) | ||||
|  | ||||
|   // SDIO | ||||
|   val sdio_clk             = IO(Output(Bool())) | ||||
|   val sdio_cmd             = IO(Analog(1.W)) | ||||
|   val sdio_dat             = IO(Analog(4.W)) | ||||
|  | ||||
|   //Buttons | ||||
|   val btn_0                = IO(Input(Bool())) | ||||
|   val btn_1                = IO(Input(Bool())) | ||||
|   val btn_2                = IO(Input(Bool())) | ||||
|   val btn_3                = IO(Input(Bool())) | ||||
|  | ||||
|   //Sliding switches | ||||
|   val sw_0                 = IO(Input(Bool())) | ||||
|   val sw_1                 = IO(Input(Bool())) | ||||
|   val sw_2                 = IO(Input(Bool())) | ||||
|   val sw_3                 = IO(Input(Bool())) | ||||
|   val sw_4                 = IO(Input(Bool())) | ||||
|   val sw_5                 = IO(Input(Bool())) | ||||
|   val sw_6                 = IO(Input(Bool())) | ||||
|   val sw_7                 = IO(Input(Bool())) | ||||
|  | ||||
|   // Feedback | ||||
|   val clock_led            = IO(Output(Clock())) | ||||
|   val reset_led            = IO(Output(Bool())) | ||||
|  | ||||
|   //----------------------------------------------------------------------- | ||||
|   // Wire declrations | ||||
|   //----------------------------------------------------------------------- | ||||
|  | ||||
|   val sys_clock       = Wire(Clock()) | ||||
|   val sys_reset       = Wire(Bool()) | ||||
|  | ||||
|   val dut_clock       = Wire(Clock()) | ||||
|   val dut_reset       = Wire(Bool()) | ||||
|  | ||||
|   val dut_ndreset     = Wire(Bool()) | ||||
|  | ||||
|   val sd_spi_sck      = Wire(Bool()) | ||||
|   val sd_spi_cs       = Wire(Bool()) | ||||
|   val sd_spi_dq_i     = Wire(Vec(4, Bool())) | ||||
|   val sd_spi_dq_o     = Wire(Vec(4, Bool())) | ||||
|  | ||||
|   val do_reset        = Wire(Bool()) | ||||
|  | ||||
|   val clk_locked      = Wire(Bool()) | ||||
|  | ||||
|  | ||||
|   //----------------------------------------------------------------------- | ||||
|   // System clock and reset | ||||
|   //----------------------------------------------------------------------- | ||||
|  | ||||
|   // Clock that drives the clock generator and the MIG | ||||
|   sys_clock := sys_clock_100.asClock() | ||||
|  | ||||
|   // Allow the debug module to reset everything. Resets the MIG | ||||
|   sys_reset := reset | dut_ndreset | ||||
|  | ||||
|   //----------------------------------------------------------------------- | ||||
|   // Clock Generator | ||||
|   //----------------------------------------------------------------------- | ||||
|  | ||||
|   //50MHz (37.5MHz) | ||||
|   val ml507_sys_clock = Module(new ml507_sys_clock) | ||||
|   ml507_sys_clock.io.CLKIN_IN := sys_clock.asUInt | ||||
|   val clk50 = ml507_sys_clock.io.CLKFX_OUT | ||||
|   clk_locked := ml507_sys_clock.io.LOCKED_OUT | ||||
|  | ||||
|   // DUT clock | ||||
|   dut_clock := clk50 | ||||
|  | ||||
|   //----------------------------------------------------------------------- | ||||
|   // System reset | ||||
|   //----------------------------------------------------------------------- | ||||
|  | ||||
|   do_reset             := !clk_locked || sys_reset | ||||
|  | ||||
|   // TODO: adapt for ml507? | ||||
|   val safe_reset = Module(new vc707reset) | ||||
|  | ||||
|   safe_reset.io.areset := do_reset | ||||
|   safe_reset.io.clock1 := dut_clock | ||||
|   safe_reset.io.clock2 := dut_clock | ||||
|   safe_reset.io.clock3 := dut_clock | ||||
|   safe_reset.io.clock4 := dut_clock | ||||
|   dut_reset            := safe_reset.io.reset4 | ||||
|  | ||||
|   // Setup feedback | ||||
|   clock_led := dut_clock | ||||
|   reset_led := dut_reset | ||||
|  | ||||
|   //----------------------------------------------------------------------- | ||||
|   // UART | ||||
|   //----------------------------------------------------------------------- | ||||
|  | ||||
|   def connectUART(dut: HasPeripheryUARTModuleImp): Unit = { | ||||
|     val uartParams = p(PeripheryUARTKey) | ||||
|     if (!uartParams.isEmpty) { | ||||
|       // uart connections | ||||
|       dut.uart(0).rxd := SyncResetSynchronizerShiftReg(uart_rx, 2, init = Bool(true), name=Some("uart_rxd_sync")) | ||||
|       uart_tx         := dut.uart(0).txd | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   //----------------------------------------------------------------------- | ||||
|   // SPI | ||||
|   //----------------------------------------------------------------------- | ||||
|  | ||||
|   def connectSPI(dut: HasPeripherySPIModuleImp): Unit = { | ||||
|     // SPI | ||||
|     sd_spi_sck := dut.spi(0).sck | ||||
|     sd_spi_cs  := dut.spi(0).cs(0) | ||||
|  | ||||
|     dut.spi(0).dq.zipWithIndex.foreach { | ||||
|       case(pin, idx) => | ||||
|         sd_spi_dq_o(idx) := pin.o | ||||
|         pin.i            := sd_spi_dq_i(idx) | ||||
|     } | ||||
|  | ||||
|     //------------------------------------------------------------------- | ||||
|     // SDIO <> SPI Bridge | ||||
|     //------------------------------------------------------------------- | ||||
|  | ||||
|     val ip_sdio_spi = Module(new sdio_spi_bridge()) | ||||
|  | ||||
|     ip_sdio_spi.io.clk   := dut_clock | ||||
|     ip_sdio_spi.io.reset := dut_reset | ||||
|  | ||||
|     // SDIO | ||||
|     attach(sdio_dat, ip_sdio_spi.io.sd_dat) | ||||
|     attach(sdio_cmd, ip_sdio_spi.io.sd_cmd) | ||||
|     sdio_clk := ip_sdio_spi.io.spi_sck | ||||
|  | ||||
|     // SPI | ||||
|     ip_sdio_spi.io.spi_sck  := sd_spi_sck | ||||
|     ip_sdio_spi.io.spi_cs   := sd_spi_cs | ||||
|     sd_spi_dq_i             := ip_sdio_spi.io.spi_dq_i.toBools | ||||
|     ip_sdio_spi.io.spi_dq_o := sd_spi_dq_o.asUInt | ||||
|   } | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user