一、HDL不是硬件设计语言
过去笔者曾碰到过不少VHDL或Verilog HDL的初学者问一些相似的问题,诸如如何实现除法、开根号,如何写循环语句等等。在这个论坛上,也时常能看到一些网友提出这一类的问题。
对于这些问题,首先要明确的是VHDL和Veriglog并非是针对硬件设计而开发的语言,只不过目前被我们用来设计硬件。HDL是Hardware Description Language的缩写,正式中文名称是“硬件描述语言”。也就是说,HDL并不是“硬件设计语言(Hardware Design Language)”。别看只差这一个单词,正是这一个单词才决定了绝大部分电路设计必须遵循RTL的模式来编写代码,而不能随心所欲得写仅仅符合语法的HDL代码。
二、HDL的来历
之所以是“硬件描述语言”,要从HDL的来历说起。
VHDL于1980年开始在美国国防部的指导下开发,完成于1983年,并于1987年成为IEEE的标准。当初开发这种语言,是出于美国国防部采购电子设备的需要。美军的装备采购自私人企业,时常要面对这样一种风险:如果某种武器大量装备部队,而其中某个零件的供应商却在几年后倒闭了,那这种武器的再生产、维修和保养都会出现大问题。而电子设备、尤其是集成电路的内部结构较为复杂,若出现前面所说的情况要找其他公司生产代用品非常困难。于是美国防部希望供应商能以某种形式留下其产品的信息,以保证一旦其破产后能由其他厂商迅速生产出代用品。
显然,当初的设计文档显然是不能交出来的,这在美国会涉及商业机密和知识产权问题。于是美国防部就想出了一种折衷的方法——描述硬件的语言,也就是VHDL。通过VHDL,供应商要把自己生产的集成电路芯片的行为描述出来:比如说,加了什么样的信号后过多少时间它能输出什么等等。这样,如果有必要让其他厂商生产代用品,他们只需照着VHDL文档,设计出行为与其相同的芯片即可。这样的代用品相当于是新厂商在不了解原产品结构的情况下独立设计的,所以不太会涉及知识侵权。
Verilog HDL也形成于差不多的年代,是由Gateway Design Automation公司大约在1983年左右开发的。其架构同VHDL相似,但主要被用来进行硬件仿真。或许私人公司更注重实用,Verilog要比VHDL简洁得多。
由此可见,这两种最流行的用于电路设计的语言,没有一种是为了设计硬件而开发的(更何况80年代还没有现在的那些功能强大的EDA软件呢)。因此,当初制订HDL语言标准的时候,并没有考虑这些代码如何用硬件来实现。换句话说,有些代码写起来简单,实现起来却可能非常复杂,或者几乎不可能实现。
三、HDL代码的可综合性
现在回到最初的问题上。为什么诸如除法、循环之类的HDL代码总是会出错?
由上一部分可知,任何符合HDL语法标准的代码都是对硬件行为的一种描述,但不一定是可直接对应成电路的设计信息。行为描述可以基于不同的层次,如系统级,算法级,寄存器传输级(RTL)、门级等等。以目前大部分EDA软件的综合能力来说,只有RTL或更低层次的行为描述才能保证是可综合的。而众多初学者试图做的,却是想让软件去综合算法级或者更加抽象的硬件行为描述。
比如说,要想实现两个变量相除的运算,若在代码中写下C=A/B,你将会发现只有一些模拟软件在前仿真中能正确执行这句代码,但几乎任何软件都不能将其综合成硬件。不要怪软件太笨。试想一下,如果我们自己笔算除法是怎么做的?从高位到低位逐次试除、求余、移位。试除和求余需要减法器,商数和余数的中间结果必须有寄存器存储;而此运算显然不能在一个时钟周期里完成,还需要一个状态机来控制时序。一句简单的C=A/B同所有这些相比显得太抽象,对于只能接受RTL或更低层次描述的EDA软件来说确实太难实现。而如果代码是类似于(Verilog)
always @(posedge clk)
c<=A/B; 这样的,要求除法在一个时钟延上完成,那更是不可能实现的。(注:有些FPGA的配套软件提供乘除法的运算模块,但也只能支持直接调用,不支持把形如C=A/B的语句综合成除法模块。)
又比如,一个很多初学者常见的问题是试图让HDL进行循环运算,形同(Verilog):
for (i=0; iparity = parity xor data[i];
一些功能比较简单的综合软件会完全拒绝综合循环语句;而一些功能较强的软件仅当wordlength是常数的时候能综合;当wordlength为变量时,任何软件都不能综合上面的语句。这是因为硬件规模必须是有限的、固定的。当综合软件遇到循环语句时,总是将其展开成若干条顺序执行的语句,然后再综合成电路。若wordlength是常数,则展开的语句数是确定的,具有可综合性;而若它是变量时,展开的语句数不确定,对应的硬件电路数量也不能确定,无法被综合。或许有人说用计数器就能实现变量循环,但这情形又和上面的除法运算相同。那需要额外的硬件,用来存储中间结果和进行时序控制,象上面那样的循环语句对此描述得太抽象,软件接受不了。
四、如何判断自己写的代码是可综合的?
用一句简单的话概括:电脑永远没有你聪明。具体来说,通常EDA软件对HDL代码的综合能力总是比人差。对于一段代码,如果你不能想象出一个较直观的硬件实现方法,那EDA软件肯定也不行。比如说,加法器、多路选择器是大家都很熟悉的电路,所以类似A B-C,(A>B)?C这样的运算一定可以综合。而除法、开根、对数等等较复杂的运算,必须通过一定的算法实现,没有直观简单的实现方法,则可以判断那些计算式是不能综合的,必须按它们的算法写出更具体的代码才能实现。此外,硬件无法支持的行为描述,当然也不能被综合(比如想在FPGA上实现DDR内存那样的双延触发逻辑,代码很容易写,但却不能实现)。
不过,这样的判断标准非常主观模糊,遇到具体情况还得按设计人员自己的经验来判断。如果要一个相对客观的标准,一般来说:在RTL级的描述中,所有逻辑运算和加减法运算、以及他们的有限次组合,基本上是可综合的,否则就有无法综合的可能性。当然,这样的标准仍然有缺陷,更况且EDA的技术也在不断发展,过去无法综合的代码或许将来行,某些软件不支持的代码换个软件或许行。比如固定次数的循环,含一个常数参数的乘法运算等等,有些EDA软件支持对它们的综合,而有些软件不行。
所以,正确的判断仍然要靠实践来积累经验。当你可以较准确判断代码的可综合性的时候,你对HDL的掌握就算完全入门了。
谈VHDL/Verilog的可综合性以及对初学者的一些建议
关键词: Verilog 综合性 以及 初学者 一些 建议
FPGA的学习:
工欲善其利,必先利其器。想要学习FPGA的人,首先得把其工具学好。这个工具得从两点下手:
第一点:语言 ? verilog : vhdl
此时,可能大家又会有疑问了,我又到底该学哪门语言呢?
其实在大学里面大多不可开了vhdl语言,毕竟授课的那一代最先接触的是vhdl语言,所以这也不为过了。可是我们要明白,我们以后要面对的是市场,所以就不然生活在死板的教学安排下罗。
刚开始时我跟大家也一样,最先接触的是VHDL语言,可是慢慢地我发现很多资料都是Verilog的,这样的话就造成了一些阅读上的麻烦。所以,我也就慢慢地接触上Verilog。可能刚从VHDL转向Verilog的学习会觉得很不习惯,甚至还没有Vhdl好学,虽然这样想我很同晴你,因为包括我在内,很多人都是感同身受,因为它不像Vhdl那么规范,格式比较固定。学电子的通常都有C语言的基础,而Verilog也就是C语言延升过来的,所以想Verilog也还是比较容易上手的。更重要的是,Verilog的代码通常都是比较简洁的。比如说同一段代码,用Verilog实现比Vhdl至少少三分之一的量!
刚才我们说到了市场,就目前情况来讲,Verilog在公司里面占的份额远比Vhdl高,所以呢?我觉得大家把Verilog学好是非常有必要的。不过最好是把两门语言弄精通(事实上我就是这么做的),这样不仅可以更另方便地查看资料,同对有时对于设计也还是非常有帮助的。
学语言的时候我希望大家不要死看书本,因为很多书上记载的实例通常也都漏洞百出,所以也可以尝试编译一下实例,即可以加深印象,有时也可以查找出错误,同时也还可以熟悉对工具软件的使用,何乐而不为呢?
另外,很多人对语言的学习并不看重,敷衍了事就行了,这是学习之大忌。造成的直接的结果是遇到问题了都不会在书上找到答案,而是直接问别人,有时候就是一个小小的语法上面的问题而已,哎 初学者如果抱着这种学习的态度是永远也学不好的。
第二点:工具软件 ?Altera :Xilinx
其实这一点还是比较讲清楚的,因为软件其实都是相通牟,只要把一方面的软件学好的,另外也就迎刃而解的,上手也快。在咱们中国,使用Altera公司开发的编译软件Quartus II比较多,而在欧洲那边使用Xilinx的比较多,在美国则平分秋色。对于软件的使用我希望大家多看下帮助文档或者是手册,这是最好最详细的导航仪,比问别人更加精确。在平时的自己最好一个一个去尝试,不要遇到问题就问,否则自己的自学能力如何提高。哈哈 不知道大家英文学得怎样?否则的话看这些文档起初是比较费劲的,不过贵在坚持,看多了,自然就习惯了。英语对我们学电子的实在太重要了,无论是现在用软件看成Handbook也好,还是以后看芯片资料Datasheet,要知道这些可全是英文的呀!不可能以后公司还为每个人配一个英语翻译的吧!这样的话公司为什么不直接招聘一个英语水平比较高的人呢? 对吧 可见英文能力的重要性了吧!具我所知,学电子的通常都是理工科出身,而且大多为男生,所以通常英语水平都不怎么的。但是,我不会同情你,如果在以后的竞争过程中你不想被淘汰就必须得把英语学好(这点重点强调的是英文阅读能力)。男人们啊,加油吧!相信自己没有什么可以难倒我们的。
呵呵 说了这么多 无非就是想大家把基础扎好,而且不定要扎实,至于好处会在以后的过程中体会得到的。
现在社会是一个团队的竞争,不再是英雄称霸的时代罗。所以要非常注意团队之间的合作,这一点想必也不用我再强调啦!
另外,在学习的过程中,如果说没有一个团队,就自己一个人闭门造车,这样的话会学得很慢的,虽然有时候是迫不得已,因为在很多学校一个专业能有那么几个学习技术就已经很不错了,所以在这种情况下我们该怎么办呢?
想当初我刚学的时候也是一个个摸索着前进,指望不上同学的帮助,也指望不上都是的指导,就这样前进了半个学期,会的也还是只有那么多,太慢了,这一点对于一个非常讲效率的我是不能接受的。所以,我建议大家如果身边没有同伴的话,可是多往论坛跑跑(这一点下面我会向大家推荐的),别把时间全花在游戏跟谈恋爱身上去了,学电子的要耐得住寂寞,这一点是我刚接触电子时老师对我说的,至今还记在心中。学电子的需要的是一种刻苦钻研的精神,心不能太浮躁,否则的话我劝你还是早点转行得了,因为转行的话或许你的路会好走一点。
上面说的这些话或许只能对新手起一点指导作用,大师就可以不必了解了。因为这些我是从自己的切身体验上写出来的,真实 实在 所以我希望能够刚接触FPGA的初学者指引一条道路。
强烈推荐:
论坛:中国电子顶级开发网(论坛有很多,但建议大家不要参与太多,因为我们没那么多经历停留在网上 ,这个网站应该是目前同类中最好的一个中文论坛)
Altera官网论坛
博客园(这并非论坛,但其中资料非常丰富,有很多不错的牛人的博客都写得非常好)
书籍:ALTERA FPGA/CPLD设计 基础篇 高级篇
Verilog数字系统设计教程 夏雨闻
VHDL与数字系统设计
FPGA的学习:
工欲善其利,必先利其器。想要学习FPGA的人,首先得把其工具学好。这个工具得从两点下手:
第一点:语言 ? verilog : vhdl
此时,可能大家又会有疑问了,我又到底该学哪门语言呢?
其实在大学里面大多不可开了vhdl语言,毕竟授课的那一代最先接触的是vhdl语言,所以这也不为过了。可是我们要明白,我们以后要面对的是市场,所以就不然生活在死板的教学安排下罗。
刚开始时我跟大家也一样,最先接触的是VHDL语言,可是慢慢地我发现很多资料都是Verilog的,这样的话就造成了一些阅读上的麻烦。所以,我也就慢慢地接触上Verilog。可能刚从VHDL转向Verilog的学习会觉得很不习惯,甚至还没有Vhdl好学,虽然这样想我很同晴你,因为包括我在内,很多人都是感同身受,因为它不像Vhdl那么规范,格式比较固定。学电子的通常都有C语言的基础,而Verilog也就是C语言延升过来的,所以想Verilog也还是比较容易上手的。更重要的是,Verilog的代码通常都是比较简洁的。比如说同一段代码,用Verilog实现比Vhdl至少少三分之一的量!
刚才我们说到了市场,就目前情况来讲,Verilog在公司里面占的份额远比Vhdl高,所以呢?我觉得大家把Verilog学好是非常有必要的。不过最好是把两门语言弄精通(事实上我就是这么做的),这样不仅可以更另方便地查看资料,同对有时对于设计也还是非常有帮助的。
学语言的时候我希望大家不要死看书本,因为很多书上记载的实例通常也都漏洞百出,所以也可以尝试编译一下实例,即可以加深印象,有时也可以查找出错误,同时也还可以熟悉对工具软件的使用,何乐而不为呢?
另外,很多人对语言的学习并不看重,敷衍了事就行了,这是学习之大忌。造成的直接的结果是遇到问题了都不会在书上找到答案,而是直接问别人,有时候就是一个小小的语法上面的问题而已,哎 初学者如果抱着这种学习的态度是永远也学不好的。
第二点:工具软件 ?Altera :Xilinx
其实这一点还是比较讲清楚的,因为软件其实都是相通牟,只要把一方面的软件学好的,另外也就迎刃而解的,上手也快。在咱们中国,使用Altera公司开发的编译软件Quartus II比较多,而在欧洲那边使用Xilinx的比较多,在美国则平分秋色。对于软件的使用我希望大家多看下帮助文档或者是手册,这是最好最详细的导航仪,比问别人更加精确。在平时的自己最好一个一个去尝试,不要遇到问题就问,否则自己的自学能力如何提高。哈哈 不知道大家英文学得怎样?否则的话看这些文档起初是比较费劲的,不过贵在坚持,看多了,自然就习惯了。英语对我们学电子的实在太重要了,无论是现在用软件看成Handbook也好,还是以后看芯片资料Datasheet,要知道这些可全是英文的呀!不可能以后公司还为每个人配一个英语翻译的吧!这样的话公司为什么不直接招聘一个英语水平比较高的人呢? 对吧 可见英文能力的重要性了吧!具我所知,学电子的通常都是理工科出身,而且大多为男生,所以通常英语水平都不怎么的。但是,我不会同情你,如果在以后的竞争过程中你不想被淘汰就必须得把英语学好(这点重点强调的是英文阅读能力)。男人们啊,加油吧!相信自己没有什么可以难倒我们的。
呵呵 说了这么多 无非就是想大家把基础扎好,而且不定要扎实,至于好处会在以后的过程中体会得到的。
现在社会是一个团队的竞争,不再是英雄称霸的时代罗。所以要非常注意团队之间的合作,这一点想必也不用我再强调啦!
另外,在学习的过程中,如果说没有一个团队,就自己一个人闭门造车,这样的话会学得很慢的,虽然有时候是迫不得已,因为在很多学校一个专业能有那么几个学习技术就已经很不错了,所以在这种情况下我们该怎么办呢?
想当初我刚学的时候也是一个个摸索着前进,指望不上同学的帮助,也指望不上都是的指导,就这样前进了半个学期,会的也还是只有那么多,太慢了,这一点对于一个非常讲效率的我是不能接受的。所以,我建议大家如果身边没有同伴的话,可是多往论坛跑跑(这一点下面我会向大家推荐的),别把时间全花在游戏跟谈恋爱身上去了,学电子的要耐得住寂寞,这一点是我刚接触电子时老师对我说的,至今还记在心中。学电子的需要的是一种刻苦钻研的精神,心不能太浮躁,否则的话我劝你还是早点转行得了,因为转行的话或许你的路会好走一点。
上面说的这些话或许只能对新手起一点指导作用,大师就可以不必了解了。因为这些我是从自己的切身体验上写出来的,真实 实在 所以我希望能够刚接触FPGA的初学者指引一条道路。
强烈推荐:
论坛:中国电子顶级开发网(论坛有很多,但建议大家不要参与太多,因为我们没那么多经历停留在网上 ,这个网站应该是目前同类中最好的一个中文论坛)
Altera官网论坛
博客园(这并非论坛,但其中资料非常丰富,有很多不错的牛人的博客都写得非常好)
书籍:ALTERA FPGA/CPLD设计 基础篇 高级篇
Verilog数字系统设计教程 夏宇闻
VHDL与数字系统设计
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |