zoukankan      html  css  js  c++  java
  • Chisel3

     https://mp.weixin.qq.com/s/Jsy8P3m9W2EYKwneGVekiw

     
    独热码相关的电路生成器。
     
    参考链接:
     
     
    1. PriorityEncoderOH
     
    1) Seq.tabulate(n)(f)
     
    相当于把0到n-1逐个带入函数f,把每一次计算得出的结果f(n)连接成为一个序列返回。
     
    2) encode
     
    a. Seq[Bool]中的每一个选择位,生成一个独热码:
     
    val outs = Seq.tabulate(in.size)(i => (BigInt(1) << i).asUInt(in.size.W))
     
    b. 委托PriorityMux生成一个低序高优先的级联选择器:PriorityMux(in :+ true.B, outs :+ 0.U(in.size.W))
     
    :+ true.B,:+ 0.U(in.size.W) 提供了一个默认值;
     
    c. 返回的是一个UInt
     
    3) 第二个apply:def apply(in: Bits): UInt = encode((0 until in.getWidth).map(i => in(i)))
     
    把输入的Bits转换成一串Bool,然后直接把encode返回的UInt返回;
     
    4)第一个apply:def apply(in: Seq[Bool]): Seq[Bool]
     
    把encode返回的UInt拆成一串Bool返回;
     
    2. UIntToOH
     
    把UInt转换成为独热码,即把UInt的值对应的位置位。
     
    1) 第一个apply不限制位数,所以比较简单:def apply(in: UInt): UInt = 1.U << in
    2) 第二个apply限制最终生成的独热码的位数
     
    假设UInt的值为6,生成的独热码为8位,则需要把第7位补0.
     
    a. 隐含条件:width >= UInt的值
     
    所以width所占的位数大于等于UInt的位宽,所以需要把in进行补位(pad);
     
    b. in补位之后截取[shiftAmountWidth - 1, 0]
     
    这些位中已经包含in的全部有效位,shiftAmount即是in的值;
     
    c. 移位shiftAmount得到对应的独热码:(1.U << shiftAmount)
     
    d. 截取[width - 1, 0],隐含类型推断和补位
     
    可以看到8.U虽然只有4位,但对其截取[7, 0]之后返回的类型有8位。
     
    3. PriorityEncoder
     
    返回一个低序高优先级的级联选择器,输出为第一个为真的值的序号。
     
    4. OHToUInt
     
    UIntToOH互逆,返回独热码中第几位为1。
     
    使用分治策略,逐半递归求值。
     
    5. 附录
  • 相关阅读:
    mysql 中文字段排序( UTF8按拼音首字母排序)
    输入输出挂
    HDU 6301 贪心
    HDU1533 最小费用最大流
    POJ 2135 最小费用最大流 入门题
    HDU 6278 主席树(区间第k大)+二分
    HDU3549 最大流 裸题
    2018牛客网暑期ACM多校训练营(第一场)D图同构,J
    POJ 1804 逆序对数量 / 归并排序
    Codeforces Round #489 (Div. 2) B、C
  • 原文地址:https://www.cnblogs.com/wjcdx/p/10171625.html
Copyright © 2011-2022 走看看