论文导读:在大多数设计中,常常会忽视建立、采用一种良好的命名约定。建议在设计用来综合的VHDL代码时只使用STD_LOGIC类型(对总线采用STD_LOGIC_VECTOR类型)。如果在时序进程的敏感表中未列全信号,那么其综合前和综合后的仿真结果可能会不同。
关键词:VHDL,设计,综合
VHDL作为一种硬件描述和仿真语言,最终要实现的是实际硬件电路;为了得到可综合的有效设计,设计者在编程时要注意以下几点:
1. 命名约定
在大多数设计中,常常会忽视建立、采用一种良好的命名约定。拥有好的命名约定就意味着设计清爽而系统化,对于其他设计者也具有很好的可读性。拥有好的命名约定,设计者看到信号的名字就能够很容易联想出其功能。
2. STD_LOGIC类型的使用
建议在设计用来综合的VHDL代码时只使用STD_LOGIC类型(对总线采用STD_LOGIC_VECTOR类型)。论文发表。如果只使用这一种类型,那么在将各模块集成起来的时候就无须考虑类型转换。
3. 反馈信号的使用
对于打算在设计对象内部对输出端口进行反馈的设计,提倡将该输出端口定义成OUTPUT端口,并另外建立一个与此输出端口相关联的信号,然后用该信号在设计对象内部实现反馈。不提倡将输出端口定义为BUFFER并在内部反馈该端口。使用BUFFER声明会在将各个模块集成起来的时候引起问题,这是因为与声明成BUFFER的端口相连接的每一个端口都必须声明成BUFFER端口。
4. 完整的敏感表
如果在时序进程的敏感表中未列全信号,那么其综合前和综合后的仿真结果可能会不同。Design Compiler在读入敏感表不完整的VHDL源文件时将发出正在读入的文件具有不完整的敏感表的警告信息。论文发表。
5. 对组合逻辑和时序逻辑分别使用不同的进程
总是提倡设计者将组合逻辑和时序逻辑分开来写,一个进程用于组合逻辑,另一个进程用于时序逻辑。这样做了之后,设计者就有两个更大的灵活性。使用不同的进程,也会让VHDL代码变得更有可读性。
6. IF语句与CASE语句
IF语句会综合出优先级编码器,而CASE语句将综合出多路选择器。然而,无论采用哪一种语句,都建议列出全部条件而不遗漏任何未列出的条件。这样就能确保综合过程中不会产生一个意料之外的锁存器。
7. 信号与变量的使用
在使用信号和变量是,应牢记对信号的赋值仅在下一个仿真节拍才开始有效,而对变量的赋值立即生效。
8. 尽量不使用WAIT FOR XX ns语句和AFTER XX ns语句。[1]
XX ns表明在执行下一操作之前需要等待的时间,但综合器不予支持,一般忽略该时间,而不会综合成某种元件,故对于包含此类语句的程序,仿真结果与综合结果往往不一致。
9. 声明信号和变量时尽量不赋初值
定义某确定数值时,使用常量而不用变量赋初值的形式。因为大多数综合工具将忽略赋值等初始化语句,诸如:VARIABAL S∶INTEGER∶=0。
10. 函数或过程调用时尽量使用名称关联。
因为名称关联可以比位置关联更好地防止产生不正确的端口连接和元件声明,也不要在同一个语句中同时使用两种关联。论文发表。诸如:
clk_1:bufes port map(I=>clock_in,clock_out);(不正确的用法)
clk_1:bufes port map(I=>clock_in,O=>clock_out);(正确的用法)
11. 注意算术功能的设计优化。
例如下面两条语句:
Out<=A+B+C+D;
Out<=(A+B)+(C+D);
第一条语句综合后将会连续叠放3个加法器(((A+B)+C)+D);第二条语句(A+B)和(C+D)使用两个并行的加法器,同时进行加法运算,再将运算结果通过第三个加法器进行组合。虽然使用资源数量相同,但第二条语句速度更快。以4位和 16位加法器为例,选用Altera公司EPF10K30AQC240_3芯片,通过synopsys FPGA Express综合工具实现的结果进行测试,比较结果如表1所列。

12. 注意资源共享
资源共享的主要思想是通过数据缓冲或多路选择的方法来共享数据通道中占用资源较多的模块(如乘法器、多位加法器等算术模块)。

例程3的设计可用图1描述,例程4的设计可用图2描述。可见例程4节省了一个代价高昂的乘法器,整个设计占用面积比例程3几乎减少了一半。
结论
通过以上初步的探讨可知,用VHDL进行集成电路的设计,不仅需要熟悉VHDL语言的使用方法和对设计要求的深刻理解,而且应在设计全程中遵循一些基本原则,以求电路结构设计和软件使用中达到最佳的设计效果。
参考文献
[1] 潘松,黄继业编著,《EDA技术与VHDL第二版》,北京,清华大学出版社,2007.1
|