barrel_shift
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的更多相关文章
随机推荐
- dos.orm的事务处理
dos.orm也包含事务处理,没有太多封装,这里有几个简单的示例代码. using (DbTrans trans = DbSession.Default.BeginTransaction()) { D ...
- Rollup.js 实践
音乐分享: B.o.B Ft. Marko Penn - <Roll up> ——————————————————————————————————————————————————————— ...
- I/O多路复用之select、poll、epoll
很早之前有写过篇IO多路复用的文章:https://www.cnblogs.com/klcf0220/archive/2013/05/14/3077003.html 参考链接:https://segm ...
- 【Selenium】各浏览器(firefox,chrome,ie)驱动下载地址汇总
前两天使用Selenium分布式时,总抛出异常.更新成最新驱动可以解决.其中chrome异常如下, "platform": "WINDOWS" File &qu ...
- 【原创】大数据基础之Logstash(4)高可用
logstash高可用体现为不丢数据(前提为服务器短时间内不可用后可恢复比如重启服务器或重启进程),具体有两个方面: 进程重启(服务器重启) 事件消息处理失败 在logstash中对应的解决方案为: ...
- vue轮播图中间大两头小
<template> <div v-if="items.length" class="full-page-slide-wrapper"> ...
- JavaScript ES6 新特性详解
JavaScript ES6 带来了新的语法和新的强大功能,使您的代码更现代,更易读 const , let and var 的区别: const , let 是 ES6 中用于声明变量的新关键字. ...
- STM32L1 串口相应驱动开发
初始化设置: GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; USART_InitTypeDef U ...
- Dubbo序列化多个CopyOnWriteArrayList对象变成同一对象的一个大坑!!
环境: win10 + jdk 1.8 + dubbo 2.5.10 问题描述: 当一个对象(此对象内包含多个CopyOnWriteArrayList对象) 作为参数调用RPC接口后, 服务提供者拿到 ...
- python-数据类型之题型
1.让用户输入任意字符串,获取字符串之后并计算其中有多少个数字. total = 0 text = input("请输入内容") a = 0 while a <len(tex ...