import Chisel._
-class SPIFlashInsn(c: SPIFlashConfigBase) extends SPIBundle(c) {
+class SPIFlashInsn(c: SPIFlashParamsBase) extends SPIBundle(c) {
val cmd = new Bundle with HasSPIProtocol {
val code = Bits(width = c.insnCmdBits)
val en = Bool()
val data = new Bundle with HasSPIProtocol
}
-class SPIFlashControl(c: SPIFlashConfigBase) extends SPIBundle(c) {
+class SPIFlashControl(c: SPIFlashParamsBase) extends SPIBundle(c) {
val insn = new SPIFlashInsn(c)
val fmt = new Bundle with HasSPIEndian
}
object SPIFlashInsn {
- def init(c: SPIFlashConfigBase): SPIFlashInsn = {
+ def init(c: SPIFlashParamsBase): SPIFlashInsn = {
val insn = Wire(new SPIFlashInsn(c))
insn.cmd.en := Bool(true)
insn.cmd.code := Bits(0x03)
}
}
-class SPIFlashAddr(c: SPIFlashConfigBase) extends SPIBundle(c) {
+class SPIFlashAddr(c: SPIFlashParamsBase) extends SPIBundle(c) {
val next = UInt(width = c.insnAddrBits)
val hold = UInt(width = c.insnAddrBits)
}
-class SPIFlashMap(c: SPIFlashConfigBase) extends Module {
+class SPIFlashMap(c: SPIFlashParamsBase) extends Module {
val io = new Bundle {
val en = Bool(INPUT)
val ctrl = new SPIFlashControl(c).asInput
}
}
- val (s_idle :: s_cmd :: s_addr :: s_pad :: s_data_pre :: s_data_post :: Nil) = Enum(UInt(), 6)
+ val (s_idle :: s_cmd :: s_addr :: s_pad :: s_data_pre :: s_data_post :: s_off :: Nil) = Enum(UInt(), 7)
val state = Reg(init = s_idle)
switch (state) {
io.link.lock := Bool(false)
}
} .otherwise {
- io.data.valid := io.addr.valid
- io.addr.ready := io.data.ready
- io.data.bits := UInt(0)
+ io.addr.ready := Bool(true)
io.link.lock := Bool(false)
+ when (io.addr.valid) {
+ state := s_off
+ }
}
}
state := s_idle
}
}
+
+ is (s_off) {
+ io.data.valid := Bool(true)
+ io.data.bits := UInt(0)
+ when (io.data.ready) {
+ state := s_idle
+ }
+ }
}
}