在Verilog HDL语言中,时序逻辑电路运用always句子块来完结。例如,完结一个带有异步复位信号的D触发器如下。
例1:带异步复位的D触发器1。
wire Din;
wire clock,rst;
reg Dout;
always @ (posedge clock or negedge rst) //带有异步复位
if(rst == 1’b0) Dout = 1’b0;
else Dout = Din; //D触发器数据输出
在例1中,每逢时钟clock上升沿到来后,输出信号Dout的值便更新为输入信号Din的值。当复位信号下降沿到来时,Dout的值就会变成0。有必要留意的是,在时序逻辑电路中,一般运用非堵塞赋值,即运用“=”。当always块整个完结之后,值才会更新,例如:
例2:带异步复位的D触发器2。
wire Din;
wire clock,rst;
reg Dout;
always @ (posedge clock or negedge rst) //带有异步复位
if(rst == 1’b0) out = 1’b0;
else begin
Dout = Din; //D触发器输出值还处于确定状况
Dout = 1’b1; //D触发器输出值仍然处于确定状况
End //D触发器的输出为1
在例2中,Dout首要被赋值为Din,此刻Dout的值并没有产生改动;接着Dout又被赋值为1,此刻Dout的值仍然没产生改动;直到这个always模块完结,Dout的值才变成最终被赋的值,此例中Dout的值为1。
在时序逻辑电路中,always的时刻操控是沿触发的,能够单个信号也能够多个信号,中心需要用关键字“or”衔接,例如:
always @(posedge clock or posedge reset) begin //由两个沿触发的always块
…
end
其中有一个时钟信号和一个异步复位信号。
always @(posedge clock1 or posedge clock2 or posedge reset) begin
//由3个沿触发的always块
…
end
其中有两个时钟信号和一个异步复位信号。
一般来说,同步时序逻辑电路更安稳,所以主张尽量运用一个时钟触发。