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的更多相关文章
随机推荐
- osgearth介绍
osgEarth为开发osg应用提供了一个地理空间SDK和地形引擎. osgEarth的目标: l 提供基于osg开发3D地理空间应用的支持; l 直接从数据源可视化地形模型和影像变得更加简单: l ...
- XPath Helper使用教程
下载地址 百度网盘下载密码:yuuv下载完成后选择保留 安装 在导航栏中输入chrome://extensions:将.crx文件拖拽到扩展程序页面中,勾选已启用按钮. 使用 重启浏览器,快捷键CTR ...
- Elastichsearch实践——基本使用
官网文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/getting-started.html es中的索引.类型.文档可以 ...
- IntelliJ IDEA 报错:找不到包或者找不到符号
原因 在网上各种找 https://blog.csdn.net/qq_17213067/article/details/78895302 https://blog.csdn.net/u01398566 ...
- 记录一个EF连接查询的异常:the entity or complex type 'x' cannot be constructed in a linq to entities query
问题解决连接:https://stackoverflow.com/questions/5325797/the-entity-cannot-be-constructed-in-a-linq-to-ent ...
- python学习:一
第三章:实践题作业 1.编写一个名为 collatz()的函数,它有一个名为 number 的参数.如果参数是偶数,那么 collatz()就打印出 number // 2, 并返回该值.如果 num ...
- java类(Class)的概念;对象的概念,声明类的属性 和方法,局部变量和成员变量,面向对象编程思维,抽象的概念
类(Class)的概念 类是对一组具有相同特征和行为的对象的抽象描述. 理解: [1] 类包含了两个要素:特性和行为 => 同一类事物具有相同的特征和行为. [2] 类是一个群体性概念.例如:网 ...
- UltraEdit注册机 及使用方法详解
转载自:http://www.iyaxi.com/ultraedit-key/ UltraEdit是一款强大的文字编辑器,很多编程的.搞设计的等等都能用到它,具体功能请自行百度.今天为大家带来UE软件 ...
- MySQL ERROR 1045 (28000)
mysql ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: YES) 到配置文件my.in ...
- Dubbo序列化多个CopyOnWriteArrayList对象变成同一对象的一个大坑!!
环境: win10 + jdk 1.8 + dubbo 2.5.10 问题描述: 当一个对象(此对象内包含多个CopyOnWriteArrayList对象) 作为参数调用RPC接口后, 服务提供者拿到 ...