渐渐地,发现自己已经习惯于发现细节,喜欢打破常规,真的非常喜欢这种feel。

相信很多人在书上或者博文上都有提出“在FPGA中使用for语句是很占用资源的”的观点,特权同学也不例外。那么,这种观点正确吗?我的答案是:对一半,错一半。在某些情况下,使用for循环也许真的挺占用资源的。但我并不想去探讨这种情况。而是谈谈在另外一些情况下使用for语句的好处。

第一个好处:有时使用for循环不但不会浪费多余的资源,而且可以减少代码量,从而提高编码效率;第二个好处是:方便模块的移植。下面举个移位寄存器的简单例子来说明就一目了然了。假设设计一个深度为16、位宽为8的移位寄存器。

1、基于非for语句的移位寄存器电路设计如下:

  1. module shift_register
  2. #(
  3.     parameter   DATA_WIDTH  = 8
  4. )
  5. (
  6.     input                       clk,
  7.     input   [DATA_WIDTH-1:0]    din,
  8.     output  [DATA_WIDTH-1:0]    dout
  9. );
  10. //---------------------------------------------
  11. reg         [DATA_WIDTH-1:0]    mem     [0:15];
  12. always @(posedge clk)
  13. begin
  14.     mem[0 ] <= din;
  15.     mem[1 ] <= mem[0 ];
  16.     mem[2 ] <= mem[1 ];
  17.     mem[3 ] <= mem[2 ];
  18.     mem[4 ] <= mem[3 ];
  19.     mem[5 ] <= mem[4 ];
  20.     mem[6 ] <= mem[5 ];
  21.     mem[7 ] <= mem[6 ];
  22.     mem[8 ] <= mem[7 ];
  23.     mem[9 ] <= mem[8 ];
  24.     mem[10] <= mem[9 ];
  25.     mem[11] <= mem[10];
  26.     mem[12] <= mem[11];
  27.     mem[13] <= mem[12];
  28.     mem[14] <= mem[13];
  29.     mem[15] <= mem[14];
  30. end
  31.  
  32. assign  dout = mem[15];
  33.  
  34. endmodule

综合后资源消耗为:

2、基于for语句的移位寄存器电路设计如下:

  1. module shift_register_for
  2. #(
  3.     parameter   DATA_WIDTH  = 8,
  4.     parameter   SHIFT_LEVEL = 16
  5. )
  6. (
  7.     input                       clk,
  8.     input   [DATA_WIDTH-1:0]    din,
  9.     output  [DATA_WIDTH-1:0]    dout
  10. );
  11. //-------------------------------------------------------
  12. reg         [DATA_WIDTH-1:0]    mem     [0:SHIFT_LEVEL-1];
  13. always @(posedge clk)
  14. begin : shift_reg
  15.     integer     i;
  16.     for(= 0; i < SHIFT_LEVEL-1; i = i + 1)
  17.         mem[i+1] <= mem[i];
  18.     mem[0] <= din;
  19. end
  20.  
  21. assign  dout = mem[SHIFT_LEVEL-1];
  22.  
  23. endmodule

综合后资源消耗为:

通过对比,两者消耗资源一样,但使用for语句可大大减少代码量。在这里,我问大家一个问题,如果我想要一个深度为40、位宽为8的移位寄存器,怎么办?对基于for语句的移位寄存器很容易实现,只要将SHIFT_LEVEL=16改为SHIFT_LEVEL=40就可以了;而对于没有使用for语句的移位寄存器并没有快捷的修改方法,只能乖乖地按部就班了,如下所示:

  1. module shift_register
  2. #(
  3.     parameter   DATA_WIDTH  = 8
  4. )
  5. (
  6.     input                       clk,
  7.     input   [DATA_WIDTH-1:0]    din,
  8.     output  [DATA_WIDTH-1:0]    dout
  9. );
  10. //--------------------------
  11. reg         [DATA_WIDTH-1:0]    mem     [0:15];
  12. always @(posedge clk)
  13. begin
  14.     mem[0 ] <= din;
  15.     mem[1 ] <= mem[0 ];
  16.     mem[2 ] <= mem[1 ];
  17.     mem[3 ] <= mem[2 ];
  18.     mem[4 ] <= mem[3 ];
  19.     mem[5 ] <= mem[4 ];
  20.     mem[6 ] <= mem[5 ];
  21.     mem[7 ] <= mem[6 ];
  22.     mem[8 ] <= mem[7 ];
  23.     mem[9 ] <= mem[8 ];
  24.     mem[10] <= mem[9 ];
  25.     mem[11] <= mem[10];
  26.     mem[12] <= mem[11];
  27.     mem[13] <= mem[12];
  28.     mem[14] <= mem[13];
  29.     mem[15] <= mem[14];
  30.     mem[16] <= mem[15];
  31.     mem[17] <= mem[16];
  32.     mem[18] <= mem[17];
  33.     mem[19] <= mem[18];
  34.     mem[20] <= mem[19];
  35.     mem[21] <= mem[20];
  36.     mem[22] <= mem[21];
  37.     mem[23] <= mem[22];
  38.     mem[24] <= mem[23];
  39.     mem[25] <= mem[24];
  40.     mem[26] <= mem[25];
  41.     mem[27] <= mem[26];
  42.     mem[28] <= mem[27];
  43.     mem[29] <= mem[28];
  44.     mem[30] <= mem[39];
  45.     mem[31] <= mem[30];
  46.     mem[32] <= mem[31];
  47.     mem[33] <= mem[32];
  48.     mem[34] <= mem[33];
  49.     mem[35] <= mem[34];
  50.     mem[36] <= mem[35];
  51.     mem[37] <= mem[36];
  52.     mem[38] <= mem[37];
  53.     mem[39] <= mem[38];
  54. end
  55.  
  56. assign  dout = mem[39];
  57.  
  58. endmodule

