Verilog:锁存器与触发器建模

verilog的行为级建模使用关键词initialalways定义的两种结构类型的语句。一个模块的内部可以包含多个initial和always语句块,仿真的时候,这些语句块同时并行执行,直到仿真结束

initial语句块通常用来描述激励信号,仿真时仅执行一次,课本中没有详细介绍。

always语句本身是一个无限循环语句,即不停地循环执行其中地内容。其语法一般如下

1
2
3
4
5
always @(敏感信号列表)
begin
块内部局部变量的定义
过程赋值语句
end

敏感信号分为两种,电平敏感信号边沿敏感信号

1
always @(D,S)

上面是电平敏感信号,当D或S的电平改变的时候,会执行always块中的内容

而边沿敏感信号分别使用posedgenegedge表示上升沿、下降沿

1
always @(posedge CP,negedge CR)

表示CP信号上升沿或者CR信号下降沿来的时候执行always语句块中的内容

always块内部的赋值语句分为两种:阻塞型和非阻塞型。其中阻塞型使用"=",非阻塞型使用"<="。

阻塞型赋值的多条语句是逐条进行的,而非阻塞型赋值可以理解为是同时进行的。

锁存器和触发器的Verilog建模实例

门控D锁存器

1
2
3
4
5
6
7
8
9
module D_latch(
input D,E,
output reg Q,
output QN
);
assign QN=~Q;
always @(E,D)
if(E) Q<=D;
endmodule

基本D触发器

1
2
3
4
5
6
7
8
module DFF(
output reg Q,
input D,
input CP
);
always @(posedge CP)
Q<=D;
endmodule

带有同步清零功能的D触发器

1
2
3
4
5
6
7
8
module sync_rst_DFF(
output reg Q,
input D,CP,Rd
);
always @(posedge CP)
if(~Rd)Q<=1'b0;
else Q<=D;
endmodule