FPGA经验谈系列文章——写代码心中要有电路?

本文探讨了在FPGA开发中是否需要心中有电路的问题。早期工作中,仅关注逻辑和算法实现即可,但随着对FPGA深入理解,了解底层资源对优化设计至关重要。文中通过对比两种不同写法的移位寄存器实现,揭示了电路理解对资源利用率的影响,强调在追求高效设计时,需要理解FPGA的基础单元。同时,也建议初学者在保证可读性的前提下逐步掌握电路知识。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

FPGA经验谈系列文章——写代码心中要有电路?


前言

很早很早以前,我就从无数个帖子中看到一些这样的论述。例如“verilog是一个硬件描述语言,写代码的时候心中要知道其对应的电路是什么”,工作的前面几年,我完全不理解为什么会有这样的论述,我verilog代码写的好好的,功能也能实现,根本不需要在意什么电路之类的。工作久了之后,慢慢才发现这句话还是有一定的道理,慢慢有一点领悟了吧。

心中无需电路的情况

并不是什么情况下都需要心中有电路,只要心中有逻辑,那么就可以完成大部分的工作。在很多情况下,我们的FPGA容量还是足够的,以及你需要做的是在FPGA上做一个算法实现。算法理解了,时序理顺了,逻辑跑通了,也就OK了。
我的第一份工作就是算法实现的任务较多,而FPGA的资源绰绰有余,时钟频率也不算高。因此从来只关心算法有没有正确表达,逻辑对不对等等。

心中有电路的情况

慢慢的,随着对FPGA深入的理解,会看看FPGA的一些器件手册,用户手册,包括它资源的构成。
FPGA的资源就像一个大型迷宫,整整齐齐排列在那里,需要综合布局布线来将这些资源链接起来。

刚入门FPGA的写法:

reg [59:0]shift=0;
always @(posedge i_clk)
	shift <= {shift[58:0],shift_in};

工作1-6年的写法:

reg [59:0]shift;
always @(posedge i_clk or nedege i_rst_n)
	if(~i_rst_n)
		shift <= 0;
	else
		shift <= {shift[58:0],shift_in};

现在的写法:

reg [59:0]shift=0;
always @(posedge i_clk)
	shift <= {shift[58:0],shift_in};

转了一圈,工作十年的写法又跟刚入门的写法变成一样的了,似乎又回到了原点。虽然又回到了原点,到时此时和彼时这么写理由是不一样的。

1、刚入门的时候,就是为了写一个移位寄存器的功能
2、工作后,套用了固定的模板,似乎每个always块都这样 “always @(posedge i_clk or nedege i_rst_n)“,比较规范,整洁。仿真的时候也方便
3、自从心中有所谓的电路后,慢慢的我又回到了最简单的写法了。

我们来分析一下这两种写法到底有什么区别:
1、功能上,加了异步复位的,会进行复位操作。没有加异步复位的,直接进行移位。功能上没有什么差别。
2、但资源利用的差别就大了。

我们分析一下第一种写法的综合的原理图
在这里插入图片描述
布局布线图

在这里插入图片描述
资源消耗:
在这里插入图片描述

我们分析一下第二种写法的综合的原理图
密密麻麻看都看不见
在这里插入图片描述
拿个放大镜看看:
在这里插入图片描述
布局布线图:

在这里插入图片描述
资源消耗:
在这里插入图片描述
两种实现方式看似没什么区别,实际上在资源上相差很大。
第一种方式一个SLICEM就搞定了,第二种用了5个SLICEM,且全部都是触发器资源。

为什么利用率差别会这么大,这个时候心中有电路的作用就出来了。

要了解这个,首先你要理解资源块中 SLICEM和SLICEL的不同,尤其是里面的LUT的结构是不同的。SLICEM中的LUT是可以用来做32位移位寄存器的,

在这里插入图片描述
但是,如果你写了复位,则无法综合成SLICEM的LUT,因为它是没有复位管脚的。
因此想要做到FPGA资源的高利用率,那么则必须对FPGA底层资源进行详细的了解,也就是要心中有电路的情况。

总结

想要追求更高质量的设计,例如利用率更高,时钟频率更高,那心中还是需要有一些电路的概念的,每一个语句会综合出一些什么,涉及什么基础单元。但对于刚入门或者工作不久的同学来说,不要太在意这句话,暂时不理解不要紧,先把任务完成再说。但我觉得也不能过度追求高利用率导致可读性变得很差,毕竟代码是要给人看的,而且大的工程几乎都不可能做到完全心中有电路,只能是在前仿真完成后,经过综合器综合,然后在显示的综合RTL图中针对性的去优化。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十年老鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值