【原创博文】在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语句不但可以节省设计的时间,还有利于设计的移植。

 招聘信息 

 

(0)

相关推荐

  • 【Verilog】阻塞和非阻塞赋值引申出的原则分析

    参考来源:<Verilog数字系统设计(夏宇闻)> 在介绍<[Verilog]深入理解阻塞和非阻塞赋值的不同>时得到下面几个原则: 原则1:时序电路建模时,用非阻塞赋值. 原则 ...

  • 二进制转BCD码

    应用: 用fpga实现对数码管显示,以前通常的方法是进行整除和取余进行运算,但是fpga并不擅长乘法除法运算,所以可以用BCD码来转换. BCD码:通俗的可以理解为用四位二进制数表示一位十进制数字.例 ...

  • 二进制转BCD码需要几步?

    Hi,大家好!我是至芯科技的李老师. 今天讲课的题目比较有意思,它是一个小问题:把二进制变成BCD码需要几步? 请大家思考一下.有同学可能回答需要三步,为什么啊? 因为啊,把大象放进冰箱里需要三步,第 ...

  • Verilog入门-用户定义的原语

    点击上方蓝字关注我们 用户定义的原语 在前一章中,我们介绍了Verilog HDL提供的内置基本门.本章讲述Verilog HDL指定用户定义原语U D P的能力. U D P的实例语句与基本门的实例 ...

  • FPGA的Veilog HDL语法、框架总结

    摘要:Verilog HDL硬件描述语言是在用途最广泛的C语言的基础上发展起来的一种硬件描述语言,具有灵活性高.易学易用等特点.Verilog HDL可以在较短的时间内学习和掌握,FPGA的Veilo ...

  • 基于FPGA的AD采集

    LVDS(Low-Voltage Differential Signaling)低电压差分信号,是一种低功耗.低误码率.低串扰和低辐射的差分信号技术. KSPS(Kilo Samples per Se ...

  • 【原创博文】基于FPGA的异步FIFO验证

    现在开始对上一篇博文介绍的异步FIFO进行功能验证,上一篇博文地址:http://blog.chinaaet.com/crazybird/p/5100000872 .对异步FIFO验证的平台如图1所示 ...

  • 【原创博文】基于FPGA的异步FIFO设计

    今天要介绍的异步FIFO,可以有不同的读写时钟,即不同的时钟域.由于异步FIFO没有外部地址端口,因此内部采用读写指针并顺序读写,即先写进FIFO的数据先读取(简称先进先出).这里的读写指针是异步的, ...

  • 【精品博文】lvds技术及其在FPGA中的应用

    目前电路中数字视频使用Camera Link接口传输,之前的方案是FPGA输出并行数据信号+同步控制信号,再由串化芯片DS90CR287进行并转串处理,处理完通过Camera Link接口输出,采集卡 ...

  • 周宏康原创丨悲愤世界中的雄阔与凄婉——浅谈稼轩词意象的美学特质

    悲愤世界中的雄阔与凄婉 --浅谈稼轩词意象的美学特质 文/周宏康 南宋词人辛弃疾是中国古代文学史上举足轻重的人物,是豪放词宗的代表性旗手.他创作并流传下大量脍炙人口的词作,千百年来隽永不衰.辛弃疾词作 ...

  • FPGA中利用ICAP原语实现Multiboot功能

    希望亲爱的读者朋友 阅读10s 多多支持,感谢! FPGA的MultiBoot功能可以支持远程动态更新bitstream images,实现bitstream images的实时切换.在MultiBo ...

  • 李影原创诗歌丨逆风中站立的女人

    逆风中站立的女人 文/李影(天津小蛇) 喜欢独我的世界 听风听雨听花开花谢听鸟儿争鸣 五月的风吹拂着我的长发 彩蝶不约而来绕肩迷恋口红 喜欢寂静中寻找趣味 红裳呈艳丽 五月的风还是调皮 春舍不得离去瞬 ...

  • 【原创】《疫情中的自己》 作者:张君桥 诵读:赵 霞

    NO:920 战疫.专刊 [原创] <疫情中的自己> 作者:张君桥 诵读:赵  霞 疫情突袭,星夜兼程,我们给病区的人做完核酸时深夜12点左右,没有备行李,穿着平时衣服工作,脱掉防护服全身 ...

  • 【原创】 《获中校园—— 我们最耀眼》 作者:刘润田 诵读:赵 霞

    第517期 [原创] <获中校园-- 我们最耀眼> 作者:刘润田 诵读:赵  霞 小学时代 我们涉世未深 高中毕业 我们刚满成年 十八岁的年纪 我们阳光灿烂 经过两年的劳动锻炼 1976年 ...

  • 【原创】《记忆中的蒸“枣山”》 作者:曹成群 诵读:齐喜霞

    第441期 记忆中的蒸"枣山" 作者:曹成群 诵读:齐喜霞 老家的习俗过了腊月二十三年味越来越浓,年三十前都会把来年正月里豆腐.丸子和白山药炸出来,馒头和年糕蒸出来. 上个世纪五. ...