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的更多相关文章
随机推荐
- MUI底部导航切换子页面
1.登陆页面进入之后,进入到main页面,main页面只有一个底部导航,然后引入子页面进行渲染. <nav class="mui-bar mui-bar-tab" id=&q ...
- linux 相关( 随时更新)
Linux笔记: 本地文件传到服务器上: scp -P8022 /文件路径 niehaidong@101.201.75.57:/tmp/ 从服务器上到本地 scp -P8022 niehaidong ...
- Mybatis自定义分布式二级缓存实现与遇到的一些问题解决方案!
先说两句: 我们都知道Mybatis缓存分两类: 一级缓存(同一个Session会话内) & 二级缓存(基于HashMap实现的以 namespace为范围的缓存) 今天呢, 我们不谈一级缓存 ...
- SQLAlchemy使用介绍
SQLAlchemy is the Python SQL toolkit and Object Relational Mapper that gives application developers ...
- 【工具】Idea GenerateAllSetter
使用工具自动生成setter方法调用,不是idea原生态生成getter/setter https://github.com/gejun123456/intellij-generateAllSetMe ...
- webpack打包优化之外部扩展externals的实际应用
目录 前言 externals定义 用法 string array object function regex 实际案例 打包时间 打包之后包的大小 浏览器加载 需要注意 参考 前言 使用vue-cl ...
- JAVA-MyBaits对应XML的两种使用方式
概述 在使用XML写SQL语句的时候,遇到参数传递的两种方式,也就是Mapper里面带@Param注解和不带的情况,容易混淆,对应XML的写法也不相同,使用的时候要注意对照代码比对(备注XML里面的关 ...
- python连接mysql数据库读取数据
#-*- coding:utf-8 -*- #Author:'Lmc' #DATE: 2019/4/28/0028 上午 11:22:47 #FileName:test.PY import pymys ...
- UOJ#206. 【APIO2016】Gap 构造 交互题
原文链接www.cnblogs.com/zhouzhendong/p/UOJ206.html 题解 T = 1 的情况直接大力从两边向中间询问即可. T = 2 的情况挺妙的,我没想到. 考虑首先花费 ...
- 自动化设计模式Page Object
https://blog.csdn.net/qq_37546891/article/details/79052054#t1