不枉初心,砥砺前行

皮皮祥的博客

欢迎留言,评论

导航

signal和variable

定义:signal是指电子电路内部硬件连接的抽象,在综合过程中是硬件电路的线路,变量一般用于进程中局部数据存储单元

范围:信号可定义在结构体,实体,程序包中,变量定义在 process ,function ,procedure 中是局部量,

赋值:信号是在进程结束的时候赋值,所以你在进程中多次赋值只取最后一次,信号存在延时,通常延时时间为(德尔塔)到该进程结束。

变量是立即赋值因为fpga是个process并行处理,所以一个变量只能在一个进程中赋值,否则会出错。

端口是实体的对外接口,硬件对应物相当于引脚,其实它是一种隐式的信号定义。而信号本身可看成是一种显式的信号定义,

它的硬件对应物是连接线。一句话,端口可看成信号!只不过端口模式(in、out、buffer等)限制了端口信号的功能,例如如果端口是out模式,

则不能进行内部反馈赋值,而信号则可以随便赋值了。


 
 

1.信号 

    信号是描述硬件系统的基本数据对象,它的性质类似于连接线。信号可以作为设计实

体中并行语句模块间的信息交流通道。
      信号作为一种数值容器,不但可以容纳当前值,也可以保持历史值(这决定于语句的
表达方式)。这一属性与触发器的记忆功能有很好的对应关系,只是不必注明信号上数据流
动的方向。信号定义的语句格式与变量相似,信号定义也可以设置初始值,定义格式是:
   SIGNAL 信号名: 数据类型 := 初始值 ;
      同样,信号初始值的设置也不是必需的,而且初始值仅在 VHDL 的行为仿真中有效。
与变量相比,信号的硬件特征更为明显,它具有全局性特征。例如,在实体中定义的信号,
在其对应的结构体中都是可见的,即在整个结构体中的任何位置,任何语句结构中都能获
得同一信号的赋值。 

      此外还需要注意,信号的使用和定义范围是实体、结构体和程序包,在进程和子程序

的顺序语句中不允许定义信号。此外,在进程中只能将信号列入敏感表,而不能将变量列
入敏感表。可见进程只对信号敏感,而对变量不敏感,这是因为只有信号才能把进程外的
信息带入进程内部,或将进程内的信息带出进程。

2. 信号与端口

      事实上,除了没有方向说明以外,信号与实体的端口(Port)概念是一致的。对于端口来
说,其区别只是输出端口不能读入数据,输入端口不能被赋值。信号可以看成是实体内部(设
计芯片内部)的端口。反之,实体的端口只是一种隐形的信号,在实体中对端口的定义实质
上是作了隐式的信号定义,并附加了数据流动的方向,而信号本身的定义是一种显式的定
义。因此,在实体中定义的端口,在其结构体中都可以看成是一个信号,并加以使用,而
不必另作定义。
     

参考:http://eelab.jmu.edu.cn/_eelab2/jiangyi/EDA%E6%8A%80%E6%9C%AF%E4%B8%8EVHDL%E7%AC%AC5%E7%AB%A0.pdf

3. verilog中reg和wire类型的区别和用法 

reg相当于存储单元,wire相当于物理连线 

Verilog 中变量的物理数据分为线型和寄存器型。这两种类型的变量在定义时要设置位宽,缺省为1位。变量的每一位可以是0,1,X,Z。其中x代表一个未被预置初始状态的变量或者是由于由两个或多个驱动装置试图将之设定为不同的值而引起的冲突型线型变量。z代表高阻状态或浮空量。 

线型数据包括wire,wand,wor等几种类型在被一个以上激励源驱动时,不同的线型数据有各自决定其最终值的分辨办法。 

两者的区别是:即存器型数据保持最后一次的赋值,而线型数据需要持续的驱动 

输入端口可以由net/reg驱动,但输入端口只能是net;输出端口可以使net/reg类型,输出端口只能驱动net;若输出端口在过程块中赋值则为reg型,若在过程块外赋值则为net型用关键词inout声明一个双向端口, inout端口不能声明为寄存器类型,只能是net类型。

    wire表示直通,即只要输入有变化,输出马上无条件地反映;reg表示一定要有触发,输出才会反映输入。 

        不指定就默认为1位wire类型。专门指定出wire类型,可能是多位或为使程序易读。wire只能被assign连续赋值,reg只能在initial和always中赋值。wire使用在连续赋值语句中,而reg使用在过程赋值语句中。 

        在连续赋值语句中,表达式右侧的计算结果可以立即更新表达式的左侧。在理解上,相当于一个逻辑之后直接连了一条线,这个逻辑对应于表达式的右侧,而这条线就对应于wire。在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中,而这个变量可以声明成reg类型的。根据触发条件的不同,过程赋值语句可以建模不同的硬件结构:如果这个条件是时钟的上升沿或下降沿,那么这个硬件模型就是一个触发器;如果这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器;如果这个条件是赋值语句右侧任意操作数的变化,那么这个硬件模型就是一个组合逻辑。 

        输入端口可以由wire/reg驱动,但输入端口只能是wire;输出端口可以使wire/reg类型,输出端口只能驱动wire;若输出端口在过程块中赋值则为reg型,若在过程块外赋值则为net型。用关键词inout声明一个双向端口, inout端口不能声明为reg类型,只能是wire类型;输入和双向端口不能声明为寄存器类型。 

       简单来说硬件描述语言有两种用途:1、仿真,2、综合。 

对于wire和reg,也要从这两个角度来考虑。 

从仿真的角度来说,HDL语言面对的是编译器(如Modelsim等),相当于软件思路。这时:wire对应于连续赋值,如assignreg对应于过程赋值,如always,initial 

从综合的角度来说,HDL语言面对的是综合器(如DC等),要从电路的角度来考虑。这时:1、wire型的变量综合出来一般是一根导线;2、reg变量在always块中有两种情况:(1)、always后的敏感表中是(a or b or c)形式的,也就是不带时钟边沿的,综合出来还是组合逻辑(2)、always后的敏感表中是(posedge clk)形式的,也就是带边沿的,综合出来一般是时序逻辑,会包含触发器(Flip-Flop) 

在设计中,输入信号一般来说你是不知道上一级是寄存器输出还是组合逻辑输出,那么对于本级来说就是一根导线,也就是wire型。而输出信号则由你自己来决定是寄存器输出还是组合逻辑输出,wire型、reg型都可以。但一般的,整个设计的外部输出(即最顶层模块的输出),要求是寄存器输出,较稳定、扇出能力也较好。

参考:http://m.oschina.net/blog/96149

也就是说VHDL综合出来输出端口一定带寄存器,Verilog不一定

转自:http://www.cnblogs.com/blue-box/p/4252729.html

posted on 2021-08-03 09:14  皮皮祥  阅读(585)  评论(0编辑  收藏  举报