barrel_shift的目的就是在一个bus中根据idx动态选择一部分数据输出如:

  1. *dw-:];
  2. -:];// 0~132
  3. *dw-:];

上面就要求从256的数据单元中选择124个数据单元输出,输出的起始位置为idx(取值只能爱0~132,如果取值超过132,比如是140,那么140~255不够124个数据,输出中会出现重复的数据)

数据选择其实就是mux,不过这里是要选择出多个数据(124个),需要按段进行选择;通过根据idx的译码选择出124+2^n-1个数据(必须保证选择出的数据包含了需要的124个数据,2^n-1是在找选择数据段的起始)

定义一些中间连线:

  1. :]s0[];// widht = 124 + 2^0 - 1
  2. :]s1[];// widht = 124 + 2^1 - 1
  3. :]s2[];// widht = 124 + 2^2 - 1
  4. :]s3[];// widht = 124 + 2^3 - 1
  5. :]s4[];// widht = 124 + 2^4 - 1
  6. :]s5[];// widht = 124 + 2^5 - 1
  7. :]s6[];// widht = 124 + 2^6 - 1
  8. :]s7[];// widht = 124 + 2^7 - 1
  9. :]s8[];//input width

首先需要对输入的数据进行分块,以dw位宽为一个块,用二位数组缓存起来。

  1. generate
  2. ;i<;i=i+)begin:REFORM_INPUT
  3. always@(*)begin
  4. s8[i][+:dw] = din[i*dw +: dw];
  5. end
  6. end
  7. 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分法译码)

  1. generate
  2. ;i<;i=i+)begin:SEL7
  3. )begin
  4. always@(*)begin
  5. ]=='b0)begin
  6. s7[i] = s8[i];
  7. end else begin
  8. s7[i] = s8[i+]; end
  9. end
  10. end else begin
  11. always@(*)begin
  12. s7[i] = s8[i];//只有在idx[7]==1'b0的时候才有意义,idx[7]==1'b1的时候会出现一部分重复数据。
  13. end
  14. end
  15. end
  16. endgenerate

根据判断idx[7]从256中选择出251个数据,接下来要判断idx[6]选择出124 + 2^6 -1 = 187个数据

  1. generate
  2. ;i<;i=i+)begin:SEL6
  3. always@(*)begin
  4. ]=='b0)begin
  5. s6[i] = s7[i];
  6. end else begin
  7. s6[i] = s7[i+];
  8. end
  9. end
  10. end
  11. endgenerate

接下来的每判断idx[k]就可以去除2^k个数据,最后只剩下124个数据

  1. generate
  2. ;i<;i=i+)beginSEL5
  3. always@(*)begin
  4. ]=='b0)begin
  5. s5[i] = s6[i];
  6. end else begin
  7. s5[i] = s6[i+];
  8. end
  9. end
  10. end
  11. endgenerate
  12.  
  13. generate
  14. ;i<;i=i+)begin:SEL4
  15. always@(*)begin
  16. ]=='b0)begin
  17. s4[i] = s5[i];
  18. end else begin
  19. s4[i] = s5[i+];
  20. end
  21. end
  22. end
  23. endgenerate
  24.  
  25. generate
  26. ;i<;i=i+)begin:SEL3
  27. always@(*)begin
  28. ]=='b0)begin
  29. s3[i] = s4[i];
  30. end else begin
  31. s3[i] = s4[i+];
  32. end
  33. end
  34. end
  35. endgenerate
  36.  
  37. generate
  38. ;i<;i=i+)begin:SEL2
  39. always@(*)begin
  40. ]=='b0)begin
  41. s2[i] = s3[i];
  42. end else begin
  43. s2[i] = s3[i+];
  44. end
  45. end
  46. end
  47. endgenerate
  48.  
  49. generate
  50. ;i<;i=i+)begin:SEL1
  51. always@(*)begin
  52. ]=='b0)begin
  53. s1[i] = s2[i];
  54. end else begin
  55. s1[i] = s2[i+];
  56. end
  57. end
  58. end
  59. endgenerate
  60.  
  61. generate
  62. ;i<;i=i+)begin:SEL0
  63. always@(*)begin
  64. ]=='b0)begin
  65. s0[i] = s1[i];
  66. end else begin
  67. s0[i] = s1[i+];
  68. end
  69. end
  70. end
  71. endgenerate

最后将s0数组中的数据转成输出数据的格式:

  1. generate
  2. ;i<;i=i+)begin:GET_OUT
  3. always@(*)begin
  4. dout[i*dw +: dw] = s0[i];
  5. end
  6. end
  7. endgenerate

berral shift使用场景,比如两个128的数据中选择124个数据输出就可以将两个128的数据拼起来,然后根据idx输出124个数据。

barrel_shift的更多相关文章

随机推荐

  1. Idea中一些常用设置

    idea展开和折叠方法的快捷键 Ctrl+”+/-”,当前方法展开.折叠Ctrl+Shift+”+/-”,全部展开.折叠 idea中也有自定代码块的功能 //region 描述.....业务代码//e ...

  2. 我的第一个SpringProject——HelloWorld

    我的第一个Spring项目HelloWorld还是花了不少时间,在工具配置上耽误了 我使用的是Eclipse,开始Maven+intellij+Spring搞不太懂 首先要配置Spring: 打开ec ...

  3. HTML5画布小dome八卦图

      <!DOCTYPE html>   <html>   <head>   <meta charset="utf-8" />   & ...

  4. 马拉车算法——求回文子串个数zoj4110

    zoj的测评姬好能卡时间.. 求回文子串的个数:只要把p[i]/2就行了: 如果s_new[i]是‘#’,算的是没有中心的偶回文串 反之是奇回文串 /* 给定两个字符串s,t 结论:s,t不相同的第一 ...

  5. PADS Router VX.2.3 设置光标的类型

    操作系统:Windows 10 x64 工具:PADS Router VX.2.3 菜单:Tools > Options...(快捷键:Ctrl + <Enter>) 在Option ...

  6. python3学习笔记之十七

    1.  网站本质:通过socket建立连接. 服务端(网站) 1.  先启动并监听:80端口 4.  获取请求信息 请求头 请求体 5.  处理请求 响应内容: 响应头:\r\n\r\n响应体     ...

  7. window10 蓝牙只能发不能收文件解决办法

    打开“通过蓝牙发送和接收文件”,在“接收文件”界面中无法接收蓝牙发送的文件 解决办法: 1. win+R后,输入msconfig,回车 2. 点击服务,勾选隐藏Microsoft服务,点击全部禁用 3 ...

  8. .net core 部署在iis上

    1. 启用iis (过程略) 参考操作流程 2. 下载并安装 .NET Core Windows Server Hosting 下载链接 下载完成后安装 3. 启动 windows process a ...

  9. docker 从入门到精通

    转载请注明出处!!!! 1.Docker 基本指令 下载镜像 docker pull 镜像名称:版本 查看已有镜像 docker images 查看已有容器 docker ps 启动docker do ...

  10. flexbuilder 开发工具

    https://www.cnblogs.com/xuling/archive/2010/02/15/1668580.html