搜索
bottom↓
回复: 1

Chisel Uart 接收并发送

[复制链接]

出0入0汤圆

发表于 2019-2-20 20:36:35 | 显示全部楼层 |阅读模式
本帖最后由 Eworm001 于 2019-2-20 20:35 编辑

Uart.scala


  1. import chisel3._
  2. import chisel3.util._

  3. class UartRx extends Module {
  4.   val io = IO(new Bundle {
  5.     val rx = Input(Bool())
  6.     val d = Output(UInt(8.W))
  7.     val rdy = Output(Bool())
  8.     val clrRdy = Input(Bool())
  9.   })
  10.   val samStamp = RegInit(0.U(4.W))
  11.   //rx Debounce
  12.   val samBits = RegInit("hf".U)
  13.   samBits := Cat(samBits(2, 0), io.rx)
  14.   val rxDly0 = RegInit(true.B)
  15.   when(samBits.andR) {rxDly0 := true.B}
  16.     .elsewhen(samBits.orR) {rxDly0 := false.B}
  17.   val rxDly1 = RegNext(rxDly0, true.B)
  18.   val start = rxDly1 && (!rxDly0)

  19.   val samCnt = RegInit(0.U(4.W))
  20.   val bitCnt = RegInit(0.U(3.W))
  21.   val baudReq = (samCnt === 8.U)
  22.   val s_idle :: s_start :: s_data :: s_stop ::s_fend:: Nil = Enum(5)
  23.   val state = RegInit(s_idle)
  24.   switch(state) {
  25.     is(s_idle) {when(start) {state := s_start}}
  26.     is(s_start) {when(baudReq) {state := s_data}}
  27.     is(s_data){when(baudReq && (bitCnt === 7.U)) {state := s_stop}}
  28.     is(s_stop) {when(baudReq) {state := s_fend}}
  29.     is(s_fend){when(rxDly1){state := s_idle}}
  30.   }

  31.   when(state === s_idle) {samCnt := 0.U}
  32.     .otherwise {samCnt := samCnt + 1.U}

  33.   val tmp = RegInit(0.U(8.W))
  34.   when(state =/= s_data){bitCnt := 0.U}
  35.     .elsewhen(baudReq) {
  36.       tmp := Cat(rxDly1,tmp(7,1))
  37.       bitCnt := bitCnt + 1.U
  38.     }

  39.   val rdy_reg = RegInit(false.B)
  40.   val d_reg = RegInit(0.U(8.W))
  41.   when(io.clrRdy) {rdy_reg := false.B}
  42.   .elsewhen((state === s_fend)&&(!rdy_reg)){
  43.     d_reg := tmp
  44.     rdy_reg := true.B
  45.   }

  46.   io.d := d_reg
  47.   io.rdy := rdy_reg
  48. }

  49. class UartTx extends Module {
  50.   val io = IO(new Bundle {
  51.     var req = Input(Bool())
  52.     var d = Input(UInt(8.W))
  53.     val tx = Output(Bool())
  54.     val busy = Output(Bool())
  55.   })
  56.   //body
  57.   val tx_reg = RegInit(true.B)
  58.   val bsy_reg = RegInit(false.B)
  59.   val samCnt = RegInit(0.U(4.W))
  60.   val bitCnt = RegInit(0.U(4.W))
  61.   val baudReq = (samCnt === 15.U)
  62.   val s_idle :: s_start :: s_data :: s_stop ::s_fend :: Nil = Enum(5)
  63.   val state = RegInit(s_idle)
  64.   switch(state) {
  65.     is(s_idle) {when(io.req) {state := s_start}}
  66.     is(s_start) {when(baudReq) {state := s_data}}
  67.     is(s_data) {when(baudReq && (bitCnt === 7.U)) {state := s_stop}}
  68.     is(s_stop) {when(baudReq) {state := s_fend}}
  69.     is(s_fend){when(baudReq) {state := s_idle}}
  70.   }
  71.   when(state === s_idle) {samCnt := 0.U}
  72.     .otherwise {samCnt := samCnt + 1.U}

  73.   when(state =/= s_data) {bitCnt := 0.U}
  74.     .elsewhen(baudReq) {bitCnt := bitCnt + 1.U}

  75.   when(state === s_start) {tx_reg := false.B}
  76.     .elsewhen(state === s_data) {tx_reg := io.d(bitCnt)}
  77.     .elsewhen(state === s_stop) {tx_reg := true.B}
  78.     .otherwise {tx_reg := true.B}

  79.   when(state === s_idle) {bsy_reg := false.B}
  80.     .otherwise {bsy_reg := true.B}

  81.   io.tx := tx_reg
  82.   io.busy := bsy_reg
  83. }

  84. class UartCtl extends Module {
  85.   val io = IO(new Bundle {
  86.     val rxd = Input(UInt(8.W))
  87.     val rxrdy = Input(Bool())
  88.     val rxclrrdy = Output(Bool())
  89.     val txd = Output(UInt(8.W))
  90.     val txreq = Output(Bool())
  91.     val txbsy = Input(Bool())
  92.   })
  93.   //body

  94.   val txReq_reg = RegInit(false.B)
  95.   val rxClrRdy_reg = RegInit(false.B)
  96.   val txd_reg = RegInit(0.U(8.W))
  97.   val s_0 :: s_1 :: s_2:: s_3 ::s_4:: Nil = Enum(5)
  98.   val state = RegInit(s_0)
  99.   switch(state){
  100.     is(s_0){
  101.       when(io.rxrdy) {
  102.         txd_reg := io.rxd
  103.         rxClrRdy_reg := true.B
  104.         state := s_1
  105.       }
  106.     }
  107.     is(s_1){
  108.       rxClrRdy_reg := false.B
  109.       state := s_0
  110.     }
  111.   }

  112.   val txState = RegInit(s_0)
  113.   switch(txState) {
  114.     is(s_0) {
  115.       when(rxClrRdy_reg) {
  116.         txReq_reg := true.B
  117.         txState := s_1
  118.       }
  119.     }
  120.     is(s_1) {
  121.       when(io.txbsy) {
  122.         txReq_reg := false.B
  123.         txState := s_2
  124.       }
  125.     }
  126.     is(s_2) {
  127.       when(!io.txbsy) {
  128.         txState := s_0
  129.       }
  130.     }
  131.   }

  132.   io.rxclrrdy := rxClrRdy_reg
  133.   io.txd := txd_reg
  134.   io.txreq := txReq_reg
  135. }

  136. class UartTop extends Module {
  137.   val io = IO(new Bundle {
  138.     val rx = Input(Bool())
  139.     val tx = Output(Bool())
  140.   })
  141.   //body
  142.   val rx = Module(new UartRx)
  143.   val tx = Module(new UartTx)
  144.   val ctl = Module(new UartCtl)

  145.   io.tx := tx.io.tx
  146.   ctl.io.txbsy := tx.io.busy
  147.   tx.io.d := ctl.io.txd
  148.   tx.io.req := ctl.io.txreq

  149.   rx.io.rx := io.rx
  150.   rx.io.clrRdy := ctl.io.rxrdy
  151.   ctl.io.rxd := rx.io.d
  152.   ctl.io.rxrdy := rx.io.rdy
  153.   rx.io.clrRdy := ctl.io.rxclrrdy
  154. }
复制代码


UartTest.scala

  1. class UartTopTest(c:UartTop) extends  PeekPokeTester(c){
  2.   poke(c.io.rx,true)
  3.   step(200)

  4.   for (i <- 0 to 255) {
  5.     //printf(p"Step $i")
  6.     //a Byte
  7.     var d =i
  8.     poke(c.io.rx, false)
  9.     step(16)
  10.     for(j <- 0 to 7){
  11.       poke(c.io.rx, d&0x01)
  12.       step(16)
  13.       d = (d>>1)
  14.     }
  15.     poke(c.io.rx, true)
  16.     step(16)

  17.     step(100)
  18.   }
  19. }

  20. object AuxSinkTopTester {
  21.   def main(args: Array[String]): Unit = {
  22.     val margs = Array("--tr-write-vcd")
  23.     Driver.execute(margs, () => new UartTop) {
  24.       c => new UartTopTest(c)
  25.     }

  26.   }
  27. }
复制代码


出0入0汤圆

发表于 2019-2-20 22:40:27 | 显示全部楼层
赶时髦,用上Chisel了,赞一个
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 15:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表