barrel_shift的目的就是在一个bus中根据idx动态选择一部分数据输出如:

*dw-:];
-:];// 0~132
*dw-:];

上面就要求从256的数据单元中选择124个数据单元输出,输出的起始位置为idx(取值只能爱0~132,如果取值超过132,比如是140,那么140~255不够124个数据,输出中会出现重复的数据)

数据选择其实就是mux,不过这里是要选择出多个数据(124个),需要按段进行选择;通过根据idx的译码选择出124+2^n-1个数据(必须保证选择出的数据包含了需要的124个数据,2^n-1是在找选择数据段的起始)

定义一些中间连线:

:]s0[];// widht = 124 + 2^0 - 1
:]s1[];// widht = 124 + 2^1 - 1
:]s2[];// widht = 124 + 2^2 - 1
:]s3[];// widht = 124 + 2^3 - 1
:]s4[];// widht = 124 + 2^4 - 1
:]s5[];// widht = 124 + 2^5 - 1
:]s6[];// widht = 124 + 2^6 - 1
:]s7[];// widht = 124 + 2^7 - 1
:]s8[];//input width

首先需要对输入的数据进行分块,以dw位宽为一个块,用二位数组缓存起来。

generate
;i<;i=i+)begin:REFORM_INPUT
    always@(*)begin
         s8[i][+:dw] = din[i*dw +: dw];
    end
end
endgenerate

先开始进行idx的最高位进行译码,将din的数据分为两部分,输出的数据的起点就会在这两部分数据中,假设起点在前一部分,即起点为din[0*dw],din[1*dw]....din[127*dw],如果起点是din[127*dw]那么输出数据会是din[127*dw:(127+124-1)*dw],这部分数据包括了后半部分是数据。考虑完备,根据idx[7]的选择,需要输出128+124-1个数据(使用的2分法译码)

generate
;i<;i=i+)begin:SEL7
    )begin
        always@(*)begin
            ]=='b0)begin
                s7[i] = s8[i];
            end else begin
                s7[i] = s8[i+];            end
        end
    end else begin
        always@(*)begin
            s7[i] = s8[i];//只有在idx[7]==1'b0的时候才有意义,idx[7]==1'b1的时候会出现一部分重复数据。
        end
    end
end
endgenerate

根据判断idx[7]从256中选择出251个数据,接下来要判断idx[6]选择出124 + 2^6 -1 = 187个数据

generate
;i<;i=i+)begin:SEL6
    always@(*)begin
        ]=='b0)begin
            s6[i] = s7[i];
        end else begin
            s6[i] = s7[i+];
        end
    end
end
endgenerate

接下来的每判断idx[k]就可以去除2^k个数据,最后只剩下124个数据

generate
;i<;i=i+)begin:SEL5
    always@(*)begin
        ]=='b0)begin
            s5[i] = s6[i];
        end else begin
            s5[i] = s6[i+];
        end
    end
end
endgenerate

generate
;i<;i=i+)begin:SEL4
    always@(*)begin
        ]=='b0)begin
            s4[i] = s5[i];
        end else begin
            s4[i] = s5[i+];
        end
    end
end
endgenerate

generate
;i<;i=i+)begin:SEL3
    always@(*)begin
        ]=='b0)begin
            s3[i] = s4[i];
        end else begin
            s3[i] = s4[i+];
        end
    end
end
endgenerate

generate
;i<;i=i+)begin:SEL2
    always@(*)begin
        ]=='b0)begin
            s2[i] = s3[i];
        end else begin
            s2[i] = s3[i+];
        end
    end
end
endgenerate

generate
;i<;i=i+)begin:SEL1
    always@(*)begin
        ]=='b0)begin
            s1[i] = s2[i];
        end else begin
            s1[i] = s2[i+];
        end
    end
end
endgenerate

generate
;i<;i=i+)begin:SEL0
    always@(*)begin
        ]=='b0)begin
            s0[i] = s1[i];
        end else begin
            s0[i] = s1[i+];
        end
    end
end
endgenerate

最后将s0数组中的数据转成输出数据的格式:

generate
;i<;i=i+)begin:GET_OUT
    always@(*)begin
        dout[i*dw +: dw] = s0[i];
    end
end
endgenerate

berral shift使用场景,比如两个128的数据中选择124个数据输出就可以将两个128的数据拼起来,然后根据idx输出124个数据。

barrel_shift的更多相关文章

随机推荐

  1. HTTP协议详解(四)

    接着第三篇继续学习.... 9 Cookie和Session的比较 Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力. S ...

  2. 20175226 2018-2019-2《java程序设计》结对编程-四则运算(第二周-阶段总结)

    需求分析(描述自己对需求的理解,以及后续扩展的可能性) 实现一个命令行程序,要求: 自动生成小学四则运算题目(加,减,乘,除) 支持整数 支持多运算符(比如生成包含100个运算符的题目) 支持真分数 ...

  3. 【算法】Attention is all you need

    Transformer 最近看了Attention Is All You Need这篇经典论文.论文里有很多地方描述都很模糊,后来是看了参考文献里其他人的源码分析文章才算是打通整个流程.记录一下. T ...

  4. Bootstrap-datepicker3官方文档中文翻译---Markup/标记(原文链接 http://bootstrap-datepicker.readthedocs.io/en/latest/index.html)

    Markup/标记 下面是已经支持的标签的例子.这些标签本身不会提供DatePicker控件:你需要在标签上实例化Datepicker. input/输入框 最简单的例子: input获得焦点 (使用 ...

  5. mac上安装vue项目

    mac上如何安装vue项目 一, mac系统安装brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/H ...

  6. 2018-2019-2 网络对抗技术 20165328 Exp6 信息收集与漏洞扫描

    目录 实验要求 基础问题回答: 实验过程: 各种搜索技巧的应用及DNS IP注册信息的查询 基本扫描技术 漏洞扫描--使用OpenVAS 实验感想 实验要求 (1)各种搜索技巧的应用 (2)DNS I ...

  7. 日期时间选择器、Bootstrap日期和时间表单组件。bootstrap-datetimepicker实现年月日,时分秒的选择。

    参考链接:http://www.bootcss.com/p/bootstrap-datetimepicker/ 1.官网以及很详细的说明了如何使用,这里结合一下自己的使用来写下. 下载解压缩包以后,可 ...

  8. windows安装node和yarn

    Ubuntu子系统安装和删除yarn 在 Debian 或 Ubuntu 上,需要用 Debian 包仓库来安装 Yarn. 首先需要配置仓库: curl -sS https://dl.yarnpkg ...

  9. Outlook IMAP 修改PST文件存储路径

    IMAP类型的账户修改PST文件位置方法: 对于IMAP类型账户的PST文件,既没有“修改文件夹”的选项,也无法按OFFICE官方操作指南中的操作.因为每次Outlook只要检测到默认路径下的PST文 ...

  10. DDD - 概述 - 模块 (二)

    首先,你必须知道以下DDD构建块: Entities - 实体 Value objects - 值对象 Aggregate roots - 聚合跟 Repositories - 仓储对象 Factor ...