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的更多相关文章
随机推荐
- 利用Owin解决CORS报错问题
我的项目是vue + ASP.NET .在 Vue调试时,由于vue开启的调试用的服务器端口号 和 后台.NET程序的端口号是不同的,发送Ajax请求时,就会报错.这里就不提报错的原因了,网上有很多, ...
- 解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法
堆区:专门用来保存对象的实例(new 创建的对象和数组),实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在Stack中) 1.存储的全部是对象 ...
- java - day004 - 数组排序,插入,冒泡
// 判断string 是否相等不能用 == 使用 equal 方法 Arrays.sort(数组); 数组排序算法 对基本类型. 优化的快速排序算法 对引用类型, 优化的合并排序算法
- docker镜像常用操作
- kafka Network
Kafka network Processor SocketServer.Processor override def run() { startupComplete() try { while (i ...
- mysql explain结果含义
在SQL语句前面加上EXPLAIN即可 各字段含义 id SELECT识别符.这是SELECT的查询序列号 select_type SELECT类型,可以为以下任何一种: SIMPLE:简单SELEC ...
- jdbc连接数据库以及crud(简单易懂,本人亲测可用 有源代码和数据库)
今天呢!重新整理了一边jdbc的相关操作:现在来说对于很多框架都使用mybatis和hibernate来操作数据库 ,也有很多使用自己简单封装的ssm或者是其他的一些框架来操作数据库,但是无论使用哪一 ...
- h5调起微信支付
后台需要进行生成签名获取参数. 前台代码: function onBridgeReady(appId,timeStamp,nonceStr,package1,paySign,signType,open ...
- SpringBoot的自动配置
1.根据条件来装配bean,SpringBoot的自动配置,根据条件进行自动配置. 首先创建一个接口,如下所示: package com.bie.encoding; /** * * @Descript ...
- restful规范简要概述
在 RESTful 架构概念详解 中聊了一些概念和约束, 本篇主要简要的聊一聊 RESTful API 规范概要设计, 内容源自 阮一峰老师的博客 一. 协议(protocol) 服务端的 API 与 ...