1.2.5 D触发器与多路延迟

一、时序电路

1.D触发器

先来看一个最简单的时序电路:

module D1(
input D,
input CLK,
output reg Q
);

always@(posedge CLK)
	begin
		Q <= D;
	end
	
endmodule		

上面描述了一个最简单的边沿触发的D触发器:输入数据D,在下一时钟周期就输出Q。
其中,数据的存储时刻是时钟信号的上升沿(跳变瞬间),即寄存器Q在时钟上升沿采样到数据D,并更新存储内容;
除了时钟上升沿的其他时刻,无论D如何变化,都不会存储到Q寄存器中。只要理解这一点,就明白了数字电路进行时序电路控制的基础。

2.阻塞赋值与非阻塞赋值

在Verilog中,信号有两种赋值方式:
1.非阻塞(Non-Blocking)赋值方式: b <= a
(1)在语句块中,上面语句所赋的变量值不能立即就为下面的语句所用;
(2)块结束后才能完成这次赋值操作,而所赋的变量值是上一次赋值得到的;
(3)在编写可综合的时序逻辑模块时,是最常用的赋值方法。

always@(posedge CLK)
	begin
		b <= a;
		c <= b;
	end

赋值是在always块结束后进行的,c应为原来b的值。实际电路如图:
在这里插入图片描述
2.阻塞(Blocking)赋值方式:b = a
(1)赋值语句执行完后,块才结束;
(2)b的值在赋值语句执行完后立刻改变;
(3)在时序逻辑中使用时,可能会产生意想不到的后果。

always@(posedge CLK)
	begin
		b = a;
		c = b;
	end

赋值是马上执行的,也就是说执行b=a之后,c=b也立即执行,最后c为a的值,即c=a。实际电路如图:
在这里插入图片描述
3.阻塞赋值与非阻塞赋值是Verilog中专门针对电路行为而特殊设计的赋值语句。

1.对于组合电路,信号传递过来是立即生效的,而且生效的值也将继续传递,直到某个寄存器或存储单元终结;
2.对于D触发器而言,对它们中的任何一个赋值,只要不是在触发沿上,都是无效的,而且输出的值也一直保持稳定不变,直到新的时钟沿到来并更新存储的数据。

因此,对于寄存器的赋值应当是非阻塞赋值,因为寄存器采样数据发生在当前模块执行完毕后。
而对于组合电路赋值,应当采用阻塞赋值。

二、数据类型

在Verilog中,根据电路描述的行为特征,定义了两种数据类型:1.线网类型(net type);2.寄存器类型(reg type)

1.线网类型

线网类型主要有两种:1.wire型2.tri型
1.线网类型用于对结构化器件之间的物理连线建模,如:器件的引脚、内部器件(如与非门的输出)等。

由于线网类型代表的是物理连接线,所以它不存储逻辑值,必须由器件驱动,通常由assign进行赋值。若wire型信号没有被驱动时,默认为Z(高阻态)。当信号没有定义数据类型时,默认为wire型。

2.tri类型主要用于定义三态的线网,不可综合,因此只在仿真测试或功能模型中使用。

2.寄存器类型

1.寄存器类型为reg,是数据存储单元的抽象。reg型数据的默认值为x(不定值)
2.reg类型数据常用于表示always模块内的指定信号,常代表触发器在always模块内被赋值的每一个信号都要被定义成reg型
3.对于reg型数据,其赋值语句的作用就如同改变一组触发器的存储单元的值
4.reg型数据可以赋正值,也

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值