打印

VHDL注意事项

[复制链接]
1241|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
星星之火红|  楼主 | 2012-10-16 20:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.integer 的取值可用符号的32位2进制数表示。

2.需要注意的是,VHDL 仿真器将integer类型作为有符号数处理,而VHDL综合器则将integer作为无符号数处理。而且VHDL综合器要求必须使用rang子句为所定 义的数限定范围,然后根据所限定的范围来确定此信号或变量的2进制的位数,因为VHDL综合器无法综合未限定范围的恶整数类型的信号和变量。

3.整数在表达式中不加引号,而逻辑数必须加引号,一位的加单引号,一位以上的加双引号。4.natural,positive 为integer的子类型。

相关帖子

沙发
星星之火红|  楼主 | 2012-10-16 20:40 | 只看该作者
关于signal


signal可作为内部的节点,这就决定它不需要像端口那样定义模式,即数据i流动不受方向限制,可用来建立寄存器等。



关于算数运算


VHDL规定加减等算数操作符对应的操作数只能是integer,而当不同数据类型间运算操作的时候就要调用运算符重载函数 ieee库中的std_logic_unsigned程序包中,其中预定义的操作符有+、-、*、=、>=、<=、>、<、/=、and、mod等,用法如下:



library ieee;



use ieee_logic_unsigned.all



veriable 变量,也是数据对象的一种,赋值符号为“:=”。
(others=>X)缺省赋值操作符,可以在较多的矢量赋值中作省略化的赋值。例如:


signal d1,d3 :std_logic_vector(4 dwonto 0)



veriable d2,d4:std_logic_vector(15 downto 0)



...



d1<=(others=>'0');



d2:=(1=>'1',4=>'1',others=>'0');



d3<=(1=>d1(3),3=>d2(3)???,others=>d1(2));



所谓同步异步都是对于时钟信号而言的,不依赖于时钟而有效的信号称为异步信号,否则称为同步信号。



穿行并行,我的理解是如果将一个vector一次性一次送性的给另一个vector的话就是并行,如果是一个bit一个bit的送的话就是串行。

使用特权

评论回复
板凳
星星之火红|  楼主 | 2012-10-16 20:41 | 只看该作者
数据对象


VHDL中的数据对象有三种,常量(constant)、变量(veriable)、信号(signal),用来描述目标量的属性的。



常量(constant),允许的三个设计单元有实体,结构体,程序包,块,进程,子程。常量的可视性,即常量的作用范围决定于它被定义的位置:包=>实体=>结构体=>进程等。signal 也有the same attribute.
变量(veriable),是一个局部量,只作用于在定义了变量的process和subprogram的顺序语句里面,而且变量的数据传输没有延时行为。变量的主要作用是在进程中作为临时的数据存储单元(当前)。
信号(signal),信 号的define 和使用的范围为entity,architecture和package,而不能在process和subprogram的顺序语句 中。而且,在没有作特殊设置时,信号也有一个最小传输延时,它的硬件特征更为明显,类似于连接线,可以作为设计实体并行语句模块间的信息交流通道,它即可 以保存当前值也可以保存历史值,和触发器的**功能有很好的对应关系,只是不必care信号上的数据流动方向。关于信号的初始值的设定和veriable 一样,因为电路上电后的随机性,因此综合器并不支持设置初始值。由于process的敏感列表里可以有信号,那么信号就能把process外部的信息引入 或传出.在process中,当多个同名信号被赋值,只执行最后一个,因为当遇到end process的时候才对signal赋值。但是当并行语句中却 不允许同一信号有多个驱动源的。
硬件电路系统上来看,变量和信号相当于电路系统中的连线和连线上传输的信号,常量相当于电路中的恒定电平,如gnd和vcc。在不完整条件语句中,变量和信号有同样的功能都能。  
关于process(clk) begin
if clk'event and clk='1' then

a<=d;        --d,q为port,a,b为signal   

b<=a;

q<=b;

end if ;

end  process;中的一些问题!

首先,此进程描述的是当clk上升沿发生时,将信号由port d输入到a到b,再由port q输出。

下面要说的是这个进程执行时的几个问题。

首先,此进程执行的时候,a的赋值,b的赋值,q的赋值是并行执行的,也就是说a,b,q的赋值是同时的。但这是在进程中,也就是说应该先将a赋 值,再将a的值赋给b,最后把b的值由q输出,这样一个顺序执行,为什么会是并行执行的呢?为什么赋值结束后q输出的值并不是d输入的值呢,而是上一时钟 b的值?

这是因为,对于某一个时钟周期的信号,确实是按从a到b到q的顺序传输的。而对于同一个时钟,各个节点上的信号都不是当前其上一个节点上的信号,原 因很简单,就是因为要有一个固定延时赋值才完成。也就是说q输出的值是b上一时钟的值,而b被更新的值是上一时钟a的值... ...而当前这个时刻,每一个一个节点的值都是被赋给的新值,也就是说,在这个固定延时时间里,各个节点被赋值是同时发生的。

这个进程中的信号的顺序赋值,很完美的体现了硬件行为,即整体描述了一个信号是如何在节点之间传递的,又描述出每个时钟的信号都是如何在节点之间动作的,这就是HDL的魅力吧!~呵呵

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

1782

帖子

22

粉丝