加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Verilog中wire和reg

(2017-11-14 21:29:06)
分类: FPGA/CPLD
wire 和reg是Verilog程序里的常见的两种变量类型。 wire表示直通,即只要输入有变化,输出马上无条件地反映;reg表示一定要有触发(时钟沿或复位信号),输出才会反映输入

wire主要起信号间连接作用,用以构成信号的传递或者形成组合逻辑,一般都会综合成线。因为没有时序限定,wire的赋值语句通常和其他block语句并行执行。wire不保存状态,它的值可以随时改变,不受时钟信号限制。除了可以在module内声明,所有module的input 和output默认都是wire型的。

reg是寄存器的抽象表达,作用类似通常编程语言中的变量,可以储存数值,作为参与表达式的运算,通常负责时序逻辑,以串行方式执行。reg可以综合成寄存器或锁存器。reg可以保存输出状态。状态改变通常在下一个时钟信号边沿翻转时进行。

 

赋值方式

所有的wire和reg在声明时如果不做特殊声明,只有1位。若不定义位宽,则变量只会保存所赋值的最低一位。所以在声明wire和reg变量时必须指明位宽。

reg[5:0] reg_a; //位宽为6位的reg变量reg_a

wire[5:0] wire_a; //位宽为6位的wire变量wire_a


wire只能被assign连续赋值,reg只能在initial和always中赋值。wire使用在连续赋值语句(表达式右侧的计算结果可以立即更新表达式的左侧)中,而reg使用在过程赋值语句中在过程赋值语句(表达式右侧的计算结果在某种条件的触发下放到一个变量当中,而这个变量可以声明成reg类型的)中,根据触发条件的不同,过程赋值语句可以建模不同的硬件结构:①如果这个条件是时钟的上升沿或下降沿,那么这个硬件模型就是一个触发器;②如果这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器;③如果这个条件是赋值语句右侧任意操作数的变化,那么这个硬件模型就是一个组合逻辑。


wire有两种赋值方式

1.     在定义变量时赋初值,方式是用=。如果之后没有再做赋值,初值会一直保留;如果wire型变量一直不赋值,则wire的默认状态是高阻态,即z。

wire wire_a = 1’b0;

2.     用assign语句赋值,等式右边可以是wire,reg,一个常量或者是逻辑运算

wire wire_b;

wire wire_c;

reg reg_a;

assign wire_b = wire_a;

assign wire_c =reg_a;

 


对reg的使用通常需要有触发条件,依靠输入和敏感列表,在always的block下进行。触发条件可以是时钟信号上升沿。赋值语句可以是=或者 <=。如果是从wire到reg,则形成组合逻辑,如果是从reg到reg,则构成一个寄存器,形成时序逻辑。reg在声明时候不赋初值。未赋值的reg变量处于不定态,即x。

wire wire_a;

wire wire_b;

reg reg_a;

reg reg_b;

always @( posedge clk)

begin

               reg_b =reg_a;

               reg_c  = wire_a | wire_b;

end


 

使用方式

模块的输入输出端口要明确说明,其种类有输入端口(input),输出端口(output),输入输出端口(inout)。

①输入端口可以由wire/reg驱动,输入端口只能是wire;

②输出端口可以使wire/reg类型,输出端口只能驱动wire;若输出端口在过程块中赋值则为reg型,若在过程块外赋值则为net型(wire是net的一种)。

③用关键词inout声明一个双向端口, inout端口不能声明为reg类型,只能是wire类型;输入和双向端口不能声明为寄存器类型。


所以如果模块的输出是reg型的,不要误以为写testbench(测试平台)时也要用一个reg型的数据与模块输出相连,事实上恰好相反,应该用wire型与其相接,编写硬件描述语言要时刻与实际硬件联系起来。testbench为测试或仿真一个verilogHDL程序搭建了一个平台,我们给被测模块施加激励信号,通过观察被测模块的输出响应,判断其逻辑功能和时序关系是否正确。testbench无端口列表,其中激励信号(被测模块的输入信号)定义为reg类型,显示信号(被测模块的输出信号)为wire型。



 简单来说硬件描述语言有两种用途:1、仿真,2、综合对于wire和reg,也要从这两个角度来考虑。
*********************************************************************************
从仿真的角度来说,HDL语言面对的是编译器(如Modelsim等),相当于软件思路。
这时:
wire对应于连续赋值,如assign
reg对应于过程赋值,如always,initial
*********************************************************************************
从综合的角度来说,HDL语言面对的是综合器(如DC等),要从电路的角度来考虑。
这时:
1、wire型的变量综合出来一般是一根导线;
2、reg变量在always块中有三种情况:
①如果这个条件是时钟的上升沿或下降沿,那么这个硬件模型就是一个触发器;

②如果这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器;

③如果这个条件是赋值语句右侧任意操作数的变化,那么这个硬件模型就是一个组合逻辑。

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

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有