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. dos.orm的事务处理

    dos.orm也包含事务处理,没有太多封装,这里有几个简单的示例代码. using (DbTrans trans = DbSession.Default.BeginTransaction()) { D ...

  2. Rollup.js 实践

    音乐分享: B.o.B Ft. Marko Penn - <Roll up> ——————————————————————————————————————————————————————— ...

  3. I/O多路复用之select、poll、epoll

    很早之前有写过篇IO多路复用的文章:https://www.cnblogs.com/klcf0220/archive/2013/05/14/3077003.html 参考链接:https://segm ...

  4. 【Selenium】各浏览器(firefox,chrome,ie)驱动下载地址汇总

    前两天使用Selenium分布式时,总抛出异常.更新成最新驱动可以解决.其中chrome异常如下, "platform": "WINDOWS" File &qu ...

  5. 【原创】大数据基础之Logstash(4)高可用

    logstash高可用体现为不丢数据(前提为服务器短时间内不可用后可恢复比如重启服务器或重启进程),具体有两个方面: 进程重启(服务器重启) 事件消息处理失败 在logstash中对应的解决方案为: ...

  6. vue轮播图中间大两头小

    <template> <div v-if="items.length" class="full-page-slide-wrapper"> ...

  7. JavaScript ES6 新特性详解

    JavaScript ES6 带来了新的语法和新的强大功能,使您的代码更现代,更易读 const ,  let and var 的区别: const , let 是 ES6 中用于声明变量的新关键字. ...

  8. STM32L1 串口相应驱动开发

    初始化设置: GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; USART_InitTypeDef U ...

  9. Dubbo序列化多个CopyOnWriteArrayList对象变成同一对象的一个大坑!!

    环境: win10 + jdk 1.8 + dubbo 2.5.10 问题描述: 当一个对象(此对象内包含多个CopyOnWriteArrayList对象) 作为参数调用RPC接口后, 服务提供者拿到 ...

  10. python-数据类型之题型

    1.让用户输入任意字符串,获取字符串之后并计算其中有多少个数字. total = 0 text = input("请输入内容") a = 0 while a <len(tex ...