由此,使用for语句的移位寄存器很方便移植。

总结:在一些情况下,适当使用for语句不但可以节省设计的时间,还有利于设计的移植。

转载自:http://blog.chinaaet.com/crazybird/p/5100000274

在FPGA中使用for循环一定浪费资源吗?的更多相关文章

  1. 【转载】FPGA 中的latch 锁存器

    以下这篇文章讲述了锁存器的一些概念和注意事项.原文标题及链接: FPGA 中的latch 锁存器 - 快乐至永远上的博客 - 与非博客 - 与网 http://www.eefocus.com/liuy ...

  2. [转]如何在 JS 代码中消灭 for 循环

    一,用好 filter,map,和其它 ES6 新增的高阶遍历函数 二,理解和熟练使用 reduce 三,用递归代替循环(可以break!) 四,使用高阶函数遍历数组时可能遇到的陷阱 五,死磕到底,T ...

  3. JavaScript中的事件循环

    JavaScript是单线程单并发语言 单线程:主程序只有一个线程,即同一时间片段内其只能执行单个任务. 引发的问题: 单线程,意味着任务都需要排队,前一个任务结束,才会执行后一个任务.若前一个任务耗 ...

  4. Oracle中三种循环(For、While、Loop)

    1.ORACLE中的GOTO用法 DECLARE x number; BEGIN x := 9; <<repeat_loop>> --循环点 x := x - 1; DBMS_ ...

  5. FPGA中的delay与latency

    delay和latency都有延迟的意义,在FPGA中二者又有具体的区别. latency出现在时序逻辑电路中,表示数据从输入到输出有效经过的时间,通常以时钟周期为单位. delay出现在组合逻辑电路 ...

  6. FPGA中的INOUT接口和高阻态

    除了输入输出端口,FPGA中还有另一种端口叫做inout端口.如果需要进行全双工通信,是需要两条信道的,也就是说需要使用两个FPGA管脚和外部器件连接.但是,有时候半双工通信就能满足我们的要求,理论上 ...

  7. FPGA中的时序分析(四)

    常用约束语句说明 关于Fmax      上述是实现Fmax的计算公式,clock skew delay的计算如下图, 就是两个时钟的差值.到头来,影响Fmax的值的大小就是组合逻辑,而Fmax是针对 ...

  8. TMsgThread, TCommThread -- 在delphi线程中实现消息循环

    http://delphi.cjcsoft.net//viewthread.php?tid=635 在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使 ...

  9. 深入了解JavaScript中的for循环

    在ECMAScript5中,有三种for循环,分别是: 简单for循环 for-in forEach 在ES6中,新增了一种循环 for-of 简单for循环 const arr = [1, 2, 3 ...

随机推荐

  1. Weixin 之 微信二维码扫描下载 Apk

    制作的手机 app 需要上线,生成二维码扫描进行下载,把生成好的apk挂在服务器端,将地址复制下来,通过草料二维码(http://cli.im/)生成一个二维码. 在更多中,你会看到有个app的选项, ...

  2. Shader Object及Program操作API

    Shader Object及Program操作API Program:  1. GLuint glCreateProgram( void );//创建 2. void glDeleteProgram( ...

  3. eclipse 图片预览插件

      eclipse 图片预览插件 CreateTime--2018年4月22日22:59:55 Author:Marydon 下载地址:eclipse 图片预览插件 将插件文件夹直接拷贝到eclips ...

  4. 转:eclipse里面显示中文乱码

    显示中文会变成乱码解决方案:Windows- >Pereferences- >General->Workspace- >Text   File   Encoding   选项下 ...

  5. iOS-自定义起始时间选择器视图

    概述 自定义起始时间选择器视图, 调起时间选择器, 传值(起始时间/截止时间), 两者时间均要合理, 不能超过未来时间, 并且起始时间不能大于截止时间. 点击取消或空白处收起时间选择器. 详细 代码下 ...

  6. 【redis】常用命令

    三.常用命令    1)连接操作命令    quit:关闭连接(connection)    auth:简单密码认证    help cmd: 查看cmd帮助,例如:help quit         ...

  7. HDUOJ------Worm

    Worm Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. HDUOJ----(4706)Children's Day

    Children's Day Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  9. 【LeetCode】40. Combination Sum II (2 solutions)

    Combination Sum II Given a collection of candidate numbers (C) and a target number (T), find all uni ...

  10. HDU 1757 A Simple Math Problem (矩阵乘法)

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...