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. git rejected - non-fast-forward

    di第一次提交时可能提示此错误,应该是.gitignore冲突,建议码云创建时不要初始化,如果已经出现了.可以从git  repostitory里合并. 参考:https://blog.csdn.ne ...

  2. Centos系统FastDFS搭建与排错

    FastDFS中Tracker server主要是负载均衡和调度,Storage server主要是文件存储. 1.1 系统环境 [root@ centos fastdfs]# cat /etc/re ...

  3. 5G到来,App的未来,是JavaScript,Flutter还是Native ?

    Native App React Native(RN)发布于2015年,也是使用JavaScript语言进行跨平台APP的开发.与H5开发不同的是,它使用JS桥接技术在运行时编译成各个平台的Nativ ...

  4. java基础知识三 流

    Java 流(Stream).文件(File)和IOJava.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类型 ...

  5. Docker----起步(2)----在Ubuntu上安装最新版的Docker CE

    之前写了一篇文章关于Docker安装的博客,最近再次使用的时候,在docker的官方文档上发现最新版本的Docker(V18.03)的安装方式和之前有点区别,有一些命令发现不能用了.(真的是一天不学习 ...

  6. Linux telnet安装

    为什么需要telnet? telnet就是查看某个端口是否可访问.我们在搞开发的时候,经常要用的端口就是 8080.那么你可以启动服务器,用telnet 去查看这个端口是否可用. Linux cent ...

  7. Vue过滤器使用

    格式(一个过滤器):{{ 'msg' | filterA }} (多个过滤器):{{ 'msg' | filterA | filterB }} window.onload =function(){ / ...

  8. C#生成COM组件

    1.类库代码 1.1暴露的方法必须以接口的方式实现 1.2类需要GUID编号 using System; using System.Runtime.InteropServices; //COM组件 n ...

  9. 记一次完整的asp.net-mvc页面优化过程

    最近在重构一个以前团队开发留下的MVC项目,项目结构堪称混乱,问题多多,但今天说的是页面打开速度的问题.项目中包括web后台系统,几乎随便点一个页面都要盯着白屏等待2-5秒之久,体验很差.通过对页面性 ...

  10. 关于spring的自动注入

    关于spring的自动注入 spring里面可以设置BeanDefinition自动注入类型,默认为AUTOWIRE_NO(不进行自动注入).mybatis里面的扫描接口生成MapperFactory ...