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. Resharper使用详解(转)

    万恶的360文档 解除复制的限制 Ctrl + Shift + i 打开控制台,也可以鼠标右键,选最后一个检查也可以打开控制台,输入: setInterval = null; //将内置无限循环函数设 ...

  2. 关于/tmp/ 目录自动清理文件

    问题:今天开发人员给我说了一个错误:The temporary upload location [/tmp/tomcat.1337767218595042057.80/work/Tomcat/loca ...

  3. elasticsearch的CPU居高不下的问题

    最近项目中遇到一个令人头疼的问题,毕竟因为工作需要刚学elasticsearch,也没有去关注elasticsearch的配置问题,安装好默认把它当做数据库一样去使用,这导致接下来的项目直接挂掉... ...

  4. python Request模块

    ---恢复内容开始--- Request的五种请求方式: request.get() request.post() request.head() requst.put() request.patch( ...

  5. .net基础学java系列(二)IDE

    上一篇文章.net基础学java系列(一)视野 废话: "视野"这篇文章,管理员说它比较空洞!也许初学者看不懂表格中的大部分内容!多年的neter估计也有很多不知道的! 有.net ...

  6. 关于<服务器>定义

    定义: 服务器,也称伺服器,是提供计算服务的设备.由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力.   服务器的构成:包括处理器.硬盘.内存.系统总线等,和 ...

  7. Alpha冲刺(5/10)——2019.4.27

    作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Alpha冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 ...

  8. Linux-信号量与P,V操作

    Linux-信号量与P,V操作 内容 使用信号量实现进程互斥 使用信号量及PV实现子进程读写同步 机理 Linux信号量集 Linux信号量作为IPC机制的一种,与其他通信方式类似,Linux也是通过 ...

  9. 运用SqlSugar框架+Axios写的增删查案例

    使用SqlSugar框架需要引用NuGet程序包否则会出现报错. 前台页面创建代码: @{    ViewBag.Title = "Index";}<h2>Index& ...

  10. java实现点击图片文字验证码

    https://www.cnblogs.com/shihaiming/p/7657115.html