在FPGA中使用for循环一定浪费资源吗?
渐渐地,发现自己已经习惯于发现细节,喜欢打破常规,真的非常喜欢这种feel。
相信很多人在书上或者博文上都有提出“在FPGA中使用for语句是很占用资源的”的观点,特权同学也不例外。那么,这种观点正确吗?我的答案是:对一半,错一半。在某些情况下,使用for循环也许真的挺占用资源的。但我并不想去探讨这种情况。而是谈谈在另外一些情况下使用for语句的好处。
第一个好处:有时使用for循环不但不会浪费多余的资源,而且可以减少代码量,从而提高编码效率;第二个好处是:方便模块的移植。下面举个移位寄存器的简单例子来说明就一目了然了。假设设计一个深度为16、位宽为8的移位寄存器。
1、基于非for语句的移位寄存器电路设计如下:
module shift_register
#(
parameter DATA_WIDTH = 8
)
(
input clk,
input [DATA_WIDTH-1:0] din,
output [DATA_WIDTH-1:0] dout
);
//---------------------------------------------
reg [DATA_WIDTH-1:0] mem [0:15];
always @(posedge clk)
begin
mem[0 ] <= din;
mem[1 ] <= mem[0 ];
mem[2 ] <= mem[1 ];
mem[3 ] <= mem[2 ];
mem[4 ] <= mem[3 ];
mem[5 ] <= mem[4 ];
mem[6 ] <= mem[5 ];
mem[7 ] <= mem[6 ];
mem[8 ] <= mem[7 ];
mem[9 ] <= mem[8 ];
mem[10] <= mem[9 ];
mem[11] <= mem[10];
mem[12] <= mem[11];
mem[13] <= mem[12];
mem[14] <= mem[13];
mem[15] <= mem[14];
end assign dout = mem[15]; endmodule
综合后资源消耗为:
2、基于for语句的移位寄存器电路设计如下:
module shift_register_for
#(
parameter DATA_WIDTH = 8,
parameter SHIFT_LEVEL = 16
)
(
input clk,
input [DATA_WIDTH-1:0] din,
output [DATA_WIDTH-1:0] dout
);
//-------------------------------------------------------
reg [DATA_WIDTH-1:0] mem [0:SHIFT_LEVEL-1];
always @(posedge clk)
begin : shift_reg
integer i;
for(i = 0; i < SHIFT_LEVEL-1; i = i + 1)
mem[i+1] <= mem[i];
mem[0] <= din;
end assign dout = mem[SHIFT_LEVEL-1]; endmodule
综合后资源消耗为:
通过对比,两者消耗资源一样,但使用for语句可大大减少代码量。在这里,我问大家一个问题,如果我想要一个深度为40、位宽为8的移位寄存器,怎么办?对基于for语句的移位寄存器很容易实现,只要将SHIFT_LEVEL=16改为SHIFT_LEVEL=40就可以了;而对于没有使用for语句的移位寄存器并没有快捷的修改方法,只能乖乖地按部就班了,如下所示:
module shift_register
#(
parameter DATA_WIDTH = 8
)
(
input clk,
input [DATA_WIDTH-1:0] din,
output [DATA_WIDTH-1:0] dout
);
//--------------------------
reg [DATA_WIDTH-1:0] mem [0:15];
always @(posedge clk)
begin
mem[0 ] <= din;
mem[1 ] <= mem[0 ];
mem[2 ] <= mem[1 ];
mem[3 ] <= mem[2 ];
mem[4 ] <= mem[3 ];
mem[5 ] <= mem[4 ];
mem[6 ] <= mem[5 ];
mem[7 ] <= mem[6 ];
mem[8 ] <= mem[7 ];
mem[9 ] <= mem[8 ];
mem[10] <= mem[9 ];
mem[11] <= mem[10];
mem[12] <= mem[11];
mem[13] <= mem[12];
mem[14] <= mem[13];
mem[15] <= mem[14];
mem[16] <= mem[15];
mem[17] <= mem[16];
mem[18] <= mem[17];
mem[19] <= mem[18];
mem[20] <= mem[19];
mem[21] <= mem[20];
mem[22] <= mem[21];
mem[23] <= mem[22];
mem[24] <= mem[23];
mem[25] <= mem[24];
mem[26] <= mem[25];
mem[27] <= mem[26];
mem[28] <= mem[27];
mem[29] <= mem[28];
mem[30] <= mem[39];
mem[31] <= mem[30];
mem[32] <= mem[31];
mem[33] <= mem[32];
mem[34] <= mem[33];
mem[35] <= mem[34];
mem[36] <= mem[35];
mem[37] <= mem[36];
mem[38] <= mem[37];
mem[39] <= mem[38];
end assign dout = mem[39]; endmodule
由此,使用for语句的移位寄存器很方便移植。
总结:在一些情况下,适当使用for语句不但可以节省设计的时间,还有利于设计的移植。
转载自:http://blog.chinaaet.com/crazybird/p/5100000274
在FPGA中使用for循环一定浪费资源吗?的更多相关文章
- 【转载】FPGA 中的latch 锁存器
以下这篇文章讲述了锁存器的一些概念和注意事项.原文标题及链接: FPGA 中的latch 锁存器 - 快乐至永远上的博客 - 与非博客 - 与网 http://www.eefocus.com/liuy ...
- [转]如何在 JS 代码中消灭 for 循环
一,用好 filter,map,和其它 ES6 新增的高阶遍历函数 二,理解和熟练使用 reduce 三,用递归代替循环(可以break!) 四,使用高阶函数遍历数组时可能遇到的陷阱 五,死磕到底,T ...
- JavaScript中的事件循环
JavaScript是单线程单并发语言 单线程:主程序只有一个线程,即同一时间片段内其只能执行单个任务. 引发的问题: 单线程,意味着任务都需要排队,前一个任务结束,才会执行后一个任务.若前一个任务耗 ...
- Oracle中三种循环(For、While、Loop)
1.ORACLE中的GOTO用法 DECLARE x number; BEGIN x := 9; <<repeat_loop>> --循环点 x := x - 1; DBMS_ ...
- FPGA中的delay与latency
delay和latency都有延迟的意义,在FPGA中二者又有具体的区别. latency出现在时序逻辑电路中,表示数据从输入到输出有效经过的时间,通常以时钟周期为单位. delay出现在组合逻辑电路 ...
- FPGA中的INOUT接口和高阻态
除了输入输出端口,FPGA中还有另一种端口叫做inout端口.如果需要进行全双工通信,是需要两条信道的,也就是说需要使用两个FPGA管脚和外部器件连接.但是,有时候半双工通信就能满足我们的要求,理论上 ...
- FPGA中的时序分析(四)
常用约束语句说明 关于Fmax 上述是实现Fmax的计算公式,clock skew delay的计算如下图, 就是两个时钟的差值.到头来,影响Fmax的值的大小就是组合逻辑,而Fmax是针对 ...
- TMsgThread, TCommThread -- 在delphi线程中实现消息循环
http://delphi.cjcsoft.net//viewthread.php?tid=635 在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使 ...
- 深入了解JavaScript中的for循环
在ECMAScript5中,有三种for循环,分别是: 简单for循环 for-in forEach 在ES6中,新增了一种循环 for-of 简单for循环 const arr = [1, 2, 3 ...
随机推荐
- Struts2远程代码执行漏洞预警
近期struts2 框架再现高危远程命令执行漏洞,漏洞编号S2-045,CVE编号CVE-2017-5638.利用此漏洞可对使用了struts2框架的网站进行远程命令执行,对服务器造成威胁.请相关单位 ...
- STL - 容器 - MultiSet
MultiSet根据特定排序准则,自动将元素排序.MultiSet允许元素重复.一些常规操作:MultiSetTest.cpp #include <iostream> #include & ...
- tail 命令(转)
原文:http://www.cnblogs.com/peida/archive/2012/11/07/2758084.html ail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可 ...
- JDBC一(web基础学习笔记七)
一.JDBC Java数据库的连接技术(Java DataBase Connectivity),能实现Java程序以各种数据库的访问 由一组使用Java语言编写的类和接口(JDBC API)组成,它j ...
- Java多线程(1) 创建
一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下以下这张较为经典的图: Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Threa ...
- Python 的时间格式化
对于像'Wed, 11 Apr 2012 09:37:05 +0800'的时间格式化可如下解: >>> date='Wed, 11 Apr 2012 09:37:05 +0800'& ...
- 用JavaScript 来创建 mac os x 程序这样是否好
在网上看到的文章: 用 JavaScript 编写 OS X 应用 (Tyler Gaw) 这个文章的内容是不错的. 可是思路呢? 我们假设想学一种方法或工具,这样做好吗? 我看了上面的代码.假设 ...
- ExceptionLess 搭建到本地服务器
Exceptionless 是一个开源的实时的日志收集框架,它可以应用在基于 ASP.NET,ASP.NET Core,Web Api,Web Forms,WPF,Console,MVC 等技术栈的应 ...
- 【laravel5.4】php artisan migrate报错:Specified key was too long; max key length is 767 bytes
1.原因:在进行 迁移文件生成时,程序并未给varchar类型字段设置 合适的长度,导致报错. 2.解决办法:找到database/ 目标迁移文件,修改其中类型为string的字段长度,建议不要超过2 ...
- 原创:【微信小程序】发送消息模板教程(后台以PHP示例)
1.本教程对外开放,未经博主同意,禁止转载. 2.准备材料:1)公众号|小程序,添加选择的模板消息,2)在设置>开发设置页面,开通消息模板功能:如: 3.因为调用微信发送模板的接口是:https ...