ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-11-24 00:01:44  阅读:201  来源: 互联网

标签:FPGA 心中 经验谈 shift 电路 always 写法


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

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有