返回信息流第十一章 在MAX+plus II下使用VHDL语言的常见问题
ALTERA公司是20世纪90年代以后发展很快的最大可编程逻辑器件供应商之一。业界公认MAX+plus II是最优秀的CPLD开发平台之一。在MAX+plus II软件中,用文本编辑器编写VHDL程序,通过MAX+plus II进行逻辑综合,图形仿真以后,编程下载。使用MAX+plus II软件主要的目的是要使VHDL设计能够应用于实际,能够逻辑综合到具体芯片中去,因此在MAX+plus II环境中进行VHDL设计和在行为仿真软件中进行VHDL设计是有区别的,有许多问题值得注意。
在本章中,将就在MAX+plus II环境中使用VHDL语言进行设计的常见问题做简单的介绍,要在MAX+plus II平台上熟练的使用VHDL语言进行设计,最终还得依靠设计者的不断实践,积累设计经验。
11.1 创建文件时应注意的问题
在MAX+plus II环境中使用VHDL语言进行设计,首先要使用文本编辑器来编辑VHDL程序,除了必要的命名规则,如字母大小写,开始字母等等以外,创建文件的时候有以下几点值得注意。
11.1.1 文件的保存
MAX+plus II环境中的VHDL设计,一个设计项目不仅包括了设计输入文件,如VHDL源文件(*.vhd),还有编译过程中产生的一些文件,如再编译并提取网表的过程中,产生的.cnf,.hif,.ndb文件;在适配过程中产生的.rpt,.tdo,.aco文件和.fit文件;在SNF提取过程中产生的.snf文件;产生网表过程中产生的.edo,.vho,.vo文件和.sdo文件;生成下载和配置文件时产生的.pof文件,.sof,.hex,.ttf文件和.jed文件。如果各个设计都不加整理的放在默认的目录底下,势必造成文件管理的混乱。
通常的做法是,对于一个设计,创建一个单独的目录,该目录的路径从根目录开始都必须是英文名称,任意一级目录都不能出现中文字样,否则在读文件的时候会发生错误。将设计的源文件放在对应的目录底下,编译等过程产生的文件也就自动放在该目录底下了。这样能够使得整个设计中的各个部分,以及多个设计之间的文件管理有序,不容易产生管理上的混乱。
对于一个设计,称它为主设计,要引用其他的设计作为自己的模块,其他设计的源程序就必须和在个设计在同一个目录底下,否则无法引用。还有一个方法就是将其他的设计,都写到主设计的VHDL源程序中去。
11.1.2 文件的命名
用VHDL语言进行设计,设计源文件的主文件名应该和设计实体的名称相同,如果源程序中有多个实体,那么该源程序的主文件名应该和主实体的文件名相同,即其他的实体都以COMPONENT的形式在主实体的构造体中被引用。这点已经在前面的章节中强调过了。
11.1.3 波形文件的创建
对于波形文件的创建,没有那么严格的要求,波形文件主文件名可以和设计实体不同名。这个优点对于一个需要多个仿真的设计有很大的好处。
11.2 编程过程中应注意的问题
使用VHDL语言进行设计,需要设计者进行大量的实践,只有这样,才能熟练地掌握VHDL语言设计。对于初学者来说,编程过程中的一些问题常常被忽略,从而造成编译中一些莫名的错误没法得到解决,在这节中,将就编程过程中应注意的问题做一些讨论,希望能给初学者提供一些帮助。
11.2.1 实体设计中应该注意的问题
在实体设计中,应该注意以下两个问题:实体定义的格式和端口的说明问题。
实体定义的格式
实体的定义必须按照规定的格式,否则编译的时候就会出错。在实体定义的格式中,最容易被忽略的就是最后一行的端口定义完毕以后,不要标注分号,和前面的端口定义行最后都要加上分号分隔有一定区别。
端口的说明
在端口的说明中,端口的方向定义很重要,如果在构造体中,一个输出端口在构造体中被利用,例如被引用作为IF语句或者CASE语句的条件,那么该端口就必须定义成BUFFER类型,否则在编译过程中就会出错。
另外,在一个具体设计的实体端口说明中,端口的数据类型建议使用标准逻辑信号形式,可以大大提高设计的效率,也可以避免一些不必要的麻烦。
11.2.2 构造体设计中应该注意的问题
构造体是一个设计的核心,在编程的过程中,这部分的设计在整个设计中也是处于主体地位。在构造体设计中,有以下问题值得注意。
信号和变量的定义位置
信号(signal)的定义位置应该在构造体ARCHITECTURE和BEGIN之间,用于对构造体内部所使用的信号进行定义。这里定义的信号在整个构造体中都能够使用,但是信号的赋值有一定的限制。
变量(variable)的定义位置应该在进程的PROCESS和BEGIN之间,用于对该进程内部所使用的变量进行定义,且该变量只能在该进程中被使用和定义。
进程中的敏感量
进程中是靠进程中的敏感量来触发的,当敏感量有变化的时候就会触发进程,从第一个语句开始顺序执行一次进程中的所有语句,因此设计敏感表的时候,就要充分考虑进程的特性,不要把任何不必要的信号放入敏感表。
信号的赋值问题
一个定义了的信号,能够在整个构造体中被使用,例如作为IF语句的判断条件等等,但是一个信号只能在一个进程中被赋值,不能在多个进程中被赋值,否则编译时候将出错。
进程中的时钟动作
一个进程中只能有一个时钟信号发生动作,而不能有多个时钟信号动作。这也就是RTL描述中所谓的寄存器RTL描述的限制之一,禁止在一个进程中存在两个寄存器描述。
在进程中时钟动作一般是用IF clk’EVENT AND clk=’0’ THEN的形式出现,但是这样的IF语句不支持ELSE的形式,这也是RTL描述中所谓的寄存器RTL描述的限制之一。
并行结构语句和顺序结构语句
这点在前面的章节也多次强调过,但是这里还是再次强调,这在设计中是最基本的原则。在一般的设计中,顺序结构语句只能应用在进程中,并行结构语句应用于进程外的构造体中。
数据宽度的匹配问题
在赋值语句中,符号的两侧,数据的宽度必须匹配。在数据宽度匹配的条件下,要注意的是数据的高低位的匹配,即符号两侧的数据排位顺序的对应问题,否则虽然编译能够通过,但是结果可能会产生意想不到的错误。
注意行为描述抽象的程度
在第五章已经提到过,行为描述可以分为两种,其中一种可以进行逻辑综合,另外一种由于采用了很高抽象程度的VHDL语句而不能进行逻辑综合,因此在具体要实现的设计中,就要注意不能使用抽象程度高的VHDL语句,同时也要明确所使用的逻辑综合器所支持的语句。
11.3 编译过程中应注意的问题
程序设计完毕以后,就要通过编译器进行编译,编译的过程是使程序完善,修改错误的过程。编译器可完成从网表提取到最后编程文件的生成。在编译过程中生成一系列标准文件可进行时序模拟、适配等。
11.3.1 编译过程中错误的定位与改正
MAX+plus II中的编译器在编译过程中,如果遇到一般错误,在错误的地方,编译器会停止编译,并告诉错误的原因以及位置。双击消息窗口中的错误信息,将定位到发现的错误的程序行。
然而有的时候,出现的错误是没法自动定位的。也就是双击消息窗口中的错误信息,不能定位到任何的程序行上。这如何调试呢?可以通过所谓“人为制造错误”的方法进行定位。
遇到不能错误行定位的程序,在程序的任意位置加上一个人为制造的错误,例如在一个语句结束后多加一个分号。重新编译,如果编译器检测到了这个人为错误,说明不能错误定位的错误语句行在这个人为制造的错误语句行下面;如果重新编译以后,没有检测到这个人为制造的错误,那么就说明不能错误定位的语句行在人为制造的语句行上面。通过这种方法,反复在不同位置制造人为错误,就能最后将不能进行错误定位的语句行找到了。
至于错误的改正,这个就需要设计者的经验了,有时候程序靠前的一些错误,会导致后面的正确程序出现编译上的错误,即有些错误是间接导致的,语句本身并没有错。所以改正错误要按照消息窗口中的错误信息的顺序依次改正。
11.3.2 编译过程中的警告
有些程序编译之后,会产生警告。有的警告是正常的,如有的七段译码管就显示1,2,3三个数字,那么七段二极管中就有某些段始终不发光,这是编译就会出现警告,说有些信号始终接地,这种警告属于正常的警告,不需要理会。
有些程序编译之后产生的警告只是在第一次编译中出现,在多次编译以后会消失。这种警告也不会影响设计的性能,只是在特殊条件下有可能引起一些异常,所以可以不理会。
还有些警告是每次编译都会出现的不正常警告,那么就要引起设计者的注意了,这种警告必须得到改正,否则将影响设计的正确性。
11.4 其他应注意的问题
11.4.1 波形仿真
编译成功以后,就将进行波形仿真,在波形仿真中,如果设计的逻辑正确,一般不会出现大的问题,仿真结果和设计的预期效果应该一致。
应该注意的是,当修改程序以后,特别是构造体中信号量变化以及实体中端口变化以后,原来的仿真波形如果不加修改的再次进行仿真,那么就会出现警告。
有的设计逻辑完全正确,但是仿真波形时而正确,时而错误。这是怎么回事呢?这是由于设计中某个条件在波形图中恰好没有得到满足的结果。例如,在一个时钟的上升沿,在一个IF语句中根据信号a的值是1还是0来产生动作,但是在仿真波形图中,时钟的上升沿恰好和a的0与1变换的地方重合,这时候就没法判断a的值了,因此仿真波形就不正确了。但是在实际的情况中,这样的重合几乎是不可能发生的。因此在波形图中作出相应的调整,就能使仿真正确。
11.4.2 下载
在下载过程中要注意的就是电压的匹配,以及下载接口的匹配问题了。这里就不作更多的说明。
11.4.3 写在最后
VHDL是一门硬件电路语言,正是这个特点,决定了VHDL设计不同于一般的软件程序设计。
要熟练地使用VHDL语言进行设计,不仅需要设计者掌握软件的设计技巧,更重要的是设计者必须有深厚的硬件背景知识。而要将VHDL应用于实际项目中,更需要设计者拥有其他的专业知识。仅仅掌握VHDL语言的语法结构是不够的,并不能很好的进行VHDL设计。
在各个章节的实际设计中,不仅应用到了数字电路方面的知识,更是牵涉到了微机原理,操作系统,编码理论各个方面的知识。
可见,VHDL语言在一定意义上只是一个好的工具,而如何利用好这个工具,不能依靠工具本身,好工具优点的有效发挥,关键应该在于设计者的知识和智慧。所以,希望广大读者在学习VHDL编程思想的同时,应该不断丰富自己的其他背景知识,这样才能游刃有余的使用好VHDL语言这个工具。
这是一条镜像帖。来源:北邮人论坛 / circuit / #657同步于 2007/5/18
Circuit机器人发帖
VHDL-把我的书最后一章也就是经验总结的一章贴出来给大家吧.
kidd
2007/5/18镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。