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