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的更多相关文章
随机推荐
- Idea中一些常用设置
idea展开和折叠方法的快捷键 Ctrl+”+/-”,当前方法展开.折叠Ctrl+Shift+”+/-”,全部展开.折叠 idea中也有自定代码块的功能 //region 描述.....业务代码//e ...
- 我的第一个SpringProject——HelloWorld
我的第一个Spring项目HelloWorld还是花了不少时间,在工具配置上耽误了 我使用的是Eclipse,开始Maven+intellij+Spring搞不太懂 首先要配置Spring: 打开ec ...
- HTML5画布小dome八卦图
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> & ...
- 马拉车算法——求回文子串个数zoj4110
zoj的测评姬好能卡时间.. 求回文子串的个数:只要把p[i]/2就行了: 如果s_new[i]是‘#’,算的是没有中心的偶回文串 反之是奇回文串 /* 给定两个字符串s,t 结论:s,t不相同的第一 ...
- PADS Router VX.2.3 设置光标的类型
操作系统:Windows 10 x64 工具:PADS Router VX.2.3 菜单:Tools > Options...(快捷键:Ctrl + <Enter>) 在Option ...
- python3学习笔记之十七
1. 网站本质:通过socket建立连接. 服务端(网站) 1. 先启动并监听:80端口 4. 获取请求信息 请求头 请求体 5. 处理请求 响应内容: 响应头:\r\n\r\n响应体 ...
- window10 蓝牙只能发不能收文件解决办法
打开“通过蓝牙发送和接收文件”,在“接收文件”界面中无法接收蓝牙发送的文件 解决办法: 1. win+R后,输入msconfig,回车 2. 点击服务,勾选隐藏Microsoft服务,点击全部禁用 3 ...
- .net core 部署在iis上
1. 启用iis (过程略) 参考操作流程 2. 下载并安装 .NET Core Windows Server Hosting 下载链接 下载完成后安装 3. 启动 windows process a ...
- docker 从入门到精通
转载请注明出处!!!! 1.Docker 基本指令 下载镜像 docker pull 镜像名称:版本 查看已有镜像 docker images 查看已有容器 docker ps 启动docker do ...
- flexbuilder 开发工具
https://www.cnblogs.com/xuling/archive/2010/02/15/1668580.html