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的更多相关文章
随机推荐
- patch 28729262
打补丁最后出个error OPatch found the word "error" in the stderr of the make command.Please look a ...
- ubuntu 配置apt-get源
ubantu安装软件速度慢一般是因为系统默认选择的源导致,可以通过手动配置源设置解决. 1. 原文件备份 sudo mv /etc/apt/sources.list /etc/apt/sources. ...
- 如果没有<form>标签,也没有enctype="multipart/form-data"属性,怎么使用formData对象提交表单呢?如下方式
form标签的enctype属性 enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码. 默认地,表单数据会编码为 "application/x-www-form-urlen ...
- 初探storm
Storm入门之Storm示例及UI参数讲解 Storm UI REST API Storm 1.1.0 中文文档 Apache Storm 1.1.0 中文文档 | ApacheCN Storm U ...
- Emsemble
RM # -*- coding: utf-8 -*- """ RandomForestClassifier 예 """ import pan ...
- 2018-2019-2 网络对抗技术 20165319 Exp3 免杀原理与实践
免杀原理及基础问题回答 免杀原理: 免杀指的是一种能使病毒木马免于被杀毒软件查杀的技术.由于免杀技术的涉猎面非常广,其中包含反汇编.逆向工程.系统漏洞等黑客技术,所以难度很高,一般人不会或没能力接触这 ...
- 做IT,必备的安全知识!
以前的认知 以前刚接触IT行业,而我身为运维,我以为我所需要做的安全就是修改服务器密码为复杂的,ssh端口改为非22,还有就是不让人登录服务器就可以保证我维护的东西安全. 现在的认知 工作也好几年了, ...
- MyIbatis和Hibernate的区别--2019-04-26
1.MyBatis 真正实现了java代码和sql的分离 2.Hibernate 是全自动的,MyBatis是半自动的 Hibernate实现了部分自动生成SQL 3.SQL优化上 MyBatis 强 ...
- centos7上PhantomJS 过期之后改用Chrome时填的坑
突然有个自动化需求所以准备使用模拟点击的方法, 在使用之前的PhantomJS时,报错 UserWarning: Selenium support for PhantomJS has been dep ...
- Git ignore文件的用法
这周为了往自己个人代码仓库里囤货,把在公司写的一些东西上传到了自己的GitHub代码仓库,手抖把测试用的日志也一并上传了.上传没多长时间就被运维找上门了,说commit里包含内网相关信息,要求删除.当 ...