技术交流 · 2011年 1月 11日 1

VHDL 编程注意事项

1 在VHDL中,共有3种常用对象类型:常量、变量和信号。
2 应注意端口信号的方向。Out方向只能被赋值;in方向可以赋值:buffer可以赋值和被赋值;由于inout就是输入/输出端口,因此可以赋值和被赋值。特别需要注意的是,当输出信号要反馈回去时,必须定义为inout。
3 信号使用信号赋值符“<=”。
4 变量使用变量赋值符“:=”。
5 std_logic和std_logic_vector是可综合VHDL描述中常见的数据类型
6 在ieee.std_logic_unsigned.all包的支持下,可进行std_logic和std_logic_vector的加减运算。
7 在同一个进程中,信号可以被多次赋值,但是只有最后一个赋值有效。在进程中,因为语句的执行是顺序的,虽然对一个信号有多次赋值,但是仍然认为该信号具有具有一次驱动。在进程中,可以对一个信号进行多次赋值。但是,变量确不然,在一个进程内,对变量的多次赋值完全可以按照设计的逻辑进行。
8 在结构体中,不能对一个信号赋值多次,因为各个信号赋值语句之间是并发关系。
9 被赋值信号的位数与赋予它的数值位数必须相等,否则出错。例如,将2位八进制赋予4位逻辑矢量是错误的。解决这一问题的办法是:把位数凑齐。例如3 bit 的std_logic_vector和1位的std_logic可以通过以下的方法链接addtemp:=’0’&A1&A0+’0’&B1&B0+”00”&CYI;
10 为使赋值和被赋值情况下不出现错误,可以在结构体内声明与输入、输出端口相同数据类型的信号。在结构体中,先将输入端口赋予信号,然后在对信号进行逻辑处理后,在用赋值语句将信号赋予输出端口。
11 定义整形数范围的时候,计数器计数的范围实际上是2的n次幂减1。例如integer rang 0~128,实际上会计数到255,因为128需要8位二进制表示。
12 Case语句需要时钟触发的。
13 信号量不可以在进程内定义。
14 VHDL文件不可以放在根目录下。
15 工程包括多个文件时顶层实体是总文件。
16 器件例化语句不能放在进程内
17 有“+”编译不能通过的原因是缺少库文件ieee_logic_unsigned.all。
18 时钟触发不同于 clk’EVENT and clk=’1’。