其他分享
首页 > 其他分享> > FPGA经验谈系列文章——写代码心中要有电路?

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

作者:互联网

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

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


前言

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

心中无需电路的情况

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

心中有电路的情况

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

刚入门FPGA的写法:

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

工作1-6年的写法:

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

现在的写法:

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

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

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

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

。。。。。未完待续

总结

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

标签:FPGA,心中,经验谈,shift,电路,always,写法
来源: https://blog.csdn.net/gzy0506/article/details/121505163