加载中…
正文 字体大小:

spinalHDL中blackBox时钟map映射

(2018-01-17 10:32:16)
标签:

spinalhdl

verilog

domain

scala

ram

分类: spinalHDL
以定义一个xilinx中的Ram为例,定义的Mem_Ram相当于一个黑盒,port端口与xilinx IP 中的Ram映射。
.scala中的时钟和复位有两种表示方式,第一种:Map the current clock domain to the io.clk pin,current reset to the io.reset pin
class Mem_Ram extends BlackBox{
  val io = new Bundle{
    val clk = in Bool
    val reset = in Bool
    val en = in Bool
    val wr = in Bool
    val addr = in UInt(5 bits)
    val wrdata = in UInt(9 bits)
    val rdata = out UInt(9 bits)
  }
  mapClockDomain(clock = io.clk,reset = io.reset)
}
第二种:Clock and reset is map on the current clock domain
class Mem_Ram extends BlackBox{
  val io = new Bundle{
    val clk = in Bool
    val reset = in Bool
    val en = in Bool
    val wr = in Bool
    val addr = in UInt(5 bits)
    val wrdata = in UInt(9 bits)
    val rdata = out UInt(9 bits)
  }
  mapCurrentClockDomain(io.clk,io.reset)
}
在Component中例化BlackBox。如下:
// Create the top level and instantiate the Ram
class TopLevel extends Component {
  val io = new Bundle {
      val en   = in Bool
      val wr   = in Bool
      val addr = in UInt (log2Up(32) bit)
      val wrdata = in UInt (9 bit)
      val rdata = out UInt(9 bits)
  }

  //Instantiate the blackbox
  val ram = new Mem_Ram

  //Interconnect all that stuff
  io.en   <> ram.io.en
  io.wr   <> ram.io.wr
  io.addr <> ram.io.addr
  io.wrdata <> ram.io.wrdata
  io.rdata   <> ram.io.rdata
}

object Main {
  def main(args: Array[String]): Unit = {
    SpinalVerilog(new TopLevel)
  }
}
生成的.v文件如下:
module TopLevel
  input   io_en,
  input   io_wr,
  input  [4:0] io_addr,
  input  [8:0] io_wrdata,
  output [8:0] io_rdata,
  input   reset,
  input   clk 
);

  Mem_Ram ram ( 
    .io_clk(clk),
    .io_reset(reset),
    .io_en(io_en),
    .io_wr(io_wr),
    .io_addr(io_addr),
    .io_wrdata(io_wrdata),
    .io_rdata(io_rdata) 
  );
endmodule
在vivado中例化一个xilinx的RamIP,模块名称为MyRam。
完成后,再编写一个Mem_ram.v文件,将BlackBox Mem_ram和MyRam映射好。
  MyRam  dut ( 
    .clka(io_clk),
    .rsta(io_reset),
    .ena(io_en),
    .wea(io_wr),
    .addra(io_addr),
    .dina(io_wrdata),
    .douta(io_rdata) 
  );

0

阅读 评论 收藏 转载 喜欢 打印举报
已投稿到:
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